diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..3114779 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,23 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/python +{ + "name": "Python 3", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "dockerFile": "../docker/Dockerfile", + "runArgs": ["--gpus", "all"], + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "pip3 install --user -r requirements.txt", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.dvc/.gitignore b/.dvc/.gitignore new file mode 100644 index 0000000..528f30c --- /dev/null +++ b/.dvc/.gitignore @@ -0,0 +1,3 @@ +/config.local +/tmp +/cache diff --git a/.dvc/config b/.dvc/config new file mode 100644 index 0000000..08c1a32 --- /dev/null +++ b/.dvc/config @@ -0,0 +1,4 @@ +[core] + remote = openthaigpt +['remote "openthaigpt"'] + url = gs://openthaigpt-pretraining diff --git a/.dvcignore b/.dvcignore new file mode 100644 index 0000000..5197305 --- /dev/null +++ b/.dvcignore @@ -0,0 +1,3 @@ +# Add patterns of files dvc should ignore, which could improve +# the performance. Learn more at +# https://dvc.org/doc/user-guide/dvcignore diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..646630c --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 88 +ignore = N812, E203, W503 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..94f480d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..bcdaddb --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,17 @@ +## Why this PR +Why we need this PR? + +## Changes +- Write some changes here + +## Related Issues +Close # + +## Checklist +- [ ] PR should be in the [Naming convention](../../docs/PR_NAMING.md) +- [ ] Assign yourself in to Assigneees +- [ ] Tag related issues +- [ ] Constants name should be ALL_CAPITAL, function name should be snake_case, and class name should be CamelCase +- [ ] complex function/algorithm should have [Docstring](https://peps.python.org/pep-0257/) +- [ ] 1 PR should not have more than 200 lines changes (Exception for test files). If more than that please open multiple PRs +- [ ] At least PR reviewer must come from the task's team (model, eval, data) diff --git a/.github/workflows/build_docker.yaml b/.github/workflows/build_docker.yaml new file mode 100644 index 0000000..55efe0b --- /dev/null +++ b/.github/workflows/build_docker.yaml @@ -0,0 +1,31 @@ +name: Build docker + +on: + push: + branches: + - "main" + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./docker/Dockerfile + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_NAME }}:latest + ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_NAME }}:${{ github.sha }} + cache-from: type=registry,ref=${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_NAME }}:latest + cache-to: type=inline diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 0000000..c907877 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,45 @@ +name: Linting and Formatting + +on: + pull_request: + branches: + - "main" + push: + branches: + - "main" + +concurrency: + group: linter:${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + lint_and_format: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.9"] # requires python<=3.9 + + steps: + - name: Check out repository + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" # caching pip dependencies + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Run Black + run: | + black --check . + + - name: Run Flake8 + if: ${{ always() }} + run: | + flake8 diff --git a/.github/workflows/test_core.yaml b/.github/workflows/test_core.yaml new file mode 100644 index 0000000..af48ab1 --- /dev/null +++ b/.github/workflows/test_core.yaml @@ -0,0 +1,65 @@ +name: pytest and coverage report for Core + +on: + pull_request: + paths: + - "src/core/**/*.py" + - "tests/core/**/*.py" + + branches: + - "main" + push: + paths: + - "src/core/**/*.py" + - "tests/core/**/*.py" + + branches: + - "main" + +concurrency: + group: test_core:${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + pytest_and_coverage_core: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.9"] # requires python<=3.9 + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" # caching pip dependencies + + - name: Cache pip + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('src/model/pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + pip install -e src/core + + - name: Run Mypy + run: | + mypy ./src/core/openthaigpt_pretraining + + - name: Run pytest with coverage + run: | + pytest --cov-report xml --cov=src/core tests/core/ + + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v3 + with: + flags: unittests + files: ./coverage.xml + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/test_data.yaml b/.github/workflows/test_data.yaml new file mode 100644 index 0000000..8d9d72b --- /dev/null +++ b/.github/workflows/test_data.yaml @@ -0,0 +1,66 @@ +name: pytest and coverage report for Data + +on: + pull_request: + paths: + - "src/data/**/*.py" + - "tests/data/**/*.py" + + branches: + - "main" + push: + paths: + - "src/core/**/*.py" + - "tests/core/**/*.py" + + branches: + - "main" + +concurrency: + group: test_data:${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + pytest_and_coverage_data: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.9"] # requires python<=3.9 + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" # caching pip dependencies + + - name: Cache pip + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('src/model/pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + pip install -e src/core + pip install -e src/data + + - name: Run Mypy + run: | + mypy ./src/data/openthaigpt_pretraining_data + + - name: Generate HTML coverage report + run: | + pytest --cov-report xml --cov=src/data tests/data/ + + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v3 + with: + flags: unittests + files: ./coverage.xml + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/test_evaluation.yaml b/.github/workflows/test_evaluation.yaml new file mode 100644 index 0000000..63a78e7 --- /dev/null +++ b/.github/workflows/test_evaluation.yaml @@ -0,0 +1,74 @@ +name: pytest and coverage report for Evaluation + +on: + pull_request: + paths: + - "src/evaluation/**/*.py" + - "tests/evaluation/**/*.py" + + branches: + - "main" + push: + paths: + - "src/core/**/*.py" + - "tests/core/**/*.py" + + branches: + - "main" + +concurrency: + group: test_evaluation:${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + pytest_and_coverage_evaluation: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.9"] # requires python<=3.9 + + - name: Cache pip + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('src/model/pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-pip- + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" # caching pip dependencies + + - name: Cache pip + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('src/model/pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + pip install -e src/core + pip install -e src/evaluation + + - name: Run Mypy + run: | + mypy ./src/evaluation/openthaigpt_pretraining_evaluation + + - name: Generate HTML coverage report + run: | + pytest --cov-report xml --cov=src/evaluation tests/evaluation/ + + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v3 + with: + flags: unittests + files: ./coverage.xml + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/test_model.yaml b/.github/workflows/test_model.yaml new file mode 100644 index 0000000..172efbd --- /dev/null +++ b/.github/workflows/test_model.yaml @@ -0,0 +1,66 @@ +name: pytest and coverage report for Model + +on: + pull_request: + paths: + - "src/model/**/*.py" + - "tests/model/**/*.py" + + branches: + - "main" + push: + paths: + - "src/core/**/*.py" + - "tests/core/**/*.py" + + branches: + - "main" + +concurrency: + group: test_model:${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + pytest_and_coverage_model: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest] + python-version: ["3.9"] # requires python<=3.9 + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" # caching pip dependencies + + - name: Cache pip + uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('src/model/pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + pip install -e src/core + pip install -e src/model + + - name: Run Mypy + run: | + mypy ./src/model/openthaigpt_pretraining_model + + - name: Generate HTML coverage report + run: | + pytest --cov-report xml --cov=src/model tests/model/ + + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v3 + with: + flags: unittests + files: ./coverage.xml + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e84594 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +*.egg-info +*.pyc +.idea +**/temp +src/data/**/*.sav +src/data/**/*.model +src/data/**/*.vocab +src/data/**/*.bin +src/data/**/full_input* +/.cache +/pythainlp-data +/outputs +/etc/ +/image_sandbox +**/.DS_Store +src/data/scripts/merge_pdf/bcp/* +src/data/openthaigpt_pretraining_data/merge_pdf/test_files* \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..f8f2b83 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,17 @@ +repos: + - repo: https://github.com/psf/black + rev: 22.10.0 + hooks: + - id: black + - repo: https://github.com/PyCQA/flake8 + rev: 6.0.0 + hooks: + - id: flake8 + additional_dependencies: + ["pep8-naming==0.13.3", "flake8-comprehensions==3.12.0"] + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.2.0 + hooks: + - id: mypy + exclude: setup.py + additional_dependencies: ["types-requests"] diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..bfbde3d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "ms-python.black-formatter", + "ms-python.flake8", + "ms-python.python" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7d438b5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "python.analysis.extraPaths": [ + "./src", + "./src/evaluation", + "./src/core", + "./src/data", + "./src/model" + ], + "editor.formatOnSave": true, + "python.formatting.provider": "none", + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "python.linting.enabled": true, + "python.linting.mypyEnabled": true +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e38639a --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +# Pretraining + +## Environment Setup +### Docker +1. Install Docker +``` +curl https://get.docker.com | sh \ + && sudo systemctl --now enable docker +``` +2. Setup Nvidia Repository +``` +distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ + && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ + && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ + sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ + sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list +``` +3. Install Nvidia-Container Toolkit +``` +sudo apt-get update +sudo apt-get install -y nvidia-container-toolkit +sudo nvidia-ctk runtime configure --runtime=docker +sudo systemctl restart docker +``` + +#### Vscode +1. Install [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) +2. `Ctrl + Shift + P` (Windows) or `CMD + Shift + P` (Mac) to open editor commands +3. Select `Dev Containers: Reopen in Container` + +#### Docker Run +- `docker build -t openthai-gpt && docker run --gpus all openthai-gpt ` + +### Slurm + +## Installation + +### Install Core Depedencies + +```bash +pip install -r requirements.txt +pre-commit install +pip install -e ./src/core +``` + +### Install modules you want to work on + +```bash +pip install -e ./src/ +``` + +```bash +pip install -e ./src/data +pip install -e ./src/model +pip install -e ./src/evaluation +``` + +## Testing + +To Run Tests on Development Environment + +```bash +pytest tests/data +pytest tests/model +pytest tests/evaluation +pytest tests/core +``` diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..733cf90 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,13 @@ +FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 +# https://serverfault.com/questions/683605/docker-container-time-timezone-will-not-reflect-changes +ENV TZ America/Los_Angeles +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN apt-get update && apt-get install -y git && pip install -U pip setuptools dvc dvc-gs + +WORKDIR /app +COPY ./src /app +RUN pip install -e ./core +RUN pip install -e ./data +RUN pip install -e ./model +RUN pip install -e ./evaluation diff --git a/docker/dpo/Dockerfile b/docker/dpo/Dockerfile new file mode 100644 index 0000000..c2e3364 --- /dev/null +++ b/docker/dpo/Dockerfile @@ -0,0 +1,28 @@ +FROM huggingface/trl-latest-gpu:latest + +RUN mkdir /workspace +WORKDIR /workspace + +# Create a non-root user and switch to it +RUN adduser --disabled-password --gecos '' --shell /bin/bash user \ + && chown -R user:user /workspace + +USER user +# user can use /home/user as their home directory +ENV HOME=/home/user +RUN chmod 777 /home/user + +COPY requirements.txt /workspace/requirements.txt +WORKDIR /workspace/ + +RUN source activate trl && \ + python3 -m pip install -U --no-build-isolation --no-cache-dir -r requirements.txt + +RUN echo 'export PATH="$PATH:/home/user/.local/bin"' >> ~/.bashrc && \ + echo 'source activate trl' >> ~/.bashrc + +# COPY jupyter_server_config.json /home/user/.jupyter/jupyter_server_config.json + +WORKDIR /workspace + +CMD ["/bin/bash"] diff --git a/docker/dpo/requirements.txt b/docker/dpo/requirements.txt new file mode 100644 index 0000000..9552336 --- /dev/null +++ b/docker/dpo/requirements.txt @@ -0,0 +1,2 @@ +flash-attn==2.4.3.post1 +wandb==0.16.2 diff --git a/docs/PR_NAMING.md b/docs/PR_NAMING.md new file mode 100644 index 0000000..c5a558c --- /dev/null +++ b/docs/PR_NAMING.md @@ -0,0 +1,30 @@ +## PR Naming Convention + +When creating a pull request, please follow this naming convention: + +``` +(module): description +``` + +### Job + +Use one of the following keywords to describe the nature of the changes made in the PR: + +- `feat`: add new features to the code base +- `fix`: fix bugs +- `refactor`: refactor code to make it more user-friendly +- `perf`: optimize code for faster performance +- `build`: modify dependencies (requirements.txt, environments, etc.) + +If there is more than one job, separate them with a comma. For example: `feat(evaluation,model): add GPT-J pipeline`. + +### Module + +Specify which module(s) the changes were made in. Use one or more of the following keywords: + +- `core` +- `model` +- `evaluation` +- `data` + +If there is more than one module, separate them with a comma. For example: `feat,build(model): add flash attention`. \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..f0d0df4 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +# Documents for OpenThaiGPT Pretraining diff --git a/experiment4/002-001-dpo-temp-0_3-v-all-ref.sh b/experiment4/002-001-dpo-temp-0_3-v-all-ref.sh new file mode 100644 index 0000000..a520087 --- /dev/null +++ b/experiment4/002-001-dpo-temp-0_3-v-all-ref.sh @@ -0,0 +1,37 @@ +DATA_DIR=/workspace/data +MODEL_DIR=/workspace/model + +NAME=002-001-dpo-temp-0_3-v-all-ref + +DATA_PATH="$DATA_DIR/training/temp-0_3-v-all-ref.jsonl" +EPOCH=5 +LR=2e-5 # e-5 for full finetune, e-4 for lora +GRADIENT_ACCUMULATION_STEPS=16 +MAX_LEN=4096 +MAX_PROMPT_LEN=2048 +MICRO_BSZ=8 +VAL_SIZE=0.1 +BASE_MODEL="$MODEL_DIR/llama2-7b-finetune-hf" +WANDB_NAME="wandb_name" + +WARMUP_STEPS=0 + + +OUTPUT_PATH="$MODEL_DIR/dpo/$NAME" + +python finetune_dpo_full.py \ + --data_path $DATA_PATH \ + --epoch $EPOCH \ + --eval_steps 2 \ + --gradient_accumulation_steps $GRADIENT_ACCUMULATION_STEPS \ + --gradient_checkpointing \ + --warmup_steps $WARMUP_STEPS \ + --lr $LR \ + --max_len $MAX_LEN \ + --max_prompt_len $MAX_PROMPT_LEN \ + --micro_bsz $MICRO_BSZ \ + --model_path $BASE_MODEL \ + --output_path $OUTPUT_PATH \ + --save_steps 2 \ + --val_size $VAL_SIZE \ + --wandb_name $WANDB_NAME \ No newline at end of file diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..976ba02 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,2 @@ +[mypy] +ignore_missing_imports = True diff --git a/onet/main.py b/onet/main.py new file mode 100644 index 0000000..1cf24eb --- /dev/null +++ b/onet/main.py @@ -0,0 +1,98 @@ +from docxlatex import Document +import json +import re +import os + +# const +docx_folder = "docx" + + +def save_json(data, file_name): + with open(file_name, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False) + + +def remove_emptyline(lst): + return [x for x in lst if x] + + +def is_something_list(lst): + for item in lst: + if item != "": + return True + return False + + +def read_docx(file_name): + docx = Document(file_name) + return docx.get_text() + + +def check_question_format(txt): + pattern = r"^\d+\)" + match = re.match(pattern, txt) + return bool(match) + + +def separate_by_q(txt): + return re.split("\n{5,}", txt) + + +def unwanted_questions(txt): + patterns = [r"IMAGE#\d+-image\d+"] + for pattern in patterns: + if re.findall(pattern, txt): + return True + return False + + +def transform_docx2json(file_name): + doc_txt = read_docx(file_name) + split_by_q = separate_by_q(doc_txt) + remove_empty = list(filter(is_something_list, split_by_q)) + + output = [] + q_no = 1 + + for question_text in remove_empty: + if unwanted_questions(question_text): + continue + + q = question_text.split("\n") + questions = [] + answers = [] + + for x in q: + if check_question_format(x): + answers.append(x) + else: + questions.append(x) + output.append( + { + "no": q_no, + "question": " ".join(questions).strip(), + "answers": answers, + "answer": None, + } + ) + q_no += 1 + + return output + + +def list_files_in_folder(folder_path): + file_list = [] + + for root, dirs, files in os.walk(folder_path): + for file in files: + file_path = os.path.join(root, file) + file_list.append(file_path) + + return file_list + + +file_lst = list_files_in_folder(docx_folder) +for file_name in file_lst: + if ".docx" in file_name: + q_a = transform_docx2json(file_name) + save_json(q_a, f'result-{file_name.split(".")[0]}-result.json') diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..eb99345 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[tool.black] +line-length = 88 +target-version = ['py39'] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9e2ce57 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +pytest-cov +pre-commit +black==22.10.0 +flake8==6.0.0 +pep8-naming==0.13.3 +flake8-comprehensions==3.12.0 +mypy==1.2.0 \ No newline at end of file diff --git a/set_convert/__init__.py b/set_convert/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/set_convert/docx/NOTES.DOC b/set_convert/docx/NOTES.DOC new file mode 100644 index 0000000..dbcb8fe Binary files /dev/null and b/set_convert/docx/NOTES.DOC differ diff --git a/set_convert/docx2md.py b/set_convert/docx2md.py new file mode 100644 index 0000000..827e9d7 --- /dev/null +++ b/set_convert/docx2md.py @@ -0,0 +1,66 @@ +import os +import platform +import shutil + + +def _is_pandoc_existed() -> bool: + from shutil import which + return which('pandoc') is not None + + +def _windows_install(): + if os.system('winget install --source winget --exact --id JohnMacFarlane.Pandoc') != 0: + raise Exception("Failed at installing Pandoc for Windows") + + +def _mac_install(): + if os.system('brew install pandoc') != 0: + raise Exception("Failed at installing Pandoc for MacOS") + + +def _linux_install(): + raise Exception( + "Automatic installation is not yet available for Linux, ", + "please follow instruction on this page to install pandoc", + "https://pandoc.org/installing.html") + + +def _install_pandoc(): + print('Installing Pandoc.....') + sysm = platform.system() + if sysm == 'Windows': + _windows_install() + elif sysm == 'Darwin': + _mac_install() + elif sysm == 'Linux': + _linux_install() + else: + raise Exception("This is an unknown operating system.") + print('Installation Finished!') + + +def _check_prerequisite(): + if not _is_pandoc_existed(): + _install_pandoc() + + +def read_docx_table(input_filename: str, output_filename: str) -> bool: + try: + _check_prerequisite() + os.system(f"pandoc -f docx -t markdown {input_filename} -o {output_filename}") + print("Finished convert docx to md") + except Exception as e: + print(f"[docx2md] Exception happened during read_docx_table: {ex}") + return False + + return True + + +def _example_code(): + docx_path = './docx' + md_path = './md' + + for file_name in os.listdir(docx_path): + input_file = os.path.join(docx_path, file_name) + output_file = os.path.join(md_path, os.path.splitext(file_name)[0] + '.md') + os.system(f'pandoc -f docx -t markdown {input_file} -o {output_file}') diff --git a/set_convert/pdf2md.py b/set_convert/pdf2md.py new file mode 100644 index 0000000..5659b7a --- /dev/null +++ b/set_convert/pdf2md.py @@ -0,0 +1,35 @@ +import os + +import pandas as pd +import tabula + + +def _append_dataframe(dfs): + result = pd.concat(dfs, ignore_index=True) + return result + + +def read_pdf_table_only(input_filename: str, output_filename: str) -> bool: + try: + tables = tabula.read_pdf(input_filename, pages='all') + concat = _append_dataframe(tables) + concat.to_csv(output_filename) + except Exception as ex: + print(f"[pdf2md] Exception happened during read_pdf_table_only: {ex}") + return False + + return True + + +# def read_pdf_table_with_text(input_filename: str, output_filename: str) -> bool: +# try: +# tables = + + +def _example_code(): + pdf_path = './pdf' + md_path = './md' + for file_name in os.listdir(pdf_path): + input_file = os.path.join(pdf_path, file_name) + output_file = os.path.join(md_path, os.path.splitext(file_name)[0] + '.md') + read_pdf_table_only(input_file, output_file) diff --git a/src/core/openthaigpt_pretraining/__init__.py b/src/core/openthaigpt_pretraining/__init__.py new file mode 100644 index 0000000..59d824b --- /dev/null +++ b/src/core/openthaigpt_pretraining/__init__.py @@ -0,0 +1,2 @@ +"""Top-level package for OpenThaiGPT Pretraining.""" +__version__ = "0.1.0" diff --git a/src/core/openthaigpt_pretraining/example.py b/src/core/openthaigpt_pretraining/example.py new file mode 100644 index 0000000..b81257f --- /dev/null +++ b/src/core/openthaigpt_pretraining/example.py @@ -0,0 +1,15 @@ +SQUARE_TEST_CASES = [ + {"x": 1, "y": 1}, + {"x": 2, "y": 4}, + {"x": 3, "y": 9}, + {"x": 4, "y": 16}, + {"x": 5, "y": 25}, +] + +CUBE_TEST_CASES = [ + {"x": 1, "y": 1}, + {"x": 2, "y": 8}, + {"x": 3, "y": 27}, + {"x": 4, "y": 64}, + {"x": 5, "y": 125}, +] diff --git a/src/core/pyproject.toml b/src/core/pyproject.toml new file mode 100644 index 0000000..d3283fb --- /dev/null +++ b/src/core/pyproject.toml @@ -0,0 +1,20 @@ +[build-system] +requires = [ + "setuptools>=40.8.0", + "wheel" +] + +[project] +name = "openthaigpt_pretraining" +version = "0.1.0" +description = "OpenThaiGPT Pretraining Task." +readme = "README.md" +requires-python = ">=3.8" +classifiers = [ + "Programming Language :: Python :: 3", +] +dependencies = [ + "hydra-core", + "dvc >= 3.23.0, <4", + "dvc-gs >=2.22.1, <3" +] \ No newline at end of file diff --git a/src/core/setup.py b/src/core/setup.py new file mode 100644 index 0000000..e2882a0 --- /dev/null +++ b/src/core/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup + +setup( + name="openthaigpt_pretraining", + version="0.1", + packages=["openthaigpt_pretraining"], +) diff --git a/src/data/README.md b/src/data/README.md new file mode 100644 index 0000000..1405946 --- /dev/null +++ b/src/data/README.md @@ -0,0 +1,37 @@ +# OpenThaiGPT Dataset Pipeline Overview + +Folder `openthaigpt_pretraining_data` contains the preprocess function, EDA notebook, and examples for each dataset + +Folder `notebook` contains the EDA or other experiment notebook. + +Folder `scripts` contains the main program which will call function in folder `openthaigpt_pretraining_data` + +## Description + +The OpenThaiGPT Overview dataset pipeline is meticulously designed to fully preprocess raw data, extract essential information, and prepare the dataset in a trainable format. Here's an extended breakdown of its key components: + +## Workflow + +1. Obtain Raw Data in various formats such as CSV, PDF, etc., and convert it into plain text format. In our projects, we have Thai government dataset and we can obtain the raw dataset by webscraping. The pipeline to scrape can be found [here](scripts/crawl_thaigov) +2. Transform plain text data from each raw data source into the JSONL format. + * Internet dataset would be found [here](scripts/internet) + * Pantip2G dataset would be found [here](scripts/pantip_2G) + * Pantip3G dataset would be found [here](scripts/pantip_3G) +3. Consolidate all JSONL datasets into a single file. OSCAR and Pantip are required to merge jsonl. Here is the example of OSCAR and Pantip + * oscar + * oscar22.jsonl + * oscar23.jsonl + * oscar19.jsonl + * oscarall.jsonl + * pantip + * pantip2g.jsonl + * pantip3g.jsonl + * pantipall.jsonl +This pipeline can be found [here](scripts/merge_jsonl) +4. Partition the JSONL dataset into training, validation, and test datasets. This pipeline can be found [here](scripts/split_data )to split the data into train/test/eval +5. Convert jsonl to Huggingface format. This pipline can be found [here](scripts/huggingface_create) +6. Remove duplicate entries from Huggingface datasets through a deduplication process utilizing the N-Gram MinHash approach combined with Locality-Sensitive Hashing. This pipeline can be found [here](scripts/deduplication )to remove duplication entries. +7. Implement Decontamination measures to prevent data leakage from the training dataset into the evaluation dataset, employing N-Gram MinHash and LSH techniques. This pipeline can be found [here](scripts/decontamination) +8. Anonymize Sensitive Data, which may include personal and residential information, in compliance with PDPA regulations. This pipeline can be found [here](scripts/blind_pdpa) + + diff --git a/src/data/notebook/nuch_crawl_thaigov_news.ipynb b/src/data/notebook/nuch_crawl_thaigov_news.ipynb new file mode 100644 index 0000000..cbf1ba0 --- /dev/null +++ b/src/data/notebook/nuch_crawl_thaigov_news.ipynb @@ -0,0 +1,936 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from bs4 import BeautifulSoup\n", + "import requests\n", + "import lxml\n", + "import html5lib\n", + "import re\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def get_soup_by_url(url,verify_boo):\n", + " res = requests.get(url , verify=verify_boo) ### requested url got untrusted SSL certificate, so have to ignore by verify-False\n", + " res.encoding = \"utf-8\"\n", + " print(res)\n", + " if res.status_code == 200:\n", + " # print(\"200 Success\")\n", + " return (True, BeautifulSoup(res.text, \"html.parser\"))\n", + " else:\n", + " print(res.status_code)\n", + " return (False, res.status_code)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def get_soup_dict(soup_in): #soup_in is soup in final url that contains detailed target (aka actual individual news)\n", + " ### Extract body contentx\n", + " soup_in_pbody = soup_in.find_all(\"div\",class_=\"panel-body\")\n", + " cur_pbody = soup_in_pbody[0] \n", + "\n", + " ### Extract desired text\n", + " cur_head = cur_pbody.find(\"div\",class_=\"panel-heading clearfix Circular\")\n", + " cur_hidden = cur_pbody.find(\"p\",class_=\"col-xs-8 remove-xs color7\")\n", + " cur_date = cur_pbody.find(\"div\",class_=\"col-xs-12 col-sm-6 col-md-5 news-2 font_level3 text-right\")\n", + " if cur_date is not None:\n", + " clean_cur_date = cur_date.text.strip()[:cur_date.text.strip().find(\"\\n\")]\n", + " else:\n", + " clean_cur_date = None\n", + " clean_cur_date\n", + " cur_h3 = cur_pbody.h3\n", + " cur_title = cur_pbody.find(\"p\",class_=\"font_level2 Circular color3\")\n", + " cur_detail = cur_pbody.find(\"div\",class_=\"col-xs-12 padding-sm1 news-2 Circular\")\n", + "\n", + " ### Create dict\n", + " cur_content = {'panel_heading': cur_head.text.strip(),\n", + " 'hidden_date': cur_hidden.text.strip(),\n", + " 'date': clean_cur_date,\n", + " 'h3': cur_h3.text.strip(),\n", + " 'title': cur_title.text.strip(),\n", + " 'detail': cur_detail.text.strip() \n", + " }\n", + " \n", + " return cur_content" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "url = \"https://www.thaigov.go.th/news/contents/index/1175\" ## หน้าข่าวทำเนียบรัฐบาล\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/homebrew/lib/python3.11/site-packages/urllib3/connectionpool.py:1095: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.thaigov.go.th'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "### Create df for receiving data\n", + "content_news = pd.DataFrame({\"panel_heading\":[],\n", + " \"url\":[],\n", + " \"hidden_date\":[],\n", + " \"date\":[],\n", + " \"h3\":[],\n", + " \"title\":[],\n", + " \"detail\":[]\n", + " })\n", + "\n", + "soup = get_soup_by_url(url,False)\n", + "error_urls = []\n", + "\n", + "if soup[0] == True:\n", + " soup_pbody = soup[1].find_all(\"div\",class_=\"panel-body\")\n", + " soup_a = soup_pbody[0].find_all(\"a\") ### list all 10 url of news content on each per_page\n", + "\n", + " ### get soup_dict of each url in page\n", + " for a in soup_a:\n", + " soup_in_url = a.get(\"href\")\n", + " soup_in = get_soup_by_url(soup_in_url,False)\n", + " if soup_in[0] == True:\n", + " cur_dict = get_soup_dict(soup_in[1])\n", + " cur_dict[\"url\"] = soup_in_url\n", + " # print(cur_dict)\n", + " content_news.loc[len(content_news)]=cur_dict\n", + " else:\n", + " error_urls.append(url,soup_in[1])\n", + " \n", + " ### get number of max page for page looping\n", + " soup_page = soup[1].find_all(\"ul\",class_=\"pagination color2\")\n", + " soup_page_li = soup_page[0].find_all(\"li\")\n", + " max_page = int(soup_page_li[-1].a['data-ci-pagination-page'])\n", + "\n", + " ### Start looping next page\n", + " url_get_page = \"https://www.thaigov.go.th/news/contents/index/1175?per_page=\"\n", + "\n", + " for i in range(169,max_page+1):\n", + " url_page = url_get_page+str(i*10) ##req per_page is to load 10 contents on each page\n", + " soup = get_soup_by_url(url_page,False)\n", + "\n", + " if soup[0] == True:\n", + " soup_pbody = soup[1].find_all(\"div\",class_=\"panel-body\")\n", + " soup_a = soup_pbody[0].find_all(\"a\") ### list all 10 url of news content on each per_page\n", + "\n", + " ### get soup_dict of each url in page\n", + " for a in soup_a:\n", + " soup_in_url = a.get(\"href\")\n", + " soup_in = get_soup_by_url(soup_in_url,False)\n", + " if soup_in[0] == True:\n", + " cur_dict = get_soup_dict(soup_in[1])\n", + " cur_dict[\"url\"] = soup_in_url\n", + " # print(cur_dict)\n", + " content_news.loc[len(content_news)]=cur_dict\n", + " else:\n", + " error_urls.append(url,soup_in[1])\n", + " else:\n", + " # print(\"URL error: \"+url)\n", + " error_urls.append([url,soup[1]])\n", + "\n", + " \n", + "else:\n", + " # print(\"URL error: \"+url)\n", + " error_urls.append([url,soup[1]])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
panel_headingurlhidden_datedateh3titledetail
0ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันอังคารที่ 18 เมษายน 256612/04/2566เลขาธิการนายกรัฐมนตรี เป็นประธานพิธีทำบุญอาคาร...เลขาธิการนายกรัฐมนตรี เป็นประธานพิธีทำบุญอาคาร...วันนี้ (12 เมษายน 2566) เวลา 10.30 น. ณ บริเวณ...
1ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันศุกร์ที่ 18 พฤศจิกายน 256518/11/2565ภริยานายกรัฐมนตรีนำคณะคู่สมรสผู้นำเขตเศรษฐกิจเ...ภริยานายกรัฐมนตรีนำคณะคู่สมรสผู้นำเขตเศรษฐกิจเ...วันนี้ (18 พ.ย. 65) เวลา 9.30 น. รศ.นราพร จันท...
2ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันเสาร์ที่ 16 กรกฎาคม 256516/07/2565ชี้แจงประเด็นความต่อเนื่องของการประชุมคณะกรรมก...ชี้แจงประเด็นความต่อเนื่องของการประชุมคณะกรรมก...วันที่ 15 กรกฎาคม 2565 นายศุภฤกษ์ ภู่พงศ์ศักดิ...
3ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพฤหัสบดีที่ 30 มิถุนายน 256530/06/2565ศบค. เผย สธ. ติดตามกรณีเชื้อกลายพันธุ์ BA.4 - ...ศบค. เผย สธ. ติดตามกรณีเชื้อกลายพันธุ์ BA.4 - ...วันนี้ (30 มิถุนายน 2565) 12.30 ณ โถงกลาง ตึกส...
4ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันอังคารที่ 14 มิถุนายน 256514/06/2565รัฐบาลเตรียมจัดงานเฉลิมพระเกียรติสมเด็จพระนางเ...รัฐบาลเตรียมจัดงานเฉลิมพระเกียรติสมเด็จพระนางเ...วันที่ 14 มิถุนายน 2565 นายธีรภัทร ประยูรสิทธิ...
5ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันอังคารที่ 24 พฤษภาคม 256524/05/2565เลขาธิการนายกรัฐมนตรีเป็นผู้แทนนายกรัฐมนตรี รั...เลขาธิการนายกรัฐมนตรีเป็นผู้แทนนายกรัฐมนตรี รั...วันนี้ (24 พฤษภาคม 2565) เวลา 14.30 น. ณ ห้องร...
6ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันจันทร์ที่ 23 พฤษภาคม 256523/05/2565รมว.กก.แถลงข่าวต้อนรับ Amazean Jungle Trail By...รมว.กก.แถลงข่าวต้อนรับ Amazean Jungle Trail By...วันที่ 23 พฤษภาคม 2565 เวลา 14.00 น. ณ ศูนย์แถ...
7ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันจันทร์ที่ 23 พฤษภาคม 256523/05/2565รายงานสรุปผลการดำเนินงานที่สำคัญ ของสำนักงานส่...รายงานสรุปผลการดำเนินงานที่สำคัญของสำนักงานส่ง...สำนักงานส่งเสริมวิสาหกิจขนาดกลางและขนาดย่อม ได...
8ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพฤหัสบดีที่ 12 พฤษภาคม 256512/05/2565ผู้ช่วยโฆษก ศบค. ยืนยันการเดินทางในรูปแบบ Thai...ผู้ช่วยโฆษก ศบค. ยืนยันการเดินทางในรูปแบบ Thai...วันนี้ (12 พฤษภาคม 2565) เวลา 12.30 น. ณ โถงกล...
9ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพุธที่ 11 พฤษภาคม 256511/05/2565ปลัดสำนักนายกรัฐมนตรี ให้การต้อนรับเด็กและเยาว...ปลัดสำนักนายกรัฐมนตรี ให้การต้อนรับเด็กและเยาว...วันที่ 11 พ.ค. 65 เวลา 08.45 น. ณ บริเวณสนามหญ...
10ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพุธที่ 24 กรกฎาคม 256224/07/2562นายกรัฐมนตรี เป็นประธานพิธีทางศาสนามหามงคล 5 ศ...รัฐบาลจัดพิธีทางศาสนามหามงคล 5 ศาสนา เพื่อถวาย...วันนี้ (24 กรกฎาคม 2562) เวลา 08.15 น. ณ ตึกภั...
11ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพุธที่ 24 กรกฎาคม 256222/07/2562นายกรัฐมนตรีเป็นประธานพิธีมหามงคลบำเพ็ญพระราชก...นายกรัฐมนตรีเป็นประธานพิธีมหามงคลบำเพ็ญพระราชก...วันนี้ (22 กรกฎาคม 2562) เวลา 17.45 น. ณ พระลา...
12ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันศุกร์ที่ 19 กรกฎาคม 256219/07/2562นายกรัฐมนตรีสั่งด่วนกองทัพสนับสนุนอากาศยาน - ก...นายกรัฐมนตรีสั่งด่วนกองทัพสนับสนุนอากาศยาน - ก...วันนี้ (19 กรกฎาคม 2562) พลเอก ประยุทธ์ จันทร์...
13ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพฤหัสบดีที่ 18 กรกฎาคม 256218/07/2562นายกฯ ห่วงการท่องเที่ยวภูเก็ตและภาพลักษณ์ประเท...นายกรัฐมนตรี เป็นห่วงการท่องเที่ยวภูเก็ตและภาพ...วันนี้ (18 ก.ค.62) พลเอกประยุทธ์ จันทร์โอชา นา...
14ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันจันทร์ที่ 29 กรกฎาคม 256228/07/2562นายกรัฐมนตรีและภริยา ลงนามถวายพระพร พระบาทสมเ...นายกรัฐมนตรีและภริยา ลงนามถวายพระพร พระบาทสมเ...วันนี้ (28 กรกฎาคม 2562) เวลา 09.30 น. พลเอก ป...
15ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันอาทิตย์ที่ 28 กรกฎาคม 256228/07/2562นายกรัฐมนตรีนำข้าราชการ เจ้าหน้าที่รัฐ และพนัก...นายกรัฐมนตรีนำข้าราชการพลเรือน ทหาร ตำรวจ พนัก...วันนี้ (28 กรกฎาคม 2562) เวลา 07.50 น. ณ ท้องส...
16ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพฤหัสบดีที่ 25 กรกฎาคม 256225/07/2562นายกรัฐมนตรี แถลงนโยบายของคณะรัฐมนตรีต่อรัฐสภา...นายกรัฐมนตรีแถลงนโยบายของคณะรัฐมนตรีต่อรัฐสภา ...วันนี้ (25 ก.ค.62) เวลา 09.30 น. ณ หอประชุมใหญ...
17ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพฤหัสบดีที่ 25 กรกฎาคม 256225/07/2562คําแถลงนโยบายของคณะรัฐมนตรี พลเอก ประยุทธ์ จั...พลเอก ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี แถลงนโย...คําแถลงนโยบาย\\r\\nของ\\r\\nคณะรัฐมนตรี\\r\\nพลเอก ป...
18ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพุธที่ 24 กรกฎาคม 256224/07/2562นายกรัฐมนตรีเป็นประธานงานกิจกรรม จิตอาสาพัฒนาส...นายกรัฐมนตรีเป็นประธานงานกิจกรรมจิตอาสาพัฒนาสิ...วันนี้ (24 กรกฎาคม 2562) เวลา 10.30 น. ณ สวนวช...
19ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพฤหัสบดีที่ 18 กรกฎาคม 256218/07/2562นายกรัฐมนตรี ย้ำ ครม.ปฏิบัติหน้าที่ให้ดีที่สุด...พลเอก ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี ย้ำคณะร...วันนี้ (16 ก.ค.62) เวลา 20.45 น. ณ บริเวณโถงกล...
20ข่าวทำเนียบรัฐบาลhttps://www.thaigov.go.th/news/contents/detail...วันพุธที่ 18 มีนาคม 2563Noneนายกฯ เยี่ยมศูนย์บริหารสถานการณ์โควิด-19 ให้กำ...พลเอก ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี เยี่ยมศ...วันนี้ (18 มี.ค.63) เวลา 11.40 น. ภายหลังการตร...
\n", + "
" + ], + "text/plain": [ + " panel_heading url \n", + "0 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \\\n", + "1 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "2 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "3 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "4 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "5 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "6 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "7 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "8 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "9 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "10 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "11 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "12 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "13 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "14 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "15 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "16 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "17 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "18 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "19 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "20 ข่าวทำเนียบรัฐบาล https://www.thaigov.go.th/news/contents/detail... \n", + "\n", + " hidden_date date \n", + "0 วันอังคารที่ 18 เมษายน 2566 12/04/2566 \\\n", + "1 วันศุกร์ที่ 18 พฤศจิกายน 2565 18/11/2565 \n", + "2 วันเสาร์ที่ 16 กรกฎาคม 2565 16/07/2565 \n", + "3 วันพฤหัสบดีที่ 30 มิถุนายน 2565 30/06/2565 \n", + "4 วันอังคารที่ 14 มิถุนายน 2565 14/06/2565 \n", + "5 วันอังคารที่ 24 พฤษภาคม 2565 24/05/2565 \n", + "6 วันจันทร์ที่ 23 พฤษภาคม 2565 23/05/2565 \n", + "7 วันจันทร์ที่ 23 พฤษภาคม 2565 23/05/2565 \n", + "8 วันพฤหัสบดีที่ 12 พฤษภาคม 2565 12/05/2565 \n", + "9 วันพุธที่ 11 พฤษภาคม 2565 11/05/2565 \n", + "10 วันพุธที่ 24 กรกฎาคม 2562 24/07/2562 \n", + "11 วันพุธที่ 24 กรกฎาคม 2562 22/07/2562 \n", + "12 วันศุกร์ที่ 19 กรกฎาคม 2562 19/07/2562 \n", + "13 วันพฤหัสบดีที่ 18 กรกฎาคม 2562 18/07/2562 \n", + "14 วันจันทร์ที่ 29 กรกฎาคม 2562 28/07/2562 \n", + "15 วันอาทิตย์ที่ 28 กรกฎาคม 2562 28/07/2562 \n", + "16 วันพฤหัสบดีที่ 25 กรกฎาคม 2562 25/07/2562 \n", + "17 วันพฤหัสบดีที่ 25 กรกฎาคม 2562 25/07/2562 \n", + "18 วันพุธที่ 24 กรกฎาคม 2562 24/07/2562 \n", + "19 วันพฤหัสบดีที่ 18 กรกฎาคม 2562 18/07/2562 \n", + "20 วันพุธที่ 18 มีนาคม 2563 None \n", + "\n", + " h3 \n", + "0 เลขาธิการนายกรัฐมนตรี เป็นประธานพิธีทำบุญอาคาร... \\\n", + "1 ภริยานายกรัฐมนตรีนำคณะคู่สมรสผู้นำเขตเศรษฐกิจเ... \n", + "2 ชี้แจงประเด็นความต่อเนื่องของการประชุมคณะกรรมก... \n", + "3 ศบค. เผย สธ. ติดตามกรณีเชื้อกลายพันธุ์ BA.4 - ... \n", + "4 รัฐบาลเตรียมจัดงานเฉลิมพระเกียรติสมเด็จพระนางเ... \n", + "5 เลขาธิการนายกรัฐมนตรีเป็นผู้แทนนายกรัฐมนตรี รั... \n", + "6 รมว.กก.แถลงข่าวต้อนรับ Amazean Jungle Trail By... \n", + "7 รายงานสรุปผลการดำเนินงานที่สำคัญ ของสำนักงานส่... \n", + "8 ผู้ช่วยโฆษก ศบค. ยืนยันการเดินทางในรูปแบบ Thai... \n", + "9 ปลัดสำนักนายกรัฐมนตรี ให้การต้อนรับเด็กและเยาว... \n", + "10 นายกรัฐมนตรี เป็นประธานพิธีทางศาสนามหามงคล 5 ศ... \n", + "11 นายกรัฐมนตรีเป็นประธานพิธีมหามงคลบำเพ็ญพระราชก... \n", + "12 นายกรัฐมนตรีสั่งด่วนกองทัพสนับสนุนอากาศยาน - ก... \n", + "13 นายกฯ ห่วงการท่องเที่ยวภูเก็ตและภาพลักษณ์ประเท... \n", + "14 นายกรัฐมนตรีและภริยา ลงนามถวายพระพร พระบาทสมเ... \n", + "15 นายกรัฐมนตรีนำข้าราชการ เจ้าหน้าที่รัฐ และพนัก... \n", + "16 นายกรัฐมนตรี แถลงนโยบายของคณะรัฐมนตรีต่อรัฐสภา... \n", + "17 คําแถลงนโยบายของคณะรัฐมนตรี พลเอก ประยุทธ์ จั... \n", + "18 นายกรัฐมนตรีเป็นประธานงานกิจกรรม จิตอาสาพัฒนาส... \n", + "19 นายกรัฐมนตรี ย้ำ ครม.ปฏิบัติหน้าที่ให้ดีที่สุด... \n", + "20 นายกฯ เยี่ยมศูนย์บริหารสถานการณ์โควิด-19 ให้กำ... \n", + "\n", + " title \n", + "0 เลขาธิการนายกรัฐมนตรี เป็นประธานพิธีทำบุญอาคาร... \\\n", + "1 ภริยานายกรัฐมนตรีนำคณะคู่สมรสผู้นำเขตเศรษฐกิจเ... \n", + "2 ชี้แจงประเด็นความต่อเนื่องของการประชุมคณะกรรมก... \n", + "3 ศบค. เผย สธ. ติดตามกรณีเชื้อกลายพันธุ์ BA.4 - ... \n", + "4 รัฐบาลเตรียมจัดงานเฉลิมพระเกียรติสมเด็จพระนางเ... \n", + "5 เลขาธิการนายกรัฐมนตรีเป็นผู้แทนนายกรัฐมนตรี รั... \n", + "6 รมว.กก.แถลงข่าวต้อนรับ Amazean Jungle Trail By... \n", + "7 รายงานสรุปผลการดำเนินงานที่สำคัญของสำนักงานส่ง... \n", + "8 ผู้ช่วยโฆษก ศบค. ยืนยันการเดินทางในรูปแบบ Thai... \n", + "9 ปลัดสำนักนายกรัฐมนตรี ให้การต้อนรับเด็กและเยาว... \n", + "10 รัฐบาลจัดพิธีทางศาสนามหามงคล 5 ศาสนา เพื่อถวาย... \n", + "11 นายกรัฐมนตรีเป็นประธานพิธีมหามงคลบำเพ็ญพระราชก... \n", + "12 นายกรัฐมนตรีสั่งด่วนกองทัพสนับสนุนอากาศยาน - ก... \n", + "13 นายกรัฐมนตรี เป็นห่วงการท่องเที่ยวภูเก็ตและภาพ... \n", + "14 นายกรัฐมนตรีและภริยา ลงนามถวายพระพร พระบาทสมเ... \n", + "15 นายกรัฐมนตรีนำข้าราชการพลเรือน ทหาร ตำรวจ พนัก... \n", + "16 นายกรัฐมนตรีแถลงนโยบายของคณะรัฐมนตรีต่อรัฐสภา ... \n", + "17 พลเอก ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี แถลงนโย... \n", + "18 นายกรัฐมนตรีเป็นประธานงานกิจกรรมจิตอาสาพัฒนาสิ... \n", + "19 พลเอก ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี ย้ำคณะร... \n", + "20 พลเอก ประยุทธ์ จันทร์โอชา นายกรัฐมนตรี เยี่ยมศ... \n", + "\n", + " detail \n", + "0 วันนี้ (12 เมษายน 2566) เวลา 10.30 น. ณ บริเวณ... \n", + "1 วันนี้ (18 พ.ย. 65) เวลา 9.30 น. รศ.นราพร จันท... \n", + "2 วันที่ 15 กรกฎาคม 2565 นายศุภฤกษ์ ภู่พงศ์ศักดิ... \n", + "3 วันนี้ (30 มิถุนายน 2565) 12.30 ณ โถงกลาง ตึกส... \n", + "4 วันที่ 14 มิถุนายน 2565 นายธีรภัทร ประยูรสิทธิ... \n", + "5 วันนี้ (24 พฤษภาคม 2565) เวลา 14.30 น. ณ ห้องร... \n", + "6 วันที่ 23 พฤษภาคม 2565 เวลา 14.00 น. ณ ศูนย์แถ... \n", + "7 สำนักงานส่งเสริมวิสาหกิจขนาดกลางและขนาดย่อม ได... \n", + "8 วันนี้ (12 พฤษภาคม 2565) เวลา 12.30 น. ณ โถงกล... \n", + "9 วันที่ 11 พ.ค. 65 เวลา 08.45 น. ณ บริเวณสนามหญ... \n", + "10 วันนี้ (24 กรกฎาคม 2562) เวลา 08.15 น. ณ ตึกภั... \n", + "11 วันนี้ (22 กรกฎาคม 2562) เวลา 17.45 น. ณ พระลา... \n", + "12 วันนี้ (19 กรกฎาคม 2562) พลเอก ประยุทธ์ จันทร์... \n", + "13 วันนี้ (18 ก.ค.62) พลเอกประยุทธ์ จันทร์โอชา นา... \n", + "14 วันนี้ (28 กรกฎาคม 2562) เวลา 09.30 น. พลเอก ป... \n", + "15 วันนี้ (28 กรกฎาคม 2562) เวลา 07.50 น. ณ ท้องส... \n", + "16 วันนี้ (25 ก.ค.62) เวลา 09.30 น. ณ หอประชุมใหญ... \n", + "17 คําแถลงนโยบาย\\r\\nของ\\r\\nคณะรัฐมนตรี\\r\\nพลเอก ป... \n", + "18 วันนี้ (24 กรกฎาคม 2562) เวลา 10.30 น. ณ สวนวช... \n", + "19 วันนี้ (16 ก.ค.62) เวลา 20.45 น. ณ บริเวณโถงกล... \n", + "20 วันนี้ (18 มี.ค.63) เวลา 11.40 น. ภายหลังการตร... " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "content_news" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "content_news.to_csv(\"thaigov_news_01.csv\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/data/openthaigpt_pretraining_data/__init__.py b/src/data/openthaigpt_pretraining_data/__init__.py new file mode 100644 index 0000000..9ea7cb8 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/__init__.py @@ -0,0 +1,2 @@ +"""Top-level package for OpenThaiGPT Pretraining Data.""" +__version__ = "0.1.0" diff --git a/src/data/openthaigpt_pretraining_data/blind_pdpa/__init__.py b/src/data/openthaigpt_pretraining_data/blind_pdpa/__init__.py new file mode 100644 index 0000000..fa89ee2 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/blind_pdpa/__init__.py @@ -0,0 +1,20 @@ +from datasets import load_from_disk + +HF_TEXT_LABEL = {"openthaigpt": "text"} + + +def blind_pdpa(dataset_config, blind_config): + hf_dataset = load_from_disk(dataset_config.path_name) + text_col = HF_TEXT_LABEL[dataset_config.key] + + if blind_config.engine == "openthaigpt": + from openthaigpt_pdpa import blind_pdpa_text + + result_data = hf_dataset.map( + lambda doc: {text_col: blind_pdpa_text(doc[text_col])}, + num_proc=blind_config.num_proc, + ) + result_data.save_to_disk(blind_config.save_path) + + else: + raise NotImplementedError("Other Blind PDPA Engine will be supported soon.") diff --git a/src/data/openthaigpt_pretraining_data/core/.gitignore b/src/data/openthaigpt_pretraining_data/core/.gitignore new file mode 100644 index 0000000..319caee --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/core/.gitignore @@ -0,0 +1 @@ +/words_th.txt diff --git a/src/data/openthaigpt_pretraining_data/core/Addtional_data/Additional_datasets_preprocess.py b/src/data/openthaigpt_pretraining_data/core/Addtional_data/Additional_datasets_preprocess.py new file mode 100644 index 0000000..1813d99 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/core/Addtional_data/Additional_datasets_preprocess.py @@ -0,0 +1,340 @@ +from datasets import load_dataset +import pandas as pd +import jsonlines +from tqdm import tqdm +import os +import re + +"""This code block defines several variables +that will be used in the preprocessing of a dataset. +These variables include the dataset name, +target and origin languages, json path, +create and update dates, meta label, text column name, +file path, and folder path. +These variables will be used in the subsequent code blocks to load the dataset, +preprocess the text, and write the preprocessed text to a jsonline file.""" + +DATASET_NAME = "" # dataset name +TARGET_LANGUAGE = "" # target language +ORIGIN_LANGUAGE = "" # origin language +JSONL_PATH = "" # json path +DATASET_CREATE_DATE = "" # create date +DATASET_UPDATE_DATE = "" # update date +META_LABEL = "" # meta label +TEXT_COLUMN = "" # text column name +FILE_PATH = "" # file path +FOLDER_PATH = "" # folder path +NUM_OF_CHAR_THRESHOLD = int() # number of character threshold + +"""Load dataset""" +raw_dataset = load_dataset(DATASET_NAME) + + +def load_pickle(folder_path): + """ + Load a pickle file as a pandas dataframe. + + Args: + - folder_path: str, the path to the folder containing the pickle file. + + Returns: + - pickle_df: pandas dataframe, the loaded pickle file. + """ + pickle_df = pd.read_pickle(folder_path) + return pickle_df + + +def combine_pickle(folder_path): + """ + Combine multiple pickle files into a single pandas dataframe. + + Args: + - FOLDER_PATH: str, the path to the folder containing the pickle files. + + Returns: + - combined_df: pandas dataframe, + the combined pickle files as a single dataframe. + """ + folder_path = FOLDER_PATH + pickle_files = [file for file in os.listdir(folder_path) + if file.endswith(".pkl")] + pickle_df = [] + + for file in pickle_files: + file_path = os.path.join(folder_path, file) + dataframe = pd.read_pickle(file_path) + pickle_df.append(dataframe) + + combined_df = pd.concat(pickle_df, ignore_index=True) + + return combined_df + + +def text_summarize_processing(header, detail, summary=None): + """ + Preprocesses text by summarizing it and concatenating the header, + detail, and summary (if provided). + + Args: + - header: str, the header of the text. + - detail: str, the detail of the text. + - summary: str (optional), the summary of the text. + + Returns: + - compond_text: str, the preprocessed text. + """ + header = header + detail = detail + if summary is None: + compond_text = f"หัวข้อ: {header} + '\n' + เนื้อหา: {detail}" + else: + compond_text = ( + f"หัวข้อ:{header} + '\n' + เนื้อหา:{detail} +'\n' + สรุป:{summary}" + ) + + return compond_text + + +def translate_preprocessing(dataset, orgin_text, target_text): + """ + Preprocesses text by translating it + and concatenating the original and translated text. + + Args: + - dataset: dict, the dataset containing the original and target text. + - orgin_text: str, the original text. + - target_text: str, the target text. + + Returns: + - compond_text: str, the preprocessed text. + """ + orgin_text = dataset[TARGET_LANGUAGE] + target_text = dataset[ORIGIN_LANGUAGE] + compond_text = f"Thai: {orgin_text} + '\n' + English: {target_text}" + + return compond_text + + +def drop_invalid_text_inlist(text_list): + """ + Removes any text in a list that is less than 50 characters long. + + Args: + - text_list: list, the list of text to process. + + Returns: + - text_list: list, the processed list of text. + """ + for index in range(len(text_list)): + if len(text_list[index]) < NUM_OF_CHAR_THRESHOLD: + text_list.pop(index) + + return text_list + + +def drop_invalid_text_df(text_df): + """ + Removes any text in a pandas dataframe that is less than threshold. + + Args: + - text_df: pandas dataframe, the dataframe to process. + + Returns: + - clean_text_df: pandas dataframe, the processed dataframe. + """ + clean_text_df = text_df[text_df[TEXT_COLUMN].str.len() + > NUM_OF_CHAR_THRESHOLD] + clean_text_df = clean_text_df.reset_index(drop=True, inplace=True) + + return clean_text_df + + +def combine_translate(text_list): + """ + Translates a list of text and + sconcatenates the original and translated text. + + Args: + - text_list: list, the list of text to process. + + Returns: + - compond_text: str, the preprocessed text. + """ + compond_text = [] + for index in range(len(text_list)): + text_index = text_list[index] + compond_text = translate_preprocessing( + text_index[ORIGIN_LANGUAGE], text_index[TARGET_LANGUAGE] + ) + compond_text.append(compond_text) + + return compond_text + + +def write_jsonline_with_index(text_list): + """ + Writes a list of text to a jsonl file with an index for each row. + + Args: + - text_list: list, the list of text to write to the jsonl file. + + Returns: + - None + """ + with jsonlines.open(f"{JSONL_PATH}.jsonl", mode="w") as writer: + for index in tqdm(range(len(text_list))): + # Create a dictionary for the row + row_dict = { + "text": text_list[index], + "source": DATASET_NAME, + "source_id": index, + "created_date": DATASET_CREATE_DATE, + "updated_date": DATASET_UPDATE_DATE, + "meta": META_LABEL, + } + # Write the dictionary to the .jsonl file + writer.write(row_dict) + + return None + + +def write_jsonline_with_df(text_df): + """ + Writes a pandas dataframe of text to a jsonl file + with an index for each row. + + Args: + - text_df: pandas dataframe, the dataframe of text + to write to the jsonl file. + + Returns: + - None + """ + with jsonlines.open(f"{JSONL_PATH}.jsonl", mode="w") as writer: + for row, index in tqdm((text_df.iterrows())): + # Create a dictionary for the row + row_dict = { + "text": row[index], + "source": DATASET_NAME, + "source_id": index, + "created_date": DATASET_CREATE_DATE, + "updated_date": DATASET_UPDATE_DATE, + "meta": META_LABEL, + } + # Write the dictionary to the .jsonl file + writer.write(row_dict) + + return None + + +def write_best_corpus(FILE_PATH, enccypedia=False): + """ + Writes the best corpus to a jsonl file. + + Args: + - FILE_PATH: str, the path to the file to write to. + - enccypedia: bool, whether to preprocess the text as an encyclopedia. + + Returns: + - None + """ + with jsonlines.open(f"{FILE_PATH}.jsonl", mode="w") as writer: + for index in os.listdir(f"{FOLDER_PATH}"): + with open(f"{FILE_PATH}" + index, "r") as file: + word = file.read() + + if enccypedia is True: + rows = word.split("\n") + data_list = [row.split("\t") for row in rows] + dataframe = pd.DataFrame( + data_list, columns=[ + "text", + "label", + "label2", + "label3"] + ) + text = dataframe["text"] + word = ( + "".join(["<_>" if item == "" + else item for item in text]) + .replace("<_>", "\n") + .replace("_", " ") + ) + + else: + pass + + word = re.sub(r"[|]", "", word) + word = re.sub( + r"^https?:\/\/.*[\r\n]*", "", word, flags=re.MULTILINE + ) + word = word.replace("", "") + word = word.replace("", "") + word = word.replace("", "") + word = word.replace("", "") + word = word.replace("", "") + word = word.replace("", "") + word = word.replace("\ufeff", "") + + row_dict = { + "text": word, + "source": FOLDER_PATH, + "source_id": index, + "created_date": DATASET_CREATE_DATE, + "updated_date": DATASET_UPDATE_DATE, + "meta": META_LABEL, + } + # Write the dictionary to the .jsonl file + writer.write(row_dict) + + return None + + +def write_lst_corpus(Folder_PATH): + """ + Writes the LST corpus to a jsonl file. + + Args: + - Folder_PATH: str, the path to the folder containing + the files to write to. + + Returns: + - None + """ + with jsonlines.open(f"{Folder_PATH}+{FILE_PATH}.jsonl", + mode="w") as writer: + text_list = [] + + for i in os.listdir(f"{Folder_PATH}"): + with open(f"{Folder_PATH}/" + i, "r") as file: + data_str = file.read() + # Split the string into rows and create a list + rows = data_str.split("\n") + # Split each row into columns and create a list of lists + data_list = [row.split("\t") for row in rows] + # Convert the list of lists to a pandas dataframe + dataframe = pd.DataFrame( + data_list, columns=["text", "label", "label1", "label3"] + ) + text = dataframe["text"] + word = ( + "".join(["<_>" if item == "" else item for item in text]) + .replace("<_>", "\n") + .replace("_", " ") + ) + text_list.append(word) + + for i in tqdm(range(len(text_list))): + # Create a dictionary for the row + row_dict = { + "text": text_list[i], + "source": "LST", + "source_id": i, + "created_date": DATASET_CREATE_DATE, + "updated_date": DATASET_UPDATE_DATE, + "meta": META_LABEL, + } + # Write the dictionary to the .jsonl file + writer.write(row_dict) + + return None diff --git a/src/data/openthaigpt_pretraining_data/core/constants.py b/src/data/openthaigpt_pretraining_data/core/constants.py new file mode 100644 index 0000000..16a8b93 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/core/constants.py @@ -0,0 +1 @@ +MINHASH_SEED = 1 diff --git a/src/data/openthaigpt_pretraining_data/core/metadata.py b/src/data/openthaigpt_pretraining_data/core/metadata.py new file mode 100644 index 0000000..fa8c7e3 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/core/metadata.py @@ -0,0 +1,49 @@ +import os +import git +import __main__ +import json +from typing import Dict, Any + + +def create_info_file(config_dict: Dict[str, Any]) -> None: + + info_dict = { + "source": config_dict["source"], + "current_version": config_dict["version"], + } + json.dump(info_dict, open(f"{config_dict['output_dir']}/info.json", "w")) + + +def create_metadata_file(config_dict: Dict[str, Any], pipeline_name: str): + + metadata_dict = { + "dataset_name": config_dict["source"], + "dataset_version": config_dict["version"], + "dataset_location": config_dict["output_dir"], + "data_scratch_location": config_dict["scratch_location"], + "input_name": config_dict["source"], + "input_version": config_dict["input_version"], + "processing_parameters": config_dict["processing_parameters"], + "pipeline_name": pipeline_name, + "note": config_dict["note"], + } + + metadata_dict["pipeline_location"] = os.path.relpath(__main__.__file__) + metadata_dict["pipeline_commit_hash"] = git.Repo( + search_parent_directories=True + ).head.object.hexsha + + metadata_dict["inputs"] = json.load( + open( + f"{config_dict['input_based_path']}/{metadata_dict['input_version']}/metadata.json", # noqa: E501 + "r", + ) + ) + + json.dump( + metadata_dict, + open( + f"{config_dict['output_dir']}/{metadata_dict['data_version']}/metadata.json", # noqa: E501 + "w", + ), + ) diff --git a/src/data/openthaigpt_pretraining_data/core/minhash.py b/src/data/openthaigpt_pretraining_data/core/minhash.py new file mode 100644 index 0000000..1437c10 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/core/minhash.py @@ -0,0 +1,27 @@ +from openthaigpt_pretraining_data.core.constants import MINHASH_SEED +from nlpo3 import segment +from datasketch import MinHash + +DEFAULT_MINHASH_COL_NAME = "text" +DEFAULT_NUM_PERMUTATION = 128 +N_GRAM = 5 + + +def generate_minhash_signature(text, num_perm): + minhash = MinHash(seed=MINHASH_SEED, num_perm=num_perm) + tokens = segment(text, "newmm") + n_gram = N_GRAM + + for i in range(len(tokens) - n_gram + 1): + token_gram = "".join(tokens[i : i + n_gram]) + + minhash.update(token_gram.encode("utf-8")) + + return minhash + + +def generate_minhash_signature_hf( + doc, num_perm=DEFAULT_NUM_PERMUTATION, col_name=DEFAULT_MINHASH_COL_NAME +): + minhash = generate_minhash_signature(doc[col_name], num_perm) + return {"hashvalues": minhash.hashvalues} diff --git a/src/data/openthaigpt_pretraining_data/core/processing_config.py b/src/data/openthaigpt_pretraining_data/core/processing_config.py new file mode 100644 index 0000000..66ee5e4 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/core/processing_config.py @@ -0,0 +1,42 @@ +import os +import json +from hydra import compose, initialize +from typing import Dict, Any + + +def load_config(config_filename: str) -> Dict[str, Any]: + + config_dict = {} + + initialize("./config", caller_stack_depth=2) + cfg = compose(config_filename) + + config_dict["processing_parameters"] = cfg.processing_parameters + + config_dict["output_dir"] = str(cfg.output.path) + config_dict["scratch_location"] = ( + cfg.output.scratch_path if "scratch_path" in cfg.output else None + ) + + config_dict["input_based_path"] = str(cfg.input_dataset.path) + + info = json.load(open(f"{config_dict['input_based_path']}/info.json", "r")) + config_dict["input_version"] = info["current_version"] + config_dict["source"] = info["source"] + + print(f"Processing {config_dict['source']} dataset") + + if "version" in cfg.output: + version = cfg.output.version + else: + if os.path.exists(f"{config_dict['output_dir']}/info.json"): + info = json.load(open(f"{config_dict['output_dir']}/info.json", "r")) + version = info["current_version"] + 1 + else: + version = 1 + + config_dict["version"] = version + + config_dict["note"] = cfg.note + + return config_dict diff --git a/src/data/openthaigpt_pretraining_data/core/text_normalizer.py b/src/data/openthaigpt_pretraining_data/core/text_normalizer.py new file mode 100644 index 0000000..cc2bebc --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/core/text_normalizer.py @@ -0,0 +1,189 @@ +# Copyright (c) Facebook, Inc. and its affiliates. +# +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. +# + +import re +import unicodedata + +UNICODE_PUNCT = { + ",": ",", + "。": ".", + "、": ",", + "„": '"', + "”": '"', + "“": '"', + "«": '"', + "»": '"', + "1": '"', + "」": '"', + "「": '"', + "《": '"', + "》": '"', + "´": "'", + "∶": ":", + ":": ":", + "?": "?", + "!": "!", + "(": "(", + ")": ")", + ";": ";", + "–": "-", + "—": " - ", + ".": ". ", + "~": "~", + "’": "'", + "…": "...", + "━": "-", + "〈": "<", + "〉": ">", + "【": "[", + "】": "]", + "%": "%", + "►": "-", +} + +UNICODE_PUNCT_RE = re.compile(f"[{''.join(UNICODE_PUNCT.keys())}]") + + +def replace_unicode_punct(text: str) -> str: + return "".join((UNICODE_PUNCT.get(c, c) for c in text)) + + +def remove_unicode_punct(text: str) -> str: + """More aggressive version of replace_unicode_punct but also faster.""" + return UNICODE_PUNCT_RE.sub("", text) + + +def strip_accents(line: str) -> str: + """Strips accents from a piece of text.""" + nfd = unicodedata.normalize("NFD", line) + output = [c for c in nfd if unicodedata.category(c) != "Mn"] + if len(output) == line: + return line + return "".join(output) + + +# Build a regex matching all control characters. +NON_PRINTING_CHARS_RE = re.compile( + f"[{''.join(map(chr, list(range(0,32)) + list(range(127,160))))}]" +) +DIGIT_RE = re.compile(r"\d") +PUNCT_OR_NON_PRINTING_CHARS_RE = re.compile( + (UNICODE_PUNCT_RE.pattern + NON_PRINTING_CHARS_RE.pattern).replace("][", "") +) + + +def remove_non_printing_char(text: str) -> str: + return NON_PRINTING_CHARS_RE.sub("", text) + + +def normalize_spacing_for_tok(text: str, language: str = "en") -> str: + res = ( + text.replace("\r", "") + # remove extra spaces + .replace("(", " (") + .replace(")", ") ") + .replace(" +", " ") + ) + res = re.sub(r"\) ([\.\!\:\?\;\,])", r"\)\1", res) + res = res.replace("( ", "(").replace(" )", ")") + res = re.sub(r"(\d) \%", r"\1\%", res) + res = res.replace(" :", ":").replace(" ;", ";") + res = res.replace("`", "'").replace("''", ' " ') + + res = ( + res.replace("„", '"') + .replace("“", '"') + .replace("”", '"') + .replace("–", "-") + .replace("—", " - ") + .replace(" +", " ") + .replace("´", "'") + .replace("([a-z])‘([a-z])", r"\1'\2/") + .replace("([a-z])’([a-z])", r"\1'\2/") + .replace("‘", '"') + .replace("‚", '"') + .replace("’", '"') + .replace("''", '"') + .replace("´´", '"') + .replace("…", "...") + # French quotes + .replace(" « ", ' "') + .replace("« ", '"') + .replace("«", '"') + .replace(" » ", '" ') + .replace(" »", '"') + .replace("»", '"') + # handle pseudo-spaces + .replace(" %", "%") + .replace("nº ", "nº ") + .replace(" :", ":") + .replace(" ºC", " ºC") + .replace(" cm", " cm") + .replace(" ?", "?") + .replace(" !", "!") + .replace(" ;", ";") + .replace(", ", ", ") + .replace(" +", " ") + .replace(".", ". ") + ) + # English "quotation," followed by comma, style + if language == "en": + res = re.sub(r"\"([,\.]+)", r"\1\"", res) + # Czech is confused + elif language == "cs" or language == "cz": + pass + # German/Spanish/French "quotation", followed by comma, style + else: + res = res.replace(',"', '",') + res = re.sub( + r"(\.+)\"(\s*[^<])", r"\"\1\2", res + ) # don't fix period at end of sentence + + if ( + language == "de" + or language == "es" + or language == "cz" + or language == "cs" + or language == "fr" + ): + res = re.sub(r"(\d) (\d)", r"\1,\2", res) + else: + res = re.sub(r"(\d) (\d)", r"\1.\2", res) + return res + + +def normalize(line: str, accent=True, case=True, numbers=True, punct=1) -> str: + line = line.strip() + if not line: + return line + if case: + line = line.lower() + if accent: + line = strip_accents(line) + if numbers: + line = DIGIT_RE.sub("0", line) + if punct == 1: + line = replace_unicode_punct(line) + elif punct == 2: + line = remove_unicode_punct(line) + line = remove_non_printing_char(line) + return line + + +def slow_normalize_for_dedup(line: str) -> str: + return normalize(line, accent=False, case=True, numbers=True, punct=2) + + +def normalize_for_dedup(line: str) -> str: + line = line.strip() + if not line: + return line + # case + line = line.lower() + # numbers + line = DIGIT_RE.sub("0", line) + line = PUNCT_OR_NON_PRINTING_CHARS_RE.sub("", line) + return line diff --git a/src/data/openthaigpt_pretraining_data/core/words_th.txt.dvc b/src/data/openthaigpt_pretraining_data/core/words_th.txt.dvc new file mode 100644 index 0000000..ecdc64e --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/core/words_th.txt.dvc @@ -0,0 +1,4 @@ +outs: +- md5: 5e204421eac2c839910b19f9fbbfdd5e + size: 1519221 + path: words_th.txt diff --git a/src/data/openthaigpt_pretraining_data/decontamination/decontamintate.py b/src/data/openthaigpt_pretraining_data/decontamination/decontamintate.py new file mode 100644 index 0000000..8cf3b4d --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/decontamination/decontamintate.py @@ -0,0 +1,120 @@ +import pickle + +import numpy as np +from tqdm.auto import tqdm +from datasets import load_from_disk, Features, Sequence, Value +from datasketch import MinHashLSH, LeanMinHash +import pandas as pd + +from openthaigpt_pretraining_data.core.constants import MINHASH_SEED +from openthaigpt_pretraining_data.core.minhash import generate_minhash_signature +from openthaigpt_pretraining_data.decontamination.utils import ( + load_data, +) + + +def query_func(item, idx, index): + neighbors = [ + str(dup_idx) + for dup_idx in index.query( + LeanMinHash(seed=MINHASH_SEED, hashvalues=item["hashvalues"]), + ) + ] + return {"__neighbors__": neighbors, "idx": idx} + + +def decontaminate( + dataset_groups, pretrain_data_args, decontaminate_args, global_config +): + num_perm = global_config.num_perm + empty_hashvalues = generate_minhash_signature("", num_perm).hashvalues + pretrain_dataset = load_data(pretrain_data_args) + pretrain_dataset_minhash = load_from_disk(decontaminate_args.minhash_path) + + contaminated_results = [] + for dataset_key in tqdm(dataset_groups.keys()): + print(dataset_key) + + dataset_arg = dataset_groups[dataset_key] + + signature_path = ( + f"./temp/{dataset_key}_{dataset_arg.split}_signature_{num_perm}.pickle" + ) + file_path = f"./temp/{dataset_key}_{dataset_arg.split}_file_{num_perm}.pickle" + + with open(file_path, "rb") as file: + data = pickle.load(file) + + with open(signature_path, "rb") as file: + signature = pickle.load(file) + + globals()[dataset_key] = MinHashLSH( + threshold=decontaminate_args.thresold, + num_perm=num_perm, + ) + with globals()[dataset_key].insertion_session() as session: + for i, item in enumerate(signature): + session.insert(i, item) + + pretrain_dataset_minhash_result = pretrain_dataset_minhash.map( + lambda doc, idx: query_func(doc, idx, index=globals()[dataset_key]), + desc="Querying...", + num_proc=global_config.num_process, + features=Features( + { + **pretrain_dataset_minhash.features, + "__neighbors__": Sequence(Value("string")), + "idx": Value("int32"), + } + ), + load_from_cache_file=False, + with_indices=True, + ).filter( + lambda x: len(x["__neighbors__"]) > 0 + and not np.array_equal(x["hashvalues"], empty_hashvalues), + desc="Filtering...", + num_proc=global_config.num_process, + ) + print(pretrain_dataset_minhash_result, "pretrain_dataset_minhash_result") + + for doc in tqdm( + pretrain_dataset_minhash_result, desc="Calculation Jaccard Distance..." + ): + neighbors = set(doc["__neighbors__"]) + minhash = LeanMinHash(seed=MINHASH_SEED, hashvalues=doc["hashvalues"]) + for neighbor in neighbors: + reference = data[int(neighbor)] + reference_signature = signature[int(neighbor)] + score = minhash.jaccard(reference_signature) + if score > decontaminate_args.thresold: + contaminated_results.append( + { + "duplicate_id": neighbor, + "duplicate_text": reference, + "duplicate_dataset": dataset_key, + "original_dataset": doc["source"], + "original_text": doc[pretrain_data_args.col_name], + "original_id": doc["idx"], + "score": score, + } + ) + break + print(len(contaminated_results), "len(contaminated_results)") + + df = pd.DataFrame(contaminated_results) + df.to_csv(f"contaminated_results_{num_perm}.csv") + + original_ids_to_remove = set() + for item in contaminated_results: + original_ids_to_remove.add(item["original_id"]) + + pretrain_dataset[pretrain_data_args.split] = pretrain_dataset[ + pretrain_data_args.split + ].filter( + lambda _, idx: idx not in original_ids_to_remove, + desc="Filtering...", + num_proc=global_config.num_process, + with_indices=True, + ) + print(pretrain_dataset) + pretrain_dataset.save_to_disk(decontaminate_args.save_path) diff --git a/src/data/openthaigpt_pretraining_data/decontamination/generate_minhash.py b/src/data/openthaigpt_pretraining_data/decontamination/generate_minhash.py new file mode 100644 index 0000000..b50fcf7 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/decontamination/generate_minhash.py @@ -0,0 +1,62 @@ +from openthaigpt_pretraining_data.core.minhash import ( + generate_minhash_signature, + generate_minhash_signature_hf, +) +from openthaigpt_pretraining_data.decontamination.utils import ( + MAPPER, + load_data, +) +from tqdm.auto import tqdm + +import pickle +from multiprocessing import Pool +from nlpo3 import load_dict + + +def generate_minhash_item(item): + text, num_perm = item + return generate_minhash_signature(text, num_perm) + + +def generate_minhash(dataset_groups, pretrain_data_args, minhash_config, global_config): + load_dict(minhash_config.newmm_dict, "newmm") + + for dataset_key in dataset_groups.keys(): + dataset_arg = dataset_groups[dataset_key] + dataset = load_data(dataset_arg) + dataset1 = [ + MAPPER[dataset_key](item) for item in dataset[dataset_arg.split].to_list() + ] + dataset1 = list(set(dataset1)) + dataset1_map = [(item, global_config.num_perm) for item in dataset1] + + print(dataset1[:5], dataset_key) + + with Pool(processes=global_config.num_process) as pool: + signatures = list( + tqdm( + pool.imap(generate_minhash_item, dataset1_map), + total=len(dataset1_map), + desc="Processing dataset", + ) + ) + signature_path = f"./temp/{dataset_key}_{dataset_arg.split}_signature_{global_config.num_perm}.pickle" # noqa: E501 + file_path = f"./temp/{dataset_key}_{dataset_arg.split}_file_{global_config.num_perm}.pickle" # noqa: E501 + + with open(signature_path, "wb") as file: + pickle.dump(signatures, file) + with open(file_path, "wb") as file: + pickle.dump(dataset1, file) + + pretrain_dataset = load_data(pretrain_data_args) + + dataset1 = pretrain_dataset[pretrain_data_args.split] + signatures = dataset1.map( + lambda x: generate_minhash_signature_hf( + x, global_config.num_perm, pretrain_data_args.col_name + ), + num_proc=global_config.num_process, + ) + signatures.save_to_disk( + minhash_config.save_path, num_proc=global_config.num_process + ) diff --git a/src/data/openthaigpt_pretraining_data/decontamination/utils.py b/src/data/openthaigpt_pretraining_data/decontamination/utils.py new file mode 100644 index 0000000..296579f --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/decontamination/utils.py @@ -0,0 +1,84 @@ +from datasets import load_dataset, load_from_disk + +import re + + +def load_data(dataset_arg): + if dataset_arg.name == "LST20" or dataset_arg.name == "LST20_Test": + dataset = load_dataset( + dataset_arg.path_name, dataset_arg.subset, data_dir=dataset_arg.path + ) + elif dataset_arg.available_on_hub: + dataset = load_dataset(dataset_arg.path_name, dataset_arg.subset) + else: + dataset = load_from_disk(dataset_arg.path_name) + return dataset + + +def preprocess_hellaswag(text): + text = text.strip() + # NOTE: Brackets are artifacts of the WikiHow dataset portion of HellaSwag. + text = text.replace(" [title]", ". ") + text = re.sub("\\[.*?\\]", "", text) + text = text.replace(" ", " ") + return text + + +def generate_query_hellaswag(doc): + """Modified from https://github.com/EleutherAI/lm-evaluation-harness/blob/9d06c95346ff393273bbb80379267eef094c0c74/lm_eval/tasks/hellaswag.py""" # noqa: E501 + ctx = ( + doc["ctx_a_th"] + " " + "" + if doc["ctx_b_th"] is None + else doc["ctx_b_th"].capitalize() + ) + return (preprocess_hellaswag(doc["activity_label_th"] + ": " + ctx),) + + +def generate_query_xquad(doc): + """Reference from https://github.com/EleutherAI/lm-evaluation-harness/blob/4c08d72acdf7c6f5cab5d708e8ef400aea08314c/lm_eval/tasks/squad.py""" # noqa: E501 + return doc["context"] + + +def generate_query_thaisum(doc): + return doc["body"] + + +def generate_query_multirc_thai(doc): + return doc["paragraph_TH"] + + +def generate_query_copa_thai(doc): + label = doc["label"] + answer = doc["choice1_th"] if label == 1 else doc["choice2_th"] + return f'{doc["premise_th"]} f{answer}' + + +def generate_query_rte_thai(doc): + return doc["premise"] + " " + doc["hypothesis"] + + +def generate_query_lst20(doc): + return "".join(doc["tokens"]).replace("_", " ") + + +def generate_query_record_thai(doc): + return doc["passage_TH"] + + +def generate_query_ted_th_en(doc): + return doc["translation"]["th"] + " " + doc["translation"]["en"] + + +MAPPER = { + "hellaswag_thai": generate_query_hellaswag, + "xquad": generate_query_xquad, + "thaisum": generate_query_thaisum, + "thaisum_test": generate_query_thaisum, + "multirc_thai": generate_query_multirc_thai, + "copa_thai": generate_query_copa_thai, + "rte_thai": generate_query_rte_thai, + "lst20": generate_query_lst20, + "lst20_test": generate_query_lst20, + "record_thai": generate_query_record_thai, + "ted_talks_iwslt_th_en": generate_query_ted_th_en, +} diff --git a/src/data/openthaigpt_pretraining_data/deduplication/deduplication.py b/src/data/openthaigpt_pretraining_data/deduplication/deduplication.py new file mode 100644 index 0000000..2cb8c58 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/deduplication/deduplication.py @@ -0,0 +1,160 @@ +import numpy as np +from tqdm.auto import tqdm +from datasets import load_from_disk, Features, Sequence, Value +from datasketch import MinHashLSH, LeanMinHash + +from openthaigpt_pretraining_data.core.constants import MINHASH_SEED +from openthaigpt_pretraining_data.core.minhash import generate_minhash_signature + + +def query_func(item, idx, index): + neighbors = [ + str(dup_idx) + for dup_idx in index.query( + LeanMinHash(seed=MINHASH_SEED, hashvalues=item["hashvalues"]), + ) + if dup_idx != idx + ] + return {"__neighbors__": neighbors, "idx": idx} + + +def process_data(batch, idx, pretrain_dataset_minhash, thresold): + duplicate_results = [] + hashvalues = batch["hashvalues"] + for j in range(len(idx)): + key = idx[j] + doc_hash_value = hashvalues[j] + + minhash = LeanMinHash(seed=MINHASH_SEED, hashvalues=doc_hash_value) + neighbors = set(batch["__neighbors__"][j]) + + for neighbor in neighbors: + if neighbor == key: + continue + reference = pretrain_dataset_minhash[int(neighbor)] + reference_signature = LeanMinHash( + seed=MINHASH_SEED, hashvalues=reference["hashvalues"] + ) + score = minhash.jaccard(reference_signature) + if score > thresold: + duplicate_results.append( + { + "duplicate_id": neighbor, + "duplicate_text": reference["text"], + "duplicate_dataset": reference["source"], + "original_dataset": batch["source"][j], + "original_text": batch["text"][j], + "original_id": str(key), + "score": score, + } + ) + break + + dict_of_lists = {} + + for dictionary in duplicate_results: + for key, value in dictionary.items(): + if key not in dict_of_lists: + dict_of_lists[key] = [] + + dict_of_lists[key].append(value) + + return dict_of_lists + + +def deduplicate(pretrain_data_args, deduplicate_args, global_config): + pretrain_dataset = load_from_disk(pretrain_data_args.path_name) + pretrain_dataset_minhash = load_from_disk(deduplicate_args.minhash_path) + + print(pretrain_dataset_minhash, "pretrain_dataset_minhash") + + empty_hashvalues = generate_minhash_signature("", global_config.num_perm).hashvalues + + globals()["minhash_index"] = MinHashLSH( + threshold=deduplicate_args.thresold, + num_perm=global_config.num_perm, + ) + with globals()["minhash_index"].insertion_session() as session: + for i in tqdm( + range(0, len(pretrain_dataset_minhash), deduplicate_args.batch_size), + dynamic_ncols=True, + desc="Iterating MinHashes...", # noqa: E501 + ): + batch = pretrain_dataset_minhash[i : i + deduplicate_args.batch_size] + for j, hash_value in enumerate(batch["hashvalues"]): + key = i + j + session.insert( + key, LeanMinHash(seed=MINHASH_SEED, hashvalues=hash_value) + ) + + pretrain_dataset_minhash_result = pretrain_dataset_minhash.map( + lambda doc, idx: query_func(doc, idx, index=globals()["minhash_index"]), + desc="Querying...", + num_proc=global_config.num_process, + features=Features( + { + **pretrain_dataset_minhash.features, + "__neighbors__": Sequence(Value("string")), + "idx": Value("int32"), + } + ), + load_from_cache_file=False, + with_indices=True, + ).filter( + lambda x: len(x["__neighbors__"]) > 0 + and not np.array_equal(x["hashvalues"], empty_hashvalues), + desc="Filtering...", + num_proc=global_config.num_process, + ) + + print(pretrain_dataset_minhash_result, "pretrain_dataset_minhash_result") + + duplicate_results = pretrain_dataset_minhash_result.map( + lambda batch, idx: process_data( + batch, idx, pretrain_dataset_minhash, deduplicate_args.thresold + ), + batched=True, + with_indices=True, + num_proc=global_config.num_process, + remove_columns=pretrain_dataset_minhash_result.column_names, + load_from_cache_file=False, + features=Features( + { + "duplicate_id": Value("int32"), + "duplicate_text": Value("string"), + "duplicate_dataset": Value("string"), + "original_dataset": Value("string"), + "original_text": Value("string"), + "original_id": Value("string"), + "score": Value("float32"), + } + ), + ) + + print(duplicate_results, "duplicate_results") + + duplicate_results.save_to_disk(deduplicate_args.save_path_duplicated) + + original_ids_to_remove = set() + + for i in tqdm( + range(0, len(duplicate_results), deduplicate_args.batch_size), + dynamic_ncols=True, + desc="Collecting index to remove...", # noqa: E501 + ): + batch = duplicate_results[i : i + deduplicate_args.batch_size] + for idx in batch["original_id"]: + original_ids_to_remove.add(idx) + + pretrain_dataset[pretrain_data_args.split] = pretrain_dataset[ + pretrain_data_args.split + ].filter( + lambda _, idx: str(idx) not in original_ids_to_remove, + desc="Filtering...", + num_proc=global_config.num_process, + with_indices=True, + ) + + print(pretrain_dataset, "pretrain_dataset") + + pretrain_dataset.save_to_disk(deduplicate_args.save_path) diff --git a/src/data/openthaigpt_pretraining_data/deduplication/generate_minhash.py b/src/data/openthaigpt_pretraining_data/deduplication/generate_minhash.py new file mode 100644 index 0000000..c5d1e60 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/deduplication/generate_minhash.py @@ -0,0 +1,20 @@ +from openthaigpt_pretraining_data.core.minhash import generate_minhash_signature_hf + +from datasets import load_from_disk + +from nlpo3 import load_dict + + +def generate_minhash(pretrain_data_args, minhash_config, global_config): + load_dict(minhash_config.newmm_dict, "newmm") + + pretrain_dataset = load_from_disk(pretrain_data_args.path_name) + + dataset1 = pretrain_dataset[pretrain_data_args.split] + signatures = dataset1.map( + lambda x: generate_minhash_signature_hf(x, global_config.num_perm), + num_proc=global_config.num_process, + ) + signatures.save_to_disk( + minhash_config.save_path, num_proc=global_config.num_process + ) diff --git a/src/data/openthaigpt_pretraining_data/example.py b/src/data/openthaigpt_pretraining_data/example.py new file mode 100644 index 0000000..b81257f --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/example.py @@ -0,0 +1,15 @@ +SQUARE_TEST_CASES = [ + {"x": 1, "y": 1}, + {"x": 2, "y": 4}, + {"x": 3, "y": 9}, + {"x": 4, "y": 16}, + {"x": 5, "y": 25}, +] + +CUBE_TEST_CASES = [ + {"x": 1, "y": 1}, + {"x": 2, "y": 8}, + {"x": 3, "y": 27}, + {"x": 4, "y": 64}, + {"x": 5, "y": 125}, +] diff --git a/src/data/openthaigpt_pretraining_data/internet/README.md b/src/data/openthaigpt_pretraining_data/internet/README.md new file mode 100644 index 0000000..2a9807e --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/README.md @@ -0,0 +1,9 @@ +# Internet data pre-processing + +This folder contains functions, patterns and constants to process the crawled data including mc4, cc100, and OSCAR. + +It contains the code use in step 2-5 of **_How does the code work ?_** section in `src/data/scripts/internet/README.md` + +- For the studies of mc4 and OSCAR in step 2, please follow the subfolder `mc4` and `oscar` respectively. + +- For the detail of perplexity code in steps 3-5, go to the `perplexity` subfolder. diff --git a/src/data/openthaigpt_pretraining_data/internet/cleaning/cleaning.py b/src/data/openthaigpt_pretraining_data/internet/cleaning/cleaning.py new file mode 100644 index 0000000..386fee4 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/cleaning/cleaning.py @@ -0,0 +1,147 @@ +from typing import Union, List # type: ignore +import re # type: ignore + +from .constants import ( + TEXT_DATASET_KEY, + NEWLINE_CHARACTER, + COOKIE_KEYWORD, + SPECAIL_CHARACTER_PATTERN, + SPECAIL_CHARACTER_RATIO, + WHITE_SPACE_RATIO, + MIN_LINE_RATIO, + MINIMUM_LENGTH, + MIN_WORD_LENGTH, + N_LINE, +) + + +def filter_short_texts(min_length: int = MINIMUM_LENGTH): + """ + Description: + Use map with huggingface dataset for filter short texts. + Args: + - min_length: minimun lenght of text for filter. + """ + + def filter(sample): + return len(sample[TEXT_DATASET_KEY]) >= min_length + + return filter + + +def filter_keywords(keywords: Union[str, List[str]] = COOKIE_KEYWORD): + """ + Description: + Use map with huggingface dataset for filter text with have keywords. + Args: + - keywords: string or list of string which is the keyword that you want to delete. + """ # noqa + if isinstance(keywords, str): + keywords = [keywords] + + def filter(sample): + for keyword in keywords: + if keyword in sample[TEXT_DATASET_KEY]: + return False + return True + + return filter + + +def clean_no_meaningful( + min_length: int = MIN_WORD_LENGTH, + min_line_ratio: float = MIN_LINE_RATIO, + white_space_ratio: float = WHITE_SPACE_RATIO, + special_character_ratio: float = SPECAIL_CHARACTER_RATIO, + special_character_pattern: str = SPECAIL_CHARACTER_PATTERN, +): + """ + Description: + Clean no meaningful sentence of document by check. + - ratio between lenght space and lenght document. + - ratio between lenght special charactor and lenght document. + - ratio between lenght line after remove shot word and lenght full line. + Args: + - min_lenght: minimum of lenght word. + - min_line_ratio: ratio between line after remove shot word and lenght full line that want to remove. + - white_space_ratio: ratio between space charactor and total charactor that want to remove. + - special_charactor_ratio: ratio between special charactor and total charactor that want to remove. + - special_charactor_pattern: regex pattern for special charactor. + """ # noqa + + def get_ratio(text, total_length, pattern): + """ + Calculate ratio between lenght text and lenght charactor in pattern. + """ + return len(re.findall(pattern, text)) / total_length + + def get_line_ratio(line, pattern): + """ + Calculate ratio between lenght line after remove shot word and lenght full line + """ + sub_result = [] + sub_lines = re.split(pattern, line) + if len("".join(sub_lines)) == 0: + return 0.0 + for sub_line in sub_lines: + if len(sub_line) > min_length: + sub_result.append(sub_line) + return len("".join(sub_result)) / len("".join(sub_lines)) + + def cleaner(sample): + text = sample[TEXT_DATASET_KEY] + total_lenght = len(text) + + # Check white space + if get_ratio(text, total_lenght, " ") >= white_space_ratio: + return {TEXT_DATASET_KEY: ""} + # Check special charactor + if ( + get_ratio(text, total_lenght, special_character_pattern) + >= special_character_ratio + ): + return {TEXT_DATASET_KEY: ""} + + # Check short word + lines = text.split("\n") + result = [] + for line in lines: + if ( + get_line_ratio(line, special_character_pattern) > min_line_ratio + and get_line_ratio(line, " ") > min_line_ratio + ): + result.append(line) + + return {TEXT_DATASET_KEY: NEWLINE_CHARACTER.join(result)} + + return cleaner + + +def dedup_n_lines(n_lines: int = N_LINE): + """ + Description: + Deduplicate by check from n lines + Args: + - n_lines: number of line for check deduplicate + """ + hash_history = [] + + def dedup(sample): + lines = sample[TEXT_DATASET_KEY].split(NEWLINE_CHARACTER) + + if len(lines) < n_lines: + return {TEXT_DATASET_KEY: sample[TEXT_DATASET_KEY]} + + return_document = lines.copy() + for i in range(len(lines) - n_lines + 1): + current_lines = lines[i : i + n_lines] + hash_line = hash("\n".join(current_lines)) + if hash_line not in hash_history: + hash_history.append(hash_line) + else: + for line in current_lines: + if line in return_document: + return_document.remove(line) + return {TEXT_DATASET_KEY: NEWLINE_CHARACTER.join(return_document)} + + return dedup diff --git a/src/data/openthaigpt_pretraining_data/internet/cleaning/constants.py b/src/data/openthaigpt_pretraining_data/internet/cleaning/constants.py new file mode 100644 index 0000000..27a0289 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/cleaning/constants.py @@ -0,0 +1,20 @@ +TEXT_DATASET_KEY = "text" +NEWLINE_CHARACTER = "\n" +COOKIE_KEYWORD = [ + "ใช้งานคุกกี้", + "ใช้คุกกี้", + "เว็บไซต์นี้ใช้คุกกี้", + "นโยบายคุกกี้", + "ตั้งค่าคุกกี้", + "เทคโนโลยีคุกกี้", + "คุกกี้บนเว็บไซต์", + "ยินยอมให้เราเก็บคุกกี้ทั้งหมด", + "นโยบายเกี่ยวกับคุกกี้", +] +SPECAIL_CHARACTER_PATTERN = r"""[!@#$%^&*()_+={}\[\]:;"\'<>,.?/\|\\`~]""" +WHITE_SPACE_RATIO = 0.1 +SPECAIL_CHARACTER_RATIO = 0.05 +MINIMUM_LENGTH = 128 +N_LINE = 3 +MIN_WORD_LENGTH = 30 +MIN_LINE_RATIO = 0.3 diff --git a/src/data/openthaigpt_pretraining_data/internet/mc4/README.md b/src/data/openthaigpt_pretraining_data/internet/mc4/README.md new file mode 100644 index 0000000..d0b12a3 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/mc4/README.md @@ -0,0 +1,56 @@ +# mc4 preprocessing code + +This folder contains codes and regex patterns which are the result from the study of mc4 dataset. + +The regex patterns are compiled in `pattern.py` and import to use in `preprocess.py` + +## How does the code work ? + +1. Check the garbage keywords and patterns in each text. If the count of patterns are above the thresholds, the text will be removed. + +| Patterns | Count Thresholds | +| ------------- |:-------------:| +| Too large row (Larger than 1500 characters) | 2 | +| Invalid characters (͹) |25| +| Missing tone marks row |25| +| Gamble keywords |2| +| Football team names |4| +| Ads keywords |4| +| Sale keywords* |3| +| URL that usually related to sales keyword |1| +| Renting keywords* |2| +| Json-like patterns |20| +| Programming code |10| +| Thai specific spam keywords (Ex. ครีมฟอกสี, ยาลดน้ำหนัก) |4| +| Ghost language (Ex. เธฅเธฐ) |4| +| Hex code |25| + +*This patterns will be skipped if the text contains the appropriate sales/renting patterns. + +3. If the text is not removed by step 1, less severe patterns will be check and remove partially. + +| Patterns | +|----------------------------------| +| Pagination | +| Some HTML tag | +| Special unicode characters | +| Email | +| URL | +| Hashtag | +| Webboard special characters («») | +| Menu bar | +| Markup | +| IP Address | +| Telephone number | +| Date indicator text ("เผยแพร่เมื่อ", "ประกาศเมื่อ") | +| Other spam ("แก้ไขครั้งสุดท้ายโดย", "แจ้งลิงก์เสีย") | + +## Running + +The code is imported in `src/data/scripts/internet` and you can use it together with OSCAR code there. + +This code is not meant to be run directly. If you want to run with your custom logic please create folder in `src/data/scripts` and import the function you want. + +## Note + +- The keywords and patterns are from an observation and experiments on the sample of mc4 dataset. diff --git a/src/data/openthaigpt_pretraining_data/internet/mc4/pattern.py b/src/data/openthaigpt_pretraining_data/internet/mc4/pattern.py new file mode 100644 index 0000000..551b024 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/mc4/pattern.py @@ -0,0 +1,398 @@ +# coding: utf-8 +# flake8: noqa +import re + +#### Gamble Clean Words +GAMBLE_WORDS = [ + "พนัน", + "แทงบอล", + "แทง", + "บาคารา", + "บา คา รา", + "เกมพนัน", + "คาสิโน", + "คา สิ โน", + "หวย", + "สล็อต", + "กาสิโน", + "casino", + "slot", + "เลขเด็ด", + "สูตรหวย", + "a s i n o", + "sbobet", + "fun88", + "ufabet", + "บาคาร่า", + "บา คา ร่า", + "รูเล็ต", + "ทำนายฝัน", + "เลขเด่น", + "สรุปผลบอล", + "ไฮไลท์ฟุตบอล", + "วิเคราะห์บอล", + "ดูบอลสด", + "พรีเมียร์ลีก", + "บอลประจำวัน", + "บอลเต็ง", + "บอลเด็ด", + "องค์ลงรวย", + "สูตรปลาตะเพียน", + "สามตัวตรง", + "วิเคราะห์ข้อมูลล่าง", + "ต่อ ครึ่งลูก", + "ครึ่งลูกลบ", + "เสมอควบครึ่ง", + "ครึ่งควบลูก", +] + +#### Sale Clean Words +SALE_SKIP_WORDS = [ + "สอบราคา", + "จัดซื้อจัดจ้าง", + "ชมรม", + "สมาคม", + "นักลงทุน", + "นักการตลาด", + "ของกลาง", + "การลงทุน", + "นักวิเคราะห์", + "ขายให้แก่ประชาชน", + "การลดต้นทุน", + "การเสนอราคา", + "กระทรวง", + "ตลาดหลักทรัพย์", + "ยอดขายไม่ดี", + "ยอดขายไม่ค่อยดี", + "ผู้ประกอบการธุรกิจ", + "ออกใบอนุญาต", + "ผู้ประกอบกิจการ", +] +SALE_URL_WORDS = [ + "alibaba.com", + "shopee.co.th", + "lazada.com", + "DocPlayer.net", + "Alibaba", + "AliExpress", + "Aliexpress", + "TripAdvisor", + "jobbkk.com", +] +SALE_WORDS = [ + "ขาย", + "ซ่อม", + "ราคา", + "มือสอง", + "เช่า", + "ครีม", + "ฝ้ากระ", + "จุดด่างดำ", + "รับส่วนลด", + "โปรโมชั่น", + "กวดวิชา", + "ติวเตอร์", + "SEO", + "คอร์สเรียน SEO", + "จำหน่าย", + "ทัวร์", + "สินค้ามาใหม่", + "สินค้าทั้งหมด", + "รีวิวสินค้า", + "เคสกันกระแทก", + "ประกาศ", + "ลงขายของ", + "เลือกขนาด", + "บริการจัดส่ง", + "จัดอันดับ", + "คาราโอเกะ", + "จำหน่าย", + "หาเงินออนไลน์", + "สั่งซื้อ", + "ลดกระหนำ่", + "รหัส", + "ลงประกาศฟรี", + "หยิบใส่ตะกร้า", + "สนใจ", + "ซื้อ", + "สินค้า", + "ผลิตภัณฑ์", +] + +#### Rent Clean Words +RENT_SKIP_WORDS = [ + "สอบราคา", + "จัดซื้อจัดจ้าง", + "ชมรม", + "สมาคม", + "นักลงทุน", + "นักการตลาด", + "ของกลาง", + "การลงทุน", + "นักวิเคราะห์", + "ขายให้แก่ประชาชน", + "การลดต้นทุน", + "การเสนอราคา", + "กระทรวง", + "ตลาดหลักทรัพย์", +] +RENT_WORDS = [ + "บ้านมือสอง", + "ให้เช่า", + "เช่า", + "บ้านเดี่ยว", + "อพาร์ทเม้นท์", + "อสังหาริมทรัพย์", + "เพนท์เฮ้าส์", + "ทาวน์เฮ้าส์", +] + +#### Script Clean Words +SCRIPT_WORDS = [ + "function", + "var", + "click", + "margin", + "width", + "height", + "return", + "else", + "alert", + "
", + "href", +] + +#### Garbage Clean Words +GARBAGE_WORDS = [ + "โหงวเฮ้ง", + "ครีมฟอกสี", + "ครีมผิวขาว", + "ฟอกสี", + "ไวท์เทนนิ่งครีม", + "ครีมไวท์เทนนิ่ง", + "ครีมลบฝ้ากระ", + "รับสร้างบ้าน", + "ครีมโรคสะเก็ดเงิน", + "บริการจองตั๋ว", + "บริการรีดผ้า", + "อาหารเสริมลดน้ำหนัก", + "ยาลดน้ำหนัก", + "ลดไขมัน", + "ผิงโซดา", + "สร้างบ้าน", + "ช่างกุญแจ", + "ช่างโลหะ", + "ช่างโยธา", + "ช่างเครื่องยนต์", + "ช่างไม้", + "ช่างกลโรงงาน", + "ช่างไฟฟ้า", + "ปรสิต", + "หนอน", + "เวิร์ม", +] + +#### Football teams +FOOTBALL_TEAMS = [ + "ยูเวนตุส", + "อินเตอร์ มิลาน", + "นาโปลี", + "เอซี มิลาน", + "ลาซิโอ", + "โรม่า", + "กัลโซ่", + "เซเรีย", + "ปาร์ม่า", + "เอฟเวอร์ตัน", + "ซันเดอร์แลนด์", + "ลิเวอร์พูล", + "แมนเชสเตอร์", + "นิวคาสเซิล", + "เชลซี", + "อาร์เซนอล", + "คลิสตัลพาเลช", + "เซาแทมป์ตัน", + "เซาแธมป์ตัน", + "เชฟฟิลด์", + "ฟอเรสต์", + "เบอร์ตัน", + "เบรนท์ฟอร์ด", + "ฟูแล่ม", + "ไฮไลท์ฟุตบอล", + "เลบันเต้", + "บาร์เซโลน่า", + "เรอัล มาดริด", + "เอสปันญ่อล", +] + +#### Hotels Advertising +HOTEL_AD = [ + "โรงแรมอันดับ", + "ที่พักแบบพิเศษอันดับ", + "สถานที่พักอันดับ", + "สถานที่พักคุ้มค่าอันดับ", + "โรงแรมใกล้กับ", + "โรงแรมที่ใกล้", + "โรงแรม 4 ดาว", + "โรงแรม 3 ดาว", + "ที่พักพร้อมอาหารเช้า", + "โรงแรมราคาถูก", + "โรงแรมหรู", +] + +######### +# PRE-COMPILE REGEX to object for speed up processing. +######### +# ----------------------------------------------------- +# Remove useless row that make overhead in regex processing + +# Unusual row - line size too large +# if there are 3 large lines ( 500 characters each) +TOOLARGE_LINE_PATTERN = ".{1500}" +TOOLARGE_RE = re.compile(TOOLARGE_LINE_PATTERN, re.MULTILINE) + +NONECHAR_PATTERN = "๮|๞|๨|๡|๷|๻|๫|͹" +NONECHAR_RE = re.compile(NONECHAR_PATTERN, re.MULTILINE) + +NONE_TONE_MARK_PATTERN = "ก าหนด|เป าหมาย|พ ฒนา|ค ณภาพ|ว จ ย|ค ณล กษณะ|ต างๆ|เป น |ให |บร หาร|ปร บปร ง|ใหม|อย าง|เง น" +NONE_TONE_MARK_RE = re.compile(NONE_TONE_MARK_PATTERN, re.MULTILINE) + +# ----------------------------------------------------- + +GAMBLE_PATTERN = "|".join(GAMBLE_WORDS) +GAMBLE_RE = re.compile(GAMBLE_PATTERN, re.MULTILINE) + +FOOTBALL_PATTERN = "|".join(FOOTBALL_TEAMS) +FOOTBALL_RE = re.compile(FOOTBALL_PATTERN, re.MULTILINE) + +HOTEL_AD_PATTERN = "|".join(HOTEL_AD) +HOTEL_AD_RE = re.compile(HOTEL_AD_PATTERN, re.MULTILINE) + +SALE_URL_PATTERN = "|".join(SALE_URL_WORDS) +SALE_URL_RE = re.compile(SALE_URL_PATTERN, re.MULTILINE) +SALE_SKIP_PATTERN = "|".join(SALE_SKIP_WORDS) +SALE_SKIP_RE = re.compile(SALE_SKIP_PATTERN, re.MULTILINE) +SALE_PATTERN = "|".join(SALE_WORDS) +SALE_RE = re.compile(SALE_PATTERN, re.MULTILINE) + +RENT_SKIP_PATTERN = "|".join(RENT_SKIP_WORDS) +RENT_SKIP_RE = re.compile(RENT_SKIP_PATTERN, re.MULTILINE) +RENT_PATTERN = "|".join(RENT_WORDS) +RENT_RE = re.compile(RENT_PATTERN, re.MULTILINE) + +JSON_PATTERN = r"\s*\"(?:\w)*\"\s*:" +JSON_RE = re.compile(JSON_PATTERN, re.MULTILINE) + +SCRIPT_PATTERN = r"\b" + "|".join(SCRIPT_WORDS) + r"\b" +SCRIPT_RE = re.compile(SCRIPT_PATTERN, re.MULTILINE) + +GARBAGE_PATTERN = "|".join(GARBAGE_WORDS) +GARBAGE_RE = re.compile(GARBAGE_PATTERN, re.MULTILINE) + +GHOST_PATTERN = "เธฃเน|เธเธญ|เธเน|เธฐเธ|เธฅเธฐ|เธซเธฒ|เธญเธฒ|เธดเธ|เธตเธข|เธญเน|เธญเธ|เธดเน|เธฑเธ|เธกเน|เธฒเธ|เธชเน|เน€เธ" +GHOST_RE = re.compile(GHOST_PATTERN, re.MULTILINE) + +HEX_PATTERN = "(?>)?|<<(?:[ ]\d{0,6}[ ]\-[ ]\d{0,6})+[ ].{0,100}" +PAGE_RE = re.compile(PAGE_PATTERN, re.MULTILINE) + +EMBEDDED_SERVER_PATTERN = "<%[ ]*[^%]*%>|<%.*" +EMBEDDED_SERVER_RE = re.compile(EMBEDDED_SERVER_PATTERN, re.MULTILINE) + +U_PATTERN = "\uFEFF|\u00AD|[\u200A-\u200F]|\uFFFD|[\uE000-\uF8FF]|[\u202A-\u202C]|\u0092|[\u0091-\u0096]|\u2028|\u2066|\u2069|\u008d|\u0081|\u008E|" +U_RE = re.compile(U_PATTERN, re.MULTILINE) + +BLOCK_PATTERN = "(?:\[[^\]]*\])|(?:«[^»]*»)|(?:<<([^>]*)>>)" +BLOCK_RE = re.compile(BLOCK_PATTERN, re.MULTILINE) + +EMAIL_PATTERN = "(?:(?:([Ee]?mail|อีเมล์)[ ]{0,2}:?[ ]{0,5})?)[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" +EMAIL_RE = re.compile(EMAIL_PATTERN, re.MULTILINE) + +URL_PATTERN = r"\b(?:(?:https?|ftp)://[^\s/$\.\?#].[^\s]*)\b|\b(?:www\.?)?(?:(?:[\w-]*)\.)*(?:com|net|org|info|biz|me|io|co|asia|xyz|th|cn|in|uk|jp|ru)\b" +URL_RE = re.compile(URL_PATTERN, re.MULTILINE) + +MENU1_PATTERN = "\|(?:[^\|\n]*\|)+.*" +MENU1_RE = re.compile(MENU1_PATTERN, re.MULTILINE) + +MENU2_PATTERN = "\|(?:[^\|\n]*\|)+" +MENU2_RE = re.compile(MENU2_PATTERN, re.MULTILINE) + +MENU3_PATTERN = "(?:(?:[^/\n]*/){4,}.*)" +MENU3_RE = re.compile(MENU3_PATTERN, re.MULTILINE) + +MENU4_PATTERN = "^[^\n]{0,20}[ ]{0,2}[>»\\\\].*" +MENU4_RE = re.compile(MENU4_PATTERN, re.MULTILINE) + +HASHTAG_PATTERN = "#\d*[ ].{0,300}|#(?:(?:[^ \n]*)[ ]?)+|Tag Archives[ ]{0,2}:.{0,300}|Posts Tagged[ ]{0,2}:.{0,300}|HASTAG[ ]{0,2}:.{0,300}|Tag[s]?[ ]{0,2}:.{0,300}|Tagged[ ].{0,300}" +HASHTAG_RE = re.compile(HASHTAG_PATTERN, re.MULTILINE) + +SIDEBAR_PATTERN = ".{0,40}(?:(?:\[|\()\d{0,9}(?:\]|\))(?:[ ]{0,2})?,?)" +SIDEBAR_RE = re.compile(SIDEBAR_PATTERN, re.MULTILINE) + +MARKUP_PATTERN = "\{\{[^\}]*\}\}|\{\{.*" +MARKUP_RE = re.compile(MARKUP_PATTERN, re.MULTILINE) + +IFRAME_PATTERN = "\s*|?| |{\s*document\..*|SELECT.*FROM.*WHERE.*| bool: + # ---- Clean too large unused lines + # Limit matches list to 2 items only, enough + matches = TOOLARGE_RE.findall(text)[:2] + # Classify as toolarge row if number of matches = 2 + if len(matches) == 2: + return True + + # ---- Clean none characters row + # Limit matches list to 25 items + matches = NONECHAR_RE.findall(text)[:25] + # Classify as none character row if number of matches = 25 + if len(matches) == 25: + return True + + # ---- Clean none tone mark row + # Limit matches list to 25 items + matches = NONE_TONE_MARK_RE.findall(text)[:25] + # Classify as none tone mark row if number of matches = 25 + if len(matches) == 25: + return True + + # ---- Clean Gamble ~ 9.2% of mC4 data + # if found gamble word 2 times in a row, classify as gamble row + # remove the row + # Limit matches list to 2 items only, enough + matches = GAMBLE_RE.findall(text)[:2] + # Classify as gamble if number of matches = 2 + if len(matches) == 2: + return True + + # ---- Clean Football data + # if found gamble word 4 times in a row, classify as football data + # remove the row + # Limit matches list to 4 items only + matches = FOOTBALL_RE.findall(text)[:4] + if len(matches) == 4: + return True + + # ---- Clean Hotel Advertising + # if found hotel word 4 times in a row, classify as Hotel Ad. data + # remove the row + # Limit matches list to 4 items only, enough + matches = HOTEL_AD_RE.findall(text)[:4] + if len(matches) == 4: + return True + + # ---- Clean Sale ~26% of mC4 data + # Sale row data is diverse, + # so the regex is not used in this case. + # Rules: + # 1. Remove row if it contains common specific Sale's URL + # 2. Skip to next clean rule if it contains specific keywords, eg. "สอบราคา", "จัดซื้อจัดจ้าง, etc." + # 3. If not found keywords in (2) then scan the row with sale keywords, if there are at leat 3 sale kewords found then remove the row. + + if SALE_URL_RE.search(text): + return True + + if not SALE_SKIP_RE.search(text): + # Classify as Sale data ( 3 matches, can be adjusted) + matches = SALE_RE.findall(text)[:3] + if len(matches) == 3: + return True + + # ---- Clean Rent (พวกเช่า ~2% of mC4 data) + # Rent use another rules + # 1. find skip words in the row. If found, skip to next rule (not remove) + # 2. if found rent word 2 times in a row, classify as rent row + # remove the row + + if not RENT_SKIP_RE.search(text): + # Limit matches list to 2 items only, enough + matches = RENT_RE.findall(text)[:2] + if len(matches) == 2: + return True + + # ---- Clean pattern (json like -> "abc": ~.5-1% ) + # 99% can classify as gabage: so remove them + # match n items to make sure they are garbages n=20, can change + matches = JSON_RE.findall(text)[:20] + # if match only 20+, classify as garbage + if len(matches) == 20: + return True + + # ---- Clean script (Javascript, etc. ~.5% ) + # 99% can classify as gabage: so remove them + matches = SCRIPT_RE.findall(text)[:10] + # Classify as script if number of matches = 10 + if len(matches) == 10: + return True + + # ---- Clean garbage (useless or not necessary ~.45%) + # classify as gabage: so remove them + matches = GARBAGE_RE.findall(text)[:4] + # Classify as garbage if number of matches = 4 + if len(matches) == 4: + return True + + # ---- Clean ghost language (~0.008% can cancel this clean) + # classify as ghost : so remove them + matches = GHOST_RE.findall(text)[:4] + # Classify as ghost if number of matches = 4 + if len(matches) == 4: + return True + + # ---- Clean HEX code + # classify as HEX : so remove them + matches = HEX_RE.findall(text)[:25] + # Classify as HEX if number of matches = 25 + if len(matches) == 25: + return True + + return False + + +def clean_text(text: str) -> str: + text = PAGE_RE.sub(" ", text) + text = EMBEDDED_SERVER_RE.sub(" ", text) + text = U_RE.sub(" ", text) + text = EMAIL_RE.sub(" ", text) + text = URL_RE.sub(" ", text) + text = MENU1_RE.sub(" ", text) + text = MENU2_RE.sub(" ", text) + text = MENU3_RE.sub(" ", text) + text = MENU4_RE.sub(" ", text) + text = SIDEBAR_RE.sub(" ", text) + text = BLOCK_RE.sub(" ", text) + text = HASHTAG_RE.sub(" ", text) + text = MARKUP_RE.sub(" ", text) + text = IFRAME_RE.sub(" ", text) + text = IP_RE.sub(" ", text) + text = TEL_RE.sub(" ", text) + text = DATE1_RE.sub(" ", text) + text = DATE2_RE.sub(" ", text) + text = HTML_RE.sub(" ", text) + + # --- Refinements (in sequence) + text = REFINE1_RE.sub(" ", text) + text = REFINE2_RE.sub(" ", text) + text = REFINE3_RE.sub(" ", text) + text = REFINE4_RE.sub(" ", text) + text = REFINE5_RE.sub(" ", text) + text = REFINE6_RE.sub(" ", text) + text = REFINE7_RE.sub(" ", text) + text = REFINE8_RE.sub(" ", text) + text = REFINE9_RE.sub(" ", text) + text = REFINE10_RE.sub(" ", text) + text = REFINE11_RE.sub(" ", text) + text = REFINE12_RE.sub(" ", text) + text = REFINE13_RE.sub(" ", text) + text = REFINE14_RE.sub(" ", text) + + # Split the text into lines and remove any empty lines + lines = [line for line in text.split("\n") if line] + + # Initialize the list with the first line + deduplicated_list = [lines[0]] + + # Iterate over the rest of the lines + for i in range(1, len(lines)): + # Find the common prefix between this line and the previous line + common_prefix = "" + for char1, char2 in zip(lines[i], lines[i - 1]): + if char1 == char2: + common_prefix += char1 + else: + break + + # Remove the common prefix from this line and add it to the list + deduplicated_list.append(lines[i][len(common_prefix) :]) + + text = "\n".join(deduplicated_list) + + # Clean short lines + # ( len(line) <= 30 characters , cut this line off) + text = "\n".join(line for line in text.split("\n") if len(line) > 30) + + # ---- The scan row that passes all filter is written to disk + # before write to disk, get rid of spaces by change them to single space (' '). + + text = re.sub("[ ]+", " ", text, 0, re.MULTILINE) + text = re.sub("^[ ]", "", text, 0, re.MULTILINE) + text = re.sub(r"\n\s*", "\n", text, 0, re.MULTILINE) + + return text + + +def clean_dataset(dataset: List[Dict[str, str]]) -> List[Dict[str, str]]: + """ + Description : Call function clean_text to process the whole dataset. + Input text : An input dataset having each element as a document in the dataset. + Output : A clean dataset. + """ + + for i, data_point in enumerate(dataset): + cleaned_text = clean_text(data_point["text"]) + if cleaned_text != dataset[i]["text"]: + dataset[i]["text"] = cleaned_text + dataset[i]["updated_date"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + return [data_point for data_point in dataset if data_point["text"] != ""] diff --git a/src/data/openthaigpt_pretraining_data/internet/oscar/README.md b/src/data/openthaigpt_pretraining_data/internet/oscar/README.md new file mode 100644 index 0000000..2678aaa --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/oscar/README.md @@ -0,0 +1,49 @@ +# OSCAR preprocessing code + +This folder contains codes and regex patterns which are the result from the study of OSCAR dataset (2019, 2021, 2022, 2023). + +The regex patterns are compiled in `keywords.py` and import to use in `preprocess.py` + +The `notebook` folder contains the experiment, observation and EDA notebooks for OSCAR. + +## How does the code work ? + +1. Check the garbage keywords in each text. If the text contains any of keywords, remove the text. + +| Keywords | +|--------------------------| +| Pornography | +| Gamble | +| Spam movie website | +| Spam like ads | +| Some programming code | +| Some webboard keywords | + +2. If the text is not removed by step 1, Check the less garbage keywords in each text. If the ratio of the keywords length and the text length are above the thresholds, remove the text + +| Keywords | Thresholds | +|----------------------------------------|------------| +| Thai month names | 0.015 | +| Some programming code related symbol | 0.075 | +| Space | 0.13 | +| Comma | 0.05 | +| Thai character | 0.5 | + +3. If the text is not removed by step 1 and 2, less severe patterns will be check and remove partially. + +| Patterns | +|-------------------------------------| +| Webboard special characters («») | +| Webboard specific keywords | +| Browser related keywords ("cookie setting") | +| Other spam ("นโยบายความเป็นส่วนตัว", "หัวข้อ:") | + +## Running + +The code is imported in `src/data/scripts/internet` and you can use it together with mc4 code there. + +This code is not meant to be run directly. If you want to run with your custom logic please create folder in `src/data/scripts` and import the function you want. + +## Note + +- The keywords and patterns are from an observation on the sample of each OSCAR dataset. diff --git a/src/data/openthaigpt_pretraining_data/internet/oscar/keywords.py b/src/data/openthaigpt_pretraining_data/internet/oscar/keywords.py new file mode 100644 index 0000000..d7fd101 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/oscar/keywords.py @@ -0,0 +1,214 @@ +# flake8: noqa + + +def sorted_by_len(keyword_list): + len_keywords = [[len(kw), kw] for kw in keyword_list] + + return [kw for _, kw in sorted(len_keywords)][::-1] + + +PORN_KEYWORDS = [ + "คลิปหลุด", + "กระเจี๊ยว", + "คลิปโป๊", + "หนังโป๊", + "หนังโป้", + "หนังโป็", + "เรื่องเสียว", + "ซอยหี", + "ชักว่าว", + "ท่าหมา", + "ขย่มควย", + "เล่นเสียว", + "ควยใหญ่", + "หนังเอ็กซ์", + "แหกหี", + "เย็ด", +] +GAMBLE_KEYWORDS = [ + "ufabet", + "UFABET", + "ล้มโต๊ะ", + "เซียนสเต็ป", + "บอลเต็ง", + "แทงบอล", + "คาสิโน", + "บาคาร่า", + "เว็บสล็อต", + "เกมสล็อต", + "สล็อตออนไลน์", + "คาสิโนออนไลน์", + "หวยมาเลย์", + "หวยฮานอย", + "น้ำเต้าปูปลา", + "หวยออนไลน์", + "แทงหวย", + "หวยหุ้น", + "ยิงปลาออนไลน์", + "ได้เงินจริง", + "บา คา ร่า", +] +SPAM_MOVIE_KEYWORDS = [ + "ดูหนังออนไลน์", + "หนังออนไลน์", + "เว็บดูหนัง", + "หนังชนโรง", + "หนังใหม่ชนโรง", + "เสียงไทย", + "เสียงญี่ปุ่น", + "เสียงอังกฤษ", +] +SPAM_LIKE_KEYWORDS = [ + "ปั้มไลค์", + "รับจ้างกดไลค์", + "จ้างไลค์", + "ปั๊มไลค์", + "ปั่นไลค์", + "เพิ่มไลค์", + "ซื้อไลค์", +] +CODE_KEYWORDS = [ + "padding:", + "display:", + "S3=n8", + "phpBB Debug", + "getElementById", + "innerHTML", + "parseInt", + "addEventListener", + "console\.log", + "checkCookieForTarget", + "setAttribute", + "getItem", + "if \(", + "else {", + "JSON\.stringify", + "onclick", +] + +WEBBOARD_KEYWORDS = [ + "คุณกำลังใช้งานแบบปิดการใช้ Javascript", + "Longdo Dictionary", + "นโยบายการคุ้มครองข้อมูลส่วนบุคคล", + "เงื่อนไขการให้บริการเว็บไซต์", + "นโยบายความปลอดภัย", + "นโยบายเว็บไซต์และการปฏิเสธความรับผิด", + "คุณอาจจะยังไม่ได้เข้าสู่ระบบหรือยังไม่ได้ลงทะเบียน", + "คุณไม่ได้เข้าสู่ระบบหรือคุณไม่มีสิทธิ์เข้าหน้านี้", +] + +PORN_KEYWORDS += [" ".join(list(kw)) for kw in PORN_KEYWORDS] +GAMBLE_KEYWORDS += [" ".join(list(kw)) for kw in GAMBLE_KEYWORDS] +SPAM_MOVIE_KEYWORDS += [" ".join(list(kw)) for kw in SPAM_MOVIE_KEYWORDS] + +DOCUMENT_REMOVAL_KEYWORDS = ( + PORN_KEYWORDS + + GAMBLE_KEYWORDS + + SPAM_MOVIE_KEYWORDS + + SPAM_LIKE_KEYWORDS + + CODE_KEYWORDS + + WEBBOARD_KEYWORDS +) + +PARTIAL_REMOVAL_KEYWORDS = [ + "Posted on", + "Posted by", + "Posted by:", + "Posted By:", + "สมาชิกหมายเลข [0-9,]+", + "อ่าน [0-9,]+ ครั้ง", + "เปิดดู [0-9,]+ ครั้ง", + "ดู [0-9,]+ ครั้ง", + "คะแนนสะสม: [0-9,]+ แต้ม", + "ความคิดเห็น: [0-9,]+", + "[0-9,]+ บุคคลทั่วไป กำลังดูบอร์ดนี้", + "หน้าที่แล้ว ต่อไป", + "ความคิดเห็นที่ [0-9,]+", + "[0-9,]+ สมาชิก และ [0-9,]+ บุคคลทั่วไป", + "กำลังดูหัวข้อนี้", + "เข้าสู่ระบบด้วยชื่อผู้ใช้", + "แสดงกระทู้จาก:", + "กระทู้: [0-9,]+", + "เว็บไซต์เรามีการใช้คุกกี้และเก็บข้อมูลผู้ใช้งาน โปรดศึกษาและยอมรับ นโยบายคุ้มครองข้อมูลส่วนบุคคล ก่อนใช้งาน", + "Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use\.", + "Previous\t\nNext\nLeave a Reply Cancel reply\nYou must be logged in to post a comment.\nSearch for:\nFeatured Post\n", + "Click to read more\nYou must be logged in to view or write comments\.", + "[0-9,]+ Views", + "Skip to content", + "Last Modified Posts", + "Last Updated:", + "\(อ่าน [0-9,]+ ครั้ง\)", + "Recent Comments", + "«.*?»", + "< --แสดงทั้งหมด-- >", + "นโยบายความเป็นส่วนตัว", + "เงื่อนไขการใช้เว็บไซต์", + "ตั้งค่าคุกกี้", + "ท่านยอมรับให้เว็บไซต์นี้จัดเก็บคุกกี้เพื่อประสบการณ์การใช้งานเว็บไซต์ที่ดียิ่งขึ้น", + "รวมถึงช่วยให้ท่านมีโอกาสได้รับข้อเสนอหรือเนื้อหาที่ตรงตามความสนใจของท่าน", + "ท่านสามารถดู Privacy Notice ของเว็บไซต์เรา ได้ที่นี่", + "You may be trying to access this site from a secured browser on the server. Please enable scripts and reload this page.", + "เผยแพร่: \d\d [ก-๙]+ \d\d\d\d \d\d:\d\d น\.", + "Last updated: \d\d [ก-๙]+\.[ก-๙]+\. \d\d\d\d \d\d:\d\d น\.", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit\.", + "Search for:", + "Save my name, email, and website in this browser for the next time I comment", + "Your email address will not be published. Required fields are marked", + "Leave a Reply Cancel reply", + "((?:หน้าหลัก|เข้าสู่ระบบ|หน้าแรก) \|(?: [^\s]+(?:(?: \|)|$|\s))+)", + "กลับหน้าแรก", + "ติดต่อเรา", + "Contact Us", + "#\w+", + "ติดต่อผู้ดูแลเว็บไซต์", + "หากท่านพบว่ามีข้อมูลใดๆที่ละเมิดทรัพย์สินทางปัญญาปรากฏอยู่ในเว็บไซต์โปรดแจ้งให้ทราบ", + "No related posts", + "Posted in", + "((?:Tags:|Tagged|Tag) (?:.{1,40}(?:,|\n|$))+)", + "ตอบ:", + "Sort by:", + "All rights reserved", + "ความยาวอย่างน้อย", + "ระบบได้ดำเนินการส่ง OTP", + "เป็นสมาชิกอยู่แล้ว\?", + "We use cookies", + "Cookie Settings", + "Homeหน้าหลัก", + "Home หน้าหลัก", + "ข่าวสารล่าสุด", + "ปัญหา การใช้งาน", + "ปัญหาการใช้งาน" "ผู้เขียน", + "หัวข้อ:", + "\*\* พร้อมส่ง \*\*", +] + +TH_MONTHS = [ + "มกราคม", + "กุมภาพันธ์", + "มีนาคม", + "เมษายน", + "พฤษภาคม", + "มิถุนายน", + "กรกฎาคม", + "สิงหาคม", + "กันยายน", + "ตุลาคม", + "พฤศจิกายน", + "ธันวาคม", + "ม\.ค\.", + "ก\.พ\.", + "มี\.ค\.", + "เม\.ย\.", + "พ\.ค\.", + "มิ\.ย\.", + "ก\.ค\.", + "ส\.ค\.", + "ก\.ย\.", + "ต\.ค\.", + "พ\.ย\.", + "ธ\.ค\.", +] + +CODE_SPECIAL_CHARACTERS = ["\{", "\+", "\}", "/", ":"] + +PARTIAL_REMOVAL_KEYWORDS = sorted_by_len(PARTIAL_REMOVAL_KEYWORDS) diff --git a/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2019.ipynb b/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2019.ipynb new file mode 100644 index 0000000..6fd135a --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2019.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"mount_file_id":"1RUQtEguXyCad0ShFHjOpIaeSyC3uDSjf","authorship_tag":"ABX9TyOhgUgEJFAPyHWApxsT1ZhV"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"68b8492a512f4f2186b451cfc29be6c5":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_509267521f3d4d8986defc3c20d73ee3","IPY_MODEL_9111cecf899f45f19dfab6278bb6fbf2","IPY_MODEL_6f7b1d23a83c4a6cb3c82edf4839cd51"],"layout":"IPY_MODEL_1a86a0ef9dbf457bbe8d7636488423fb"}},"509267521f3d4d8986defc3c20d73ee3":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6930c369a7a94c3dba6c71efcde42ab3","placeholder":"​","style":"IPY_MODEL_695f189c0a934d618e5e235f8dba8ed1","value":"Downloading (…)okenizer_config.json: 100%"}},"9111cecf899f45f19dfab6278bb6fbf2":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_8093712e759c43079f1f03517697e995","max":376,"min":0,"orientation":"horizontal","style":"IPY_MODEL_fac0401829634e2d8b2aae0009ff9f61","value":376}},"6f7b1d23a83c4a6cb3c82edf4839cd51":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_53ba538018a143b9a023c56eb111ef43","placeholder":"​","style":"IPY_MODEL_5b61268a721d4df89ed01c2233feffd4","value":" 376/376 [00:00<00:00, 5.75kB/s]"}},"1a86a0ef9dbf457bbe8d7636488423fb":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6930c369a7a94c3dba6c71efcde42ab3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"695f189c0a934d618e5e235f8dba8ed1":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8093712e759c43079f1f03517697e995":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fac0401829634e2d8b2aae0009ff9f61":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"53ba538018a143b9a023c56eb111ef43":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5b61268a721d4df89ed01c2233feffd4":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"bc182cffc867494a82445a255e87e65f":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_40f7fbd1cede409a955d2a978711dd54","IPY_MODEL_43b617a7e5ff4e0294436717e207a4d9","IPY_MODEL_8c326b3c08c04cec9b111c96411d72a1"],"layout":"IPY_MODEL_0ac9528c3cb444aaafce65ede6b2a7c5"}},"40f7fbd1cede409a955d2a978711dd54":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_8cb23b82275e4987bcfd297061535a7f","placeholder":"​","style":"IPY_MODEL_055b6e2827c24948b3806947b3fa1b61","value":"Downloading (…)lve/main/config.json: 100%"}},"43b617a7e5ff4e0294436717e207a4d9":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_8ba1d4f2af3440a7a6ecaeabbca7d995","max":702,"min":0,"orientation":"horizontal","style":"IPY_MODEL_2628fb5a45ff4b069e88528a7dc5fb0b","value":702}},"8c326b3c08c04cec9b111c96411d72a1":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6bce0d39756f41cea61384451d799532","placeholder":"​","style":"IPY_MODEL_cce329b5769d4b5395ad33de75283d0e","value":" 702/702 [00:00<00:00, 16.8kB/s]"}},"0ac9528c3cb444aaafce65ede6b2a7c5":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8cb23b82275e4987bcfd297061535a7f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"055b6e2827c24948b3806947b3fa1b61":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8ba1d4f2af3440a7a6ecaeabbca7d995":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2628fb5a45ff4b069e88528a7dc5fb0b":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"6bce0d39756f41cea61384451d799532":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"cce329b5769d4b5395ad33de75283d0e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8e971813939047878cbeacaccf58bd03":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_49ce216c3f684ddd8c09834e9aaa10d7","IPY_MODEL_2be607c544154c85bddd5dbbaba8850d","IPY_MODEL_baccd59d7e824a568dadfa66f6cf4f3a"],"layout":"IPY_MODEL_cbfcb2e011724b4c9e8c783851f5d94a"}},"49ce216c3f684ddd8c09834e9aaa10d7":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9f1e6645fcb24f05be3cb6c051ab4428","placeholder":"​","style":"IPY_MODEL_a31a3645d9784e4295d6e2d556e73fca","value":"Downloading (…)ve/main/spiece.model: 100%"}},"2be607c544154c85bddd5dbbaba8850d":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_74c66b312c64458a9258f0969ef77218","max":4309802,"min":0,"orientation":"horizontal","style":"IPY_MODEL_86b7865deff64ba9af78a0d7ee2251ad","value":4309802}},"baccd59d7e824a568dadfa66f6cf4f3a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_02ab2a15576445f58bc11e5e13d246f2","placeholder":"​","style":"IPY_MODEL_a7b9f1b7dc3d42e4bb54dd624167bcbb","value":" 4.31M/4.31M [00:00<00:00, 17.4MB/s]"}},"cbfcb2e011724b4c9e8c783851f5d94a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9f1e6645fcb24f05be3cb6c051ab4428":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a31a3645d9784e4295d6e2d556e73fca":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"74c66b312c64458a9258f0969ef77218":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"86b7865deff64ba9af78a0d7ee2251ad":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"02ab2a15576445f58bc11e5e13d246f2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a7b9f1b7dc3d42e4bb54dd624167bcbb":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8ff7df23ac54492c86cf99edddeb78a7":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_e05957e3e53e45f1ae08e33f1995da12","IPY_MODEL_c1a8d68bf98943eb801ab5654ba3969e","IPY_MODEL_31b1f154ff9c45c19f7be8945db7c933"],"layout":"IPY_MODEL_e3ef52636566473599869d4da18bd268"}},"e05957e3e53e45f1ae08e33f1995da12":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_7e92d491f26542858b272482e36e3e4b","placeholder":"​","style":"IPY_MODEL_4f1540c6fdc34b809a4a3ab933278f73","value":"Downloading (…)cial_tokens_map.json: 100%"}},"c1a8d68bf98943eb801ab5654ba3969e":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_351ca766f2114b99899f3f7bd7de75ca","max":65,"min":0,"orientation":"horizontal","style":"IPY_MODEL_6095426ae3c84c82894a5807ca8a1bff","value":65}},"31b1f154ff9c45c19f7be8945db7c933":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c606805481d34693a21c9be6b2a8c43a","placeholder":"​","style":"IPY_MODEL_61fedb237ea64de78d007563118ce509","value":" 65.0/65.0 [00:00<00:00, 2.52kB/s]"}},"e3ef52636566473599869d4da18bd268":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7e92d491f26542858b272482e36e3e4b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4f1540c6fdc34b809a4a3ab933278f73":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"351ca766f2114b99899f3f7bd7de75ca":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6095426ae3c84c82894a5807ca8a1bff":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c606805481d34693a21c9be6b2a8c43a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"61fedb237ea64de78d007563118ce509":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f1a95c5a58584368af4b1ff18905e562":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_a1646c74280a45a9a5c2ffb168651f99","IPY_MODEL_88efdce12acf4db7be6c457faf5da65a","IPY_MODEL_a40dca41aee24c82ab0ff3a940d74a7b"],"layout":"IPY_MODEL_72a4baa24d5246d7bddd80a2a0a9d495"}},"a1646c74280a45a9a5c2ffb168651f99":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_d508754c52f24d79824e87bd2b8204aa","placeholder":"​","style":"IPY_MODEL_a27a429a96db40bbae5f3daf7e8a006d","value":"Downloading builder script: 100%"}},"88efdce12acf4db7be6c457faf5da65a":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_b64c2a8eb09547689ac8228addad8b0c","max":14761,"min":0,"orientation":"horizontal","style":"IPY_MODEL_d6fc81bfe53c4c4496962a16ee9f40e9","value":14761}},"a40dca41aee24c82ab0ff3a940d74a7b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_8aff9ee604b54d44956e10fe912d9532","placeholder":"​","style":"IPY_MODEL_303bacd4073e44159d68a47c365c92da","value":" 14.8k/14.8k [00:00<00:00, 422kB/s]"}},"72a4baa24d5246d7bddd80a2a0a9d495":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d508754c52f24d79824e87bd2b8204aa":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a27a429a96db40bbae5f3daf7e8a006d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"b64c2a8eb09547689ac8228addad8b0c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d6fc81bfe53c4c4496962a16ee9f40e9":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"8aff9ee604b54d44956e10fe912d9532":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"303bacd4073e44159d68a47c365c92da":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c2cb6a1609c04150a8bd10103567be38":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_c59792ce9ca44a47bdf63e715a5b06c0","IPY_MODEL_35c7a87ec87a4410b6c137e030f55cbe","IPY_MODEL_c66adf2fb8ef40d6931404548902c0cc"],"layout":"IPY_MODEL_3df5f0bc7d59420c939057335fe540d1"}},"c59792ce9ca44a47bdf63e715a5b06c0":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_04753381ba234748bfa0abd18fc55d1f","placeholder":"​","style":"IPY_MODEL_281efbf08e304065a35be89c56c2edb6","value":"Downloading metadata: 100%"}},"35c7a87ec87a4410b6c137e030f55cbe":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_7d0f5eb27e4943baa5e80d213d6302a6","max":3073761,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ab1922db700247ca9348b5b7ff4e7016","value":3073761}},"c66adf2fb8ef40d6931404548902c0cc":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_4f5ea78b7f3f4163aebfc2137cb47f6f","placeholder":"​","style":"IPY_MODEL_800f5f81f6c84ab999855d56ba8ad57b","value":" 3.07M/3.07M [00:01<00:00, 3.47MB/s]"}},"3df5f0bc7d59420c939057335fe540d1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"04753381ba234748bfa0abd18fc55d1f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"281efbf08e304065a35be89c56c2edb6":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"7d0f5eb27e4943baa5e80d213d6302a6":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ab1922db700247ca9348b5b7ff4e7016":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"4f5ea78b7f3f4163aebfc2137cb47f6f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"800f5f81f6c84ab999855d56ba8ad57b":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2a056a11ef7e4a85a2349ca43fe2791b":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_32ed4874f4f04c108f96696df961db05","IPY_MODEL_d21c81f257d04afaaf5988b02d36b412","IPY_MODEL_8b8aa6f2eeb442adbe01517ea9941ad9"],"layout":"IPY_MODEL_234633a2ef004263879fd7d4cda78a36"}},"32ed4874f4f04c108f96696df961db05":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6af3718aed9c4926845d1dc26314678e","placeholder":"​","style":"IPY_MODEL_3ea2098cda034ba99fc8ff31e8cfe132","value":"Downloading readme: 100%"}},"d21c81f257d04afaaf5988b02d36b412":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_0725e50da293410389dc74efff2e64c4","max":303334,"min":0,"orientation":"horizontal","style":"IPY_MODEL_1f9041a11be84b0091cf48c16bad9023","value":303334}},"8b8aa6f2eeb442adbe01517ea9941ad9":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_528998d53ce844fabf506c611fe2ef65","placeholder":"​","style":"IPY_MODEL_5db75db9981c4c7096106808c9c6c36e","value":" 303k/303k [00:00<00:00, 535kB/s]"}},"234633a2ef004263879fd7d4cda78a36":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6af3718aed9c4926845d1dc26314678e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3ea2098cda034ba99fc8ff31e8cfe132":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"0725e50da293410389dc74efff2e64c4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1f9041a11be84b0091cf48c16bad9023":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"528998d53ce844fabf506c611fe2ef65":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5db75db9981c4c7096106808c9c6c36e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"cells":[{"cell_type":"code","execution_count":null,"metadata":{"id":"Fs-SsXoIw2Kx"},"outputs":[],"source":["!pip install datasets\n","!pip install transformers\n","!pip install gensim\n","!pip install pythainlp\n","!pip install pyLDAvis\n","!pip install sentencepiece"]},{"cell_type":"code","source":["!cp /content/full_input.json /content/drive/MyDrive/Openthaigpt/full_input.json"],"metadata":{"id":"RnPfyDyaK6fI","executionInfo":{"status":"ok","timestamp":1686230547053,"user_tz":-420,"elapsed":10525,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}}},"execution_count":7,"outputs":[]},{"cell_type":"code","source":["!pip install datasets"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Suzm61AdA93N","executionInfo":{"status":"ok","timestamp":1686227948083,"user_tz":-420,"elapsed":26552,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"da1eb93d-0901-4f67-b984-67e496ef3cd6"},"execution_count":1,"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting datasets\n"," Downloading datasets-2.12.0-py3-none-any.whl (474 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m474.6/474.6 kB\u001b[0m \u001b[31m8.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (1.22.4)\n","Requirement already satisfied: pyarrow>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (9.0.0)\n","Collecting dill<0.3.7,>=0.3.0 (from datasets)\n"," Downloading dill-0.3.6-py3-none-any.whl (110 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.5/110.5 kB\u001b[0m \u001b[31m11.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets) (1.5.3)\n","Requirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (2.27.1)\n","Requirement already satisfied: tqdm>=4.62.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (4.65.0)\n","Collecting xxhash (from datasets)\n"," Downloading xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m212.5/212.5 kB\u001b[0m \u001b[31m22.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting multiprocess (from datasets)\n"," Downloading multiprocess-0.70.14-py310-none-any.whl (134 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.3/134.3 kB\u001b[0m \u001b[31m14.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: fsspec[http]>=2021.11.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (2023.4.0)\n","Collecting aiohttp (from datasets)\n"," Downloading aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m27.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting huggingface-hub<1.0.0,>=0.11.0 (from datasets)\n"," Downloading huggingface_hub-0.15.1-py3-none-any.whl (236 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m236.8/236.8 kB\u001b[0m \u001b[31m22.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from datasets) (23.1)\n","Collecting responses<0.19 (from datasets)\n"," Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (6.0)\n","Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (23.1.0)\n","Requirement already satisfied: charset-normalizer<4.0,>=2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (2.0.12)\n","Collecting multidict<7.0,>=4.5 (from aiohttp->datasets)\n"," Downloading multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.5/114.5 kB\u001b[0m \u001b[31m10.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting async-timeout<5.0,>=4.0.0a3 (from aiohttp->datasets)\n"," Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n","Collecting yarl<2.0,>=1.0 (from aiohttp->datasets)\n"," Downloading yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (268 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m268.8/268.8 kB\u001b[0m \u001b[31m17.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting frozenlist>=1.1.1 (from aiohttp->datasets)\n"," Downloading frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (149 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m149.6/149.6 kB\u001b[0m \u001b[31m14.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting aiosignal>=1.1.2 (from aiohttp->datasets)\n"," Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (3.12.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (4.5.0)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (1.26.15)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (2022.12.7)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (3.4)\n","Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2.8.2)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2022.7.1)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas->datasets) (1.16.0)\n","Installing collected packages: xxhash, multidict, frozenlist, dill, async-timeout, yarl, responses, multiprocess, huggingface-hub, aiosignal, aiohttp, datasets\n","Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 datasets-2.12.0 dill-0.3.6 frozenlist-1.3.3 huggingface-hub-0.15.1 multidict-6.0.4 multiprocess-0.70.14 responses-0.18.0 xxhash-3.2.0 yarl-1.9.2\n"]}]},{"cell_type":"code","source":["from datasets import load_dataset \n","\n","dataset= load_dataset(\"oscar\",\"unshuffled_deduplicated_th\",split='train',streaming=True)"],"metadata":{"id":"M5E5aa3UxbXR","executionInfo":{"status":"ok","timestamp":1686227966170,"user_tz":-420,"elapsed":18092,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/","height":113,"referenced_widgets":["f1a95c5a58584368af4b1ff18905e562","a1646c74280a45a9a5c2ffb168651f99","88efdce12acf4db7be6c457faf5da65a","a40dca41aee24c82ab0ff3a940d74a7b","72a4baa24d5246d7bddd80a2a0a9d495","d508754c52f24d79824e87bd2b8204aa","a27a429a96db40bbae5f3daf7e8a006d","b64c2a8eb09547689ac8228addad8b0c","d6fc81bfe53c4c4496962a16ee9f40e9","8aff9ee604b54d44956e10fe912d9532","303bacd4073e44159d68a47c365c92da","c2cb6a1609c04150a8bd10103567be38","c59792ce9ca44a47bdf63e715a5b06c0","35c7a87ec87a4410b6c137e030f55cbe","c66adf2fb8ef40d6931404548902c0cc","3df5f0bc7d59420c939057335fe540d1","04753381ba234748bfa0abd18fc55d1f","281efbf08e304065a35be89c56c2edb6","7d0f5eb27e4943baa5e80d213d6302a6","ab1922db700247ca9348b5b7ff4e7016","4f5ea78b7f3f4163aebfc2137cb47f6f","800f5f81f6c84ab999855d56ba8ad57b","2a056a11ef7e4a85a2349ca43fe2791b","32ed4874f4f04c108f96696df961db05","d21c81f257d04afaaf5988b02d36b412","8b8aa6f2eeb442adbe01517ea9941ad9","234633a2ef004263879fd7d4cda78a36","6af3718aed9c4926845d1dc26314678e","3ea2098cda034ba99fc8ff31e8cfe132","0725e50da293410389dc74efff2e64c4","1f9041a11be84b0091cf48c16bad9023","528998d53ce844fabf506c611fe2ef65","5db75db9981c4c7096106808c9c6c36e"]},"outputId":"6afb4ab0-f1e2-44c6-f24c-830ceb2a6278"},"execution_count":2,"outputs":[{"output_type":"display_data","data":{"text/plain":["Downloading builder script: 0%| | 0.00/14.8k [00:00100000:\n"," break\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"duafs9DpuDhi","executionInfo":{"status":"ok","timestamp":1686228014075,"user_tz":-420,"elapsed":47907,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"45909f34-6b0c-4153-af93-f8471ce00bcc"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stderr","text":["100000it [00:47, 2097.14it/s]\n"]}]},{"cell_type":"code","source":["import pandas as pd \n","df = pd.DataFrame(oscar19)"],"metadata":{"id":"OX2k-fb2xC80"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df.iloc[0]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"zxCS-_x6z5Aq","executionInfo":{"status":"ok","timestamp":1686073484692,"user_tz":-420,"elapsed":606,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"5644c12e-c0f2-4d60-9599-48af98ebb152"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["id 0\n","text ฟันที่แลดูขาวสะอาดไม่มีเศษอาหารติดอยู่ เหงือกส...\n","Name: 0, dtype: object"]},"metadata":{},"execution_count":15}]},{"cell_type":"code","source":["k = df.iloc[:3].to_json(orient='records', lines=True)"],"metadata":{"id":"zdz4pOB_-4kl"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["new_list = []\n","\n","for text in df[\"text\"][:10000]:\n"," new_list.append({\"text\":text})"],"metadata":{"id":"Nzh8d32bz7v2"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import jsonlines"],"metadata":{"id":"2Pfyyjjx4vue"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import json\n","json.dump(oscar19, open(\"full_input.json\",\"w\",encoding=\"utf-8\"), indent = 6)\n"],"metadata":{"id":"QoS9u1HLBBuy","executionInfo":{"status":"ok","timestamp":1686228116372,"user_tz":-420,"elapsed":7861,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}}},"execution_count":6,"outputs":[]},{"cell_type":"code","source":["f=open(\"input.jsonl\",\"w\",encoding=\"utf-8\")\n","f.write(str(\"\\n\".join([str(d) for d in new_list])))\n","f.close()"],"metadata":{"id":"s5H1jKV2zCCW"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["((?:หน้าหลัก|เข้าสู่ระบบ|หน้าแรก) \\|(?: .+(?:(?: \\|)|$))+)"],"metadata":{"id":"yqUnTRjQ-r8a"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import re\n","from pythainlp.util import countthai\n","\n","PORN_KEYWORDS =[\"คลิปหลุด\",\"กระเจี๊ยว\",\"คลิปโป๊\",\"หนังโป๊\",\"หนังโป้\",\"หนังโป็\",\"เรื่องเสียว\",\"ซอยหี\",\"ชักว่าว\",\"ท่าหมา\",\"ขย่มควย\",\"เล่นเสียว\",\"ควยใหญ่\",\"หนังเอ็กซ์\",\"แหกหี\"]\n","GAMBLE_KEYWORDS = [\"ufabet\",\"UFABET\",\"ล้มโต๊ะ\", \"เซียนสเต็ป\",\"บอลเต็ง\",\"แทงบอล\",\"คาสิโน\",\"บาคาร่า\",\"เว็บสล็อต\",\"เกมสล็อต\",\"สล็อตออนไลน์\",\"คาสิโนออนไลน์\",\n"," \"หวยมาเลย์\", \"หวยฮานอย\", \"น้ำเต้าปูปลา\", \"หวยออนไลน์\" , \"แทงหวย\" , \"หวยหุ้น\", \"ยิงปลาออนไลน์\" ,\"ได้เงินจริง\",\"บา คา ร่า\"]\n","SPAM_MOVIE_KEYWORDS =[\"ดูหนังออนไลน์\",\"หนังออนไลน์\",\"เว็บดูหนัง\",\"หนังชนโรง\",\"หนังใหม่ชนโรง\",\"เสียงไทย\",\"เสียงญี่ปุ่น\",\"เสียงอังกฤษ\"]\n","SPAM_LIKE_KEYWORDS = [\"ปั้มไลค์\",\"รับจ้างกดไลค์\",\"จ้างไลค์\",\"ปั๊มไลค์\",\"ปั่นไลค์\",\"เพิ่มไลค์\",\"ซื้อไลค์\"]\n","CODE_KEYWORDS =[\"padding:\",\"display:\",\"S3=n8\",\"phpBB Debug\",\"getElementById\",\"innerHTML\",\"parseInt\",\"addEventListener\",\"console\\.log\",\"checkCookieForTarget\",\"setAttribute\",\"getItem\",\"if \\(\",\"else {\",\"JSON\\.stringify\",\"onclick\"]\n","\n","ratchakarn_website_keywords = [\"คุณกำลังใช้งานแบบปิดการใช้ Javascript\",\"Longdo Dictionary\",\"นโยบายการคุ้มครองข้อมูลส่วนบุคคล\",\"เงื่อนไขการให้บริการเว็บไซต์\",\"นโยบายความปลอดภัย\",\"นโยบายเว็บไซต์และการปฏิเสธความรับผิด\",\"คุณอาจจะยังไม่ได้เข้าสู่ระบบหรือยังไม่ได้ลงทะเบียน\",\"คุณไม่ได้เข้าสู่ระบบหรือคุณไม่มีสิทธิ์เข้าหน้านี้\"]\n","\n","PORN_KEYWORDS += [\" \".join(list(kw)) for kw in PORN_KEYWORDS]\n","GAMBLE_KEYWORDS += [\" \".join(list(kw)) for kw in GAMBLE_KEYWORDS]\n","SPAM_MOVIE_KEYWORDS += [\" \".join(list(kw)) for kw in SPAM_MOVIE_KEYWORDS]\n","\n","DOCUMENT_REMOVAL_KEYWORDS = PORN_KEYWORDS + GAMBLE_KEYWORDS + SPAM_MOVIE_KEYWORDS + SPAM_LIKE_KEYWORDS + CODE_KEYWORDS + ratchakarn_website_keywords\n","\n","PARTIAL_REMOVAL_KEYWORDS = [\"Posted on\",\"Posted by\",\"Posted by:\",\"Posted By:\",\"สมาชิกหมายเลข [0-9,]+\",\"อ่าน [0-9,]+ ครั้ง\",\"เปิดดู [0-9,]+ ครั้ง\",\"ดู [0-9,]+ ครั้ง\",\"คะแนนสะสม: [0-9,]+ แต้ม\",\"ความคิดเห็น: [0-9,]+\",\n"," \"[0-9,]+ บุคคลทั่วไป กำลังดูบอร์ดนี้\",\"หน้าที่แล้ว ต่อไป\",\"ความคิดเห็นที่ [0-9,]+\",\"[0-9,]+ สมาชิก และ [0-9,]+ บุคคลทั่วไป\",\"กำลังดูหัวข้อนี้\",\"เข้าสู่ระบบด้วยชื่อผู้ใช้\",\n"," \"แสดงกระทู้จาก:\",\"กระทู้: [0-9,]+\",\"เว็บไซต์เรามีการใช้คุกกี้และเก็บข้อมูลผู้ใช้งาน โปรดศึกษาและยอมรับ นโยบายคุ้มครองข้อมูลส่วนบุคคล ก่อนใช้งาน\",\n"," \"Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use\\.\",\n"," \"Previous\\t\\nNext\\nLeave a Reply Cancel reply\\nYou must be logged in to post a comment.\\nSearch for:\\nFeatured Post\\n\",\n"," \"Click to read more\\nYou must be logged in to view or write comments\\.\",\"[0-9,]+ Views\",\"Skip to content\",\"Last Modified Posts\",\"Last Updated:\",\n"," \"\\(อ่าน [0-9,]+ ครั้ง\\)\",\"Recent Comments\",\"«.*?»\",\"< --แสดงทั้งหมด-- >\",\"นโยบายความเป็นส่วนตัว\",\"เงื่อนไขการใช้เว็บไซต์\",\"ตั้งค่าคุกกี้\",\"ท่านยอมรับให้เว็บไซต์นี้จัดเก็บคุกกี้เพื่อประสบการณ์การใช้งานเว็บไซต์ที่ดียิ่งขึ้น\",\n"," \"รวมถึงช่วยให้ท่านมีโอกาสได้รับข้อเสนอหรือเนื้อหาที่ตรงตามความสนใจของท่าน\",\"ท่านสามารถดู Privacy Notice ของเว็บไซต์เรา ได้ที่นี่\",\"You may be trying to access this site from a secured browser on the server. Please enable scripts and reload this page.\",\n"," \"เผยแพร่: \\d\\d [ก-๙]+ \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Last updated: \\d\\d [ก-๙]+\\.[ก-๙]+\\. \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\.\",\n"," \"Search for:\",\"Save my name, email, and website in this browser for the next time I comment\",\"Your email address will not be published. Required fields are marked\",\n"," \"Leave a Reply Cancel reply\",\"((?:หน้าหลัก|เข้าสู่ระบบ|หน้าแรก) \\|(?: .+(?:(?: \\|)|$))+)\",\"กลับหน้าแรก\",\"ติดต่อเรา\",\"Contact Us\",\"#\\w+\",\"ติดต่อผู้ดูแลเว็บไซต์\",\n"," \"หากท่านพบว่ามีข้อมูลใดๆที่ละเมิดทรัพย์สินทางปัญญาปรากฏอยู่ในเว็บไซต์โปรดแจ้งให้ทราบ\",\"No related posts\",\"Posted in\",\"((?:Tags:|Tagged|Tag) (?:.{1,40}(?:,|\\n|$))+)\",\"ตอบ:\",\"Sort by:\",\n"," \"All rights reserved\",\"ความยาวอย่างน้อย\",\"ระบบได้ดำเนินการส่ง OTP\",\"เป็นสมาชิกอยู่แล้ว\\?\",\"We use cookies\",\"Cookie Settings\",\n"," \"Homeหน้าหลัก\", \"Home หน้าหลัก\", \"ข่าวสารล่าสุด\", \"ปัญหา การใช้งาน\", \"ปัญหาการใช้งาน\" \"ผู้เขียน\" ,\"หัวข้อ:\" ,\"\\*\\* พร้อมส่ง \\*\\*\"]\n","\n","TH_MONTHS = [\"มกราคม\",\"กุมภาพันธ์\",\"มีนาคม\",\"เมษายน\",\"พฤษภาคม\",\"มิถุนายน\",\"กรกฎาคม\",\"สิงหาคม\",\"กันยายน\",\"ตุลาคม\",\"พฤศจิกายน\",\"ธันวาคม\",\n"," \"ม\\.ค\\.\",\"ก\\.พ\\.\",\"มี\\.ค\\.\",\"เม\\.ย\\.\",\"พ\\.ค\\.\",\"มิ\\.ย\\.\",\"ก\\.ค\\.\",\"ส\\.ค\\.\",\"ก\\.ย\\.\",\"ต\\.ค\\.\",\"พ\\.ย\\.\",\"ธ\\.ค\\.\"]\n"," \n","CODE_SPECIAL_CHARACTERS = [\"\\{\",\"\\+\",\"\\}\",\"/\",\":\"]\n","\n","def contains_document_removal_keywords(text : str) -> bool:\n","\n"," '''\n"," Description : Check if an input document contains any document removal keywords.\n"," Input text : An input document.\n"," Output : True if the document contains the keywords. Otherwise, False\n"," '''\n","\n"," pattern = '|'.join(DOCUMENT_REMOVAL_KEYWORDS)\n","\n"," return bool(re.search(pattern, text))\n","\n","def check_ratio_bad_substring(text :str) -> bool:\n","\n"," '''\n"," Description : Check if the ratio between number of keywords and length of a document\n"," is exceeds the threshold for each groups.\n","\n"," Group #1 : Name of months in Thai including abbreviations.\n"," Group #2 : Special characters that is usually found in the code section.\n"," Group #3 : Space.\n"," Group #4 : Commar.\n","\n"," Note : The threshold of each group are achieved by the study of oscar dataset.\n","\n"," Input text : An input document.\n"," Output : True if a ratio of at least 1 group is above . Otherwise, False\n"," '''\n"," \n"," n=len(text)\n","\n"," # if len(re.findall(\"|\".join(TH_MONTHS),text))/n > 0.015:\n"," # return True\n","\n"," if len(re.findall(\"|\".join(CODE_SPECIAL_CHARACTERS),text))/n > 0.075:\n"," print(5555)\n"," return True\n","\n"," # if len(re.findall(\" \",text))/n > 0.13:\n"," # return True\n","\n"," # if len(re.findall(\",\",text))/n > 0.05:\n"," # return True\n"," return False\n","\n","def remove_partial_keywords(text : str) -> str:\n"," '''\n"," Description : Remove partial removal keywords from the document.\n","\n"," Input text : An input document.\n"," Output : A document after removed keywords.\n"," '''\n","\n"," return re.sub(\"|\".join(PARTIAL_REMOVAL_KEYWORDS),\"\",text)\n","\n","def clean_text(text : str) -> str:\n"," '''\n"," Description : Clean an input document by these steps\n","\n"," 1. Remove the whole document if \n"," 1.1. It contains any document removal keywords (ex. porn, gamble, spam)\n"," 1.2. It contains too much thai months, code character, space and commar.\n"," 1.3. The percent of thai characters is less than 50%.\n"," 2. Remove partial removal keywords. \n","\n"," Input text : An input document.\n"," Output : A clean document (\"\" if the whole document should be removed during the procss.).\n"," '''\n","\n"," if contains_document_removal_keywords(text) or check_ratio_bad_substring(text) or countthai(text)<50:\n"," return \"\"\n"," \n"," text= remove_partial_keywords(text)\n","\n"," # not sure if we should normalize\n"," #text = normalize(text)\n","\n"," return text\n"],"metadata":{"id":"4w_qgPToxVla"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[\"text\"][7440]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":52},"id":"hawGsK97LhXd","executionInfo":{"status":"ok","timestamp":1683059829901,"user_tz":-420,"elapsed":3,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"406ed25a-0670-40bf-ade0-d3c4c40315df"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'bGF2aWVlc3RiZWxsZW1hZy5jb20# oxixagi-a.anchor.com [URL=http://oxixagi-u.com/]oxixagi-u.anchor.com[/URL] http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/…'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":43}]},{"cell_type":"code","source":["check_ratio_bad_substring(\"bGF2aWVlc3RiZWxsZW1hZy5jb20# oxixagi-a.anchor.com [URL=http://oxixagi-u.com/]oxixagi-u.anchor.com[/URL] http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/…\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"-jNhJFj3NWyj","executionInfo":{"status":"ok","timestamp":1683060394131,"user_tz":-420,"elapsed":2,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"6117f1d9-047a-43a6-d487-d235552f0dd7"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["5555\n"]},{"output_type":"execute_result","data":{"text/plain":["True"]},"metadata":{},"execution_count":46}]},{"cell_type":"code","source":["df[df[\"text\"].apply(check_ratio_bad_substring)]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":519},"id":"I3cvVPz98yCE","executionInfo":{"status":"ok","timestamp":1683059747698,"user_tz":-420,"elapsed":762,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"48bf728a-b783-4731-a084-32aedc8a3a1b"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id text clean_text\n","4707 4707 รายงานผลการดำเนินงานตามนโยบายรัฐบาล ปีที่4 (วั... \n","7018 7018 กลุ่ม :: https://www.facebook.com/groups/PayZT... \n","7343 7343 SISERVIER http://www.siservier.com WISDOM http... \n","7440 7440 bGF2aWVlc3RiZWxsZW1hZy5jb20# oxixagi-a.anchor.... \n","7542 7542 Список альбомов :: Последние добавления :: Пос... \n","8174 8174 ที่ชงกาแฟแบบหยด IWAKI, ที่ชงกาแฟแบบหยด IWAKI ร... \n","8703 8703 ‪ 1 / 44‪ 2 / 44‪ 3 / 44‪ 4 / 44‪ 5 / 44‪ 6 / ... \n","8818 8818 ไม่ระบุเวลา07:00 - 07:2907:30 - 07:5908:00 - 0... \n","9308 9308 คู่มือสำหรับการใช้งานสามารถดาวน์โหลดได้ที่ : h... \n","11653 11653 * Quantity : จำนวน Unit : กรุณาเลือกหน่วย CCM/... \n","14632 14632 ติดตามผลงานได้ที่ = https://www.facebook.com/D... \n","14634 14634 รายการอัลบั้ม :: ภาพที่ส่งล่าสุด :: คำวิจารณ์ภ... \n","18443 18443 ยินดีต้อนรับ เข้าสู่วิทยาลัยการอาชีพนครศรีธรรม... \n","24719 24719 การประกาศตัวแปรแบบอาร์เรย์ ชนิดตัวแปร ชื่อตัวแ... \n","26026 26026 +แบบใบลา ใบลาพักผ่อน\\tใบลาป่วย/กิจ/คลอด ใบลาอุ... "],"text/html":["\n","
\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextclean_text
47074707รายงานผลการดำเนินงานตามนโยบายรัฐบาล ปีที่4 (วั...
70187018กลุ่ม :: https://www.facebook.com/groups/PayZT...
73437343SISERVIER http://www.siservier.com WISDOM http...
74407440bGF2aWVlc3RiZWxsZW1hZy5jb20# oxixagi-a.anchor....
75427542Список альбомов :: Последние добавления :: Пос...
81748174ที่ชงกาแฟแบบหยด IWAKI, ที่ชงกาแฟแบบหยด IWAKI ร...
87038703‪ 1 / 44‪ 2 / 44‪ 3 / 44‪ 4 / 44‪ 5 / 44‪ 6 / ...
88188818ไม่ระบุเวลา07:00 - 07:2907:30 - 07:5908:00 - 0...
93089308คู่มือสำหรับการใช้งานสามารถดาวน์โหลดได้ที่ : h...
1165311653* Quantity : จำนวน Unit : กรุณาเลือกหน่วย CCM/...
1463214632ติดตามผลงานได้ที่ = https://www.facebook.com/D...
1463414634รายการอัลบั้ม :: ภาพที่ส่งล่าสุด :: คำวิจารณ์ภ...
1844318443ยินดีต้อนรับ เข้าสู่วิทยาลัยการอาชีพนครศรีธรรม...
2471924719การประกาศตัวแปรแบบอาร์เรย์ ชนิดตัวแปร ชื่อตัวแ...
2602626026+แบบใบลา ใบลาพักผ่อน\\tใบลาป่วย/กิจ/คลอด ใบลาอุ...
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n","
\n"," "]},"metadata":{},"execution_count":39}]},{"cell_type":"code","source":["CLEAN_TEXT_TEST_CASES = [\n"," {\n"," \"new_doc\": \"น้องม่อน กินข้าววันไหนดี\",\n"," \"doc\": \"Posted by: น้องม่อน กินข้าววันไหนดี\",\n"," },\n"," {\n"," \"new_doc\": \"1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา\",\n"," \"doc\": \"1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา\",\n"," },\n"," {\n"," \"new_doc\": \"\",\n"," \"doc\": \"ถูต่ำลงนิด ต่อชีวิตเรียวกังรับแขกเข้าโรงแรมเลยจับดูดควย ดูดควยต่อชีวิตทำให้โรงแรมอยู่รอดต่อไปได้ฟินเวอร์ หนังโป๊ญี่ปุ่น หนังav ID:STARS-230 แสดงโดย Honjou Suzu\",\n"," },\n"," {\n"," \"new_doc\": \"\",\n"," \"doc\": \"\"\"const buttons=document.querySelectorAll('button');buttons.forEach(button=>{button.addEventListener('click',()=>{const randomColor=Math.floor(Math.random()*16777215).toString(16);document.body.style.backgroundColor=\"#\"+randomColor;const messages=[\"You clicked a button!\",\"Nice job!\",\"Wow, you're on a roll!\",\"Keep it up!\"];const randomIndex=Math.floor(Math.random()*messages.length);alert(messages[randomIndex]);});});let secondsLeft=60;const countdown=setInterval(()=>{if(secondsLeft>0){console.log(`${secondsLeft} seconds left`);secondsLeft--;}else{console.log(\"Time's up!\");clearInterval(countdown);}},1000);const name=prompt(\"What's your name?\");const welcomeMessage=document.createElement('h1');welcomeMessage.textContent=`Welcome, ${name}!`;document.body.appendChild(welcomeMessage);\"\"\",\n"," },\n"," {\n"," \"new_doc\": \"บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล\",\n"," \"doc\": \"หน้าหลัก | ติดต่อเรา | สถานที่ตั้ง บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล\",\n"," },\n"," {\n"," \"new_doc\": \"\",\n"," \"doc\": \"บ ิ ต ค อ ย น ์ ( B i t c o i n ) ห ร ื อ B T C ค ื อ ส ก ุ ล เ ง ิ น ด ิ จ ิ ทั ล ( C r y p t o c u r r e n c y ) ส ก ุ ล แ ร ก ข อ ง โ ล ก ที่ ถู ก สร้ าง ข ึ้ น บ น “ บ ล็ อ ก เ ช น ” ( B l o c k c h a i n ) ซ ึ่ ง เ ป็ น เ ท ค โ น โ ล ยี ที่ ใ ช้\",\n"," },\n"," {\n"," \"new_doc\": \"มัสก์เกิดและเติบโตในพริทอเรีย ประเทศแอฟริกาใต้ เขาเข้าเรียนที่มหาวิทยาลัยพริทอเรีย ก่อนย้ายไปประเทศแคนาดาเมื่ออายุ 17 ปี โดยได้รับสัญชาติผ่านมารดาที่เกิดในแคนาดา สองปีต่อมา เขาเข้าเรียนที่มหาวิทยาลัยควีน และย้ายไปเรียนที่มหาวิทยาลัยเพนซิลเวเนีย ซึ่งเขาได้รับปริญญาตรีสาขาเศรษฐศาสตร์และฟิสิกส์ เขาย้ายไปอยู่ที่แคลิฟอร์เนียในปี ค.ศ. 1995 เพื่อเข้าเรียนที่มหาวิทยาลัยสแตนฟอร์ด แต่ลาออกหลังจากเข้าเรียนได้สองวันเพื่อประกอบอาชีพทางธุรกิจแทน โดยร่วมก่อตั้งบริษัทซอฟต์แวร์เว็บชื่อ ซิป2 กับ คิมบัล มัสก์ น้องชายของเขา; บริษัทถูกซื้อโดยคอมแพค ในราคา 307 ล้านดอลลาร์สหรัฐในปี ค.ศ. 1999 ในปีเดียวกันนั้น มัสก์ได้ร่วมก่อตั้งธนาคารออนไลน์ชื่อ เอ็กซ์.คอม ซึ่งควบรวมกับบริษัท คอนฟินิตี้ ในปี ค.ศ. 2000 เพื่อก่อตั้งบริษัทเพย์แพล อีเบย์ซื้อกิจการเพย์แพลในปี ค.ศ. 2002 ด้วยมูลค่า 1.5 พันล้านดอลลาร์สหรัฐ\",\n"," \"doc\": \"\"\"มัสก์เกิดและเติบโตในพริทอเรีย ประเทศแอฟริกาใต้ เขาเข้าเรียนที่มหาวิทยาลัยพริทอเรีย ก่อนย้ายไปประเทศแคนาดาเมื่ออายุ 17 ปี โดยได้รับสัญชาติผ่านมารดาที่เกิดในแคนาดา สองปีต่อมา เขาเข้าเรียนที่มหาวิทยาลัยควีน และย้ายไปเรียนที่มหาวิทยาลัยเพนซิลเวเนีย ซึ่งเขาได้รับปริญญาตรีสาขาเศรษฐศาสตร์และฟิสิกส์ เขาย้ายไปอยู่ที่แคลิฟอร์เนียในปี ค.ศ. 1995 เพื่อเข้าเรียนที่มหาวิทยาลัยสแตนฟอร์ด แต่ลาออกหลังจากเข้าเรียนได้สองวันเพื่อประกอบอาชีพทางธุรกิจแทน โดยร่วมก่อตั้งบริษัทซอฟต์แวร์เว็บชื่อ ซิป2 กับ คิมบัล มัสก์ น้องชายของเขา; บริษัทถูกซื้อโดยคอมแพค ในราคา 307 ล้านดอลลาร์สหรัฐในปี ค.ศ. 1999 ในปีเดียวกันนั้น มัสก์ได้ร่วมก่อตั้งธนาคารออนไลน์ชื่อ เอ็กซ์.คอม ซึ่งควบรวมกับบริษัท คอนฟินิตี้ ในปี ค.ศ. 2000 เพื่อก่อตั้งบริษัทเพย์แพล อีเบย์ซื้อกิจการเพย์แพลในปี ค.ศ. 2002 ด้วยมูลค่า 1.5 พันล้านดอลลาร์สหรัฐ\"\"\",\n"," },\n"," {\n"," \"new_doc\": \"คาบิกอน หรือ Snorlax เป็นโปเกมอนที่มีลักษณะคล้ายหมีตัวใหญ่ มีผิวสีน้ำเงินเข้มอมเขียว ใบหน้า หน้าท้องและเท้ามีสีครีม ลำตัวประกอบด้วยหน้าท้องเป็นส่วนใหญ่เนื่องจากแขนขาค่อนข้างเล็ก ซึ่งพุงป่อง ๆ ของมันมีไว้เพื่อเก็บพลังงานสำรองนั่นเอง มันมีหัวโต หูตั้ง และดวงตาที่เหมือนกับกำลังนอนหลับตลอดเวลา และมีฟันเขี้ยวแหลม 2 ซี่ที่ยื่นออกมาจากขากรรไกรล่าง โดยทั่วไปแล้วคาบิกอนจะมีความสูงประมาณ 2 เมตร และมีน้ำหนักประมาณ 450 กก.\",\n"," \"doc\": \"\"\"คาบิกอน หรือ Snorlax เป็นโปเกมอนที่มีลักษณะคล้ายหมีตัวใหญ่ มีผิวสีน้ำเงินเข้มอมเขียว ใบหน้า หน้าท้องและเท้ามีสีครีม ลำตัวประกอบด้วยหน้าท้องเป็นส่วนใหญ่เนื่องจากแขนขาค่อนข้างเล็ก ซึ่งพุงป่อง ๆ ของมันมีไว้เพื่อเก็บพลังงานสำรองนั่นเอง มันมีหัวโต หูตั้ง และดวงตาที่เหมือนกับกำลังนอนหลับตลอดเวลา และมีฟันเขี้ยวแหลม 2 ซี่ที่ยื่นออกมาจากขากรรไกรล่าง โดยทั่วไปแล้วคาบิกอนจะมีความสูงประมาณ 2 เมตร และมีน้ำหนักประมาณ 450 กก. \"\"\",\n"," },\n","]"],"metadata":{"id":"tpTKvOFFzwGm"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["docs = []\n","new_docs = []\n","for i in CLEAN_TEXT_TEST_CASES:\n"," docs.append(i[\"doc\"])\n"," new_docs.append(i[\"new_doc\"])"],"metadata":{"id":"UFRYln9G0lX4"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["testcases = []\n","import random\n","import numpy as np\n","for i in range(10):\n","\n"," n = np.random.randint(1,5,1)\n"," arr = np.random.choice(8, n, replace=False)\n","\n"," selected_docs = []\n"," selected_new_docs = []\n","\n"," for d in arr :\n"," selected_docs.append(docs[d])\n"," if new_docs[d]!=\"\":\n"," selected_new_docs.append(new_docs[d])\n"," \n"," testcases.append({\"dataset\":selected_docs,\"new_dataset\":selected_new_docs})\n","\n","testcases"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"oKc5SJhE0nR2","executionInfo":{"status":"ok","timestamp":1683058057382,"user_tz":-420,"elapsed":5,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"815f5543-70e9-4da4-8d3b-562e502a35a7"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[{'dataset': [2, 4, 6, 0], 'new_dataset': [4, 6, 0]},\n"," {'dataset': [0, 6, 3, 1], 'new_dataset': [0, 6, 1]},\n"," {'dataset': [6], 'new_dataset': [6]},\n"," {'dataset': [3, 1], 'new_dataset': [1]},\n"," {'dataset': [2, 5, 3], 'new_dataset': []},\n"," {'dataset': [2, 5, 7, 4], 'new_dataset': [7, 4]},\n"," {'dataset': [5, 3, 7, 2], 'new_dataset': [7]},\n"," {'dataset': [2, 4, 3], 'new_dataset': [4]},\n"," {'dataset': [4], 'new_dataset': [4]},\n"," {'dataset': [2, 6, 5], 'new_dataset': [6]}]"]},"metadata":{},"execution_count":37}]},{"cell_type":"code","source":["tqdm.pandas()\n","df[\"clean_text\"] = df[\"text\"].progress_apply(clean_text)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"-SLXqdKcbuRP","executionInfo":{"status":"ok","timestamp":1683050365447,"user_tz":-420,"elapsed":65570,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"42c1df5b-cc8b-4cfb-8ff3-ff3d8b076de4"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 30001/30001 [01:05<00:00, 458.97it/s]\n"]}]},{"cell_type":"code","source":["pattern = '|'.join(PORN_KEYWORDS)\n","for i in df[df[\"text\"].str.contains(pattern)].sample(3)[\"text\"]:\n"," print(\"row\")\n"," print([i])\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"PwPPdi--oEi1","executionInfo":{"status":"ok","timestamp":1683050739806,"user_tz":-420,"elapsed":3978,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b8eb4fc5-6baf-4540-a479-8034eeae7fd0"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["row\n","['แอบถ่ายคลิปเสียวๆจากทางบ้าน เย็ดลูกสาวป้า วัยกำลังเงี่ยนมาก ครางได้เร้าใจมาก จัดไปหนึ่งดอกแบบแตกนอก ฟินใหญ่เลย | หนังโป๊ แอบถ่าย เย็ดกัน คลิปหลุด คลิปโป๊ หนังx\\nHome \\\\ คลิปโป๊ \\\\ แอบถ่ายคลิปเสียวๆจากทางบ้าน เย็ดลูกสาวป้า วัยกำลังเงี่ยนมาก ครางได้เร้าใจมาก จัดไปหนึ่งดอกแบบแตกนอก ฟินใหญ่เลย\\nแอบถ่ายคลิปเสียวๆจากทางบ้าน เย็ดลูกสาวป้า วัยกำลังเงี่ยนมาก ครางได้เร้าใจมาก จัดไปหนึ่งดอกแบบแตกนอก ฟินใหญ่เลย\\nหนังโป๊ แอบถ่าย คลิปหลุด แอบถ่ายคลิปเสียวๆจากทางบ้าน เย็ดลูกสาวป้า วัยกำลังเงี่ยนมาก ครางได้เร้าใจมาก จัดไปหนึ่งดอกแบบแตกนอก ฟินใหญ่เลย คลิปโป๊ หนังx\\nคลิปโป๊ คลิปหลุด แอบถ่ายคลิปเสียวๆจากทางบ้าน เย็ดลูกสาวป้า วัยกำลังเงี่ยนมาก ครางได้เร้าใจมาก จัดไปหนึ่งดอกแบบแตกนอก ฟินใหญ่เลย แอบถ่าย Xxx วิดีโอแอบถ่ายฉันจากบ้าน ผมมีเพศสัมพันธ์หนุ่มสาวมีเขามากเสียงสวดดอกไม้เร้าใจมากเป็นเพียงหนึ่งในปลาใหญ่ Porn วิดีโอที่ถูกแอบถ่ายในบ้าน ฉันลูกสาวร่วมเพศคนหนุ่มสาวมีครวญครางร้อนมากเป็นดอกไม้เร้าใจมากเป็นเพียงปลาใหญ่']\n","row\n","['ฝรั่งหื่นโทรเรียกเด็กมาเย็ดที่แต่ดีนะไม่ชอบเย็ดแต่แม่งให้อมจนเส็รจน้องบอกอมจนเมื่อยคนกว่าจะเสร็จเล่นสะปวดคอเลย\\nหนังโป๊เอเชียสาวเกาหลีอวบขาวโดนเลียหีร้องลั้นสงสัยเสียวหีจัดยิ่งโดนกระแทกด้วยควยร้องเสียวมากใด้อารมณ์สุดเลยเธอคนนี้\\nหนังโป๊นะ!นึกว่าหนังสงครามเย็ดแม่งโคตรโหดจับแหกหีเลียดูดแตดแล้วกระเด้าแรงๆดูแล้วแม่งเสียวควยมึงหักจริงๆแต่เสียวสุดๆอ่ะ\\nผู้หญิงเธอบอกชอบผู้ชายควยใหญ่ยาวเวลาโดนกระแทกมันเสียวซื๊ดที่หีมากๆยิ่งโดนหนักๆแรงๆเธอบอกเสียวหีสะใจเธอมากค่ะ\\nสาวนมใหญ่ xxxx สุดเงี่ยนอ่อยหนุ่มเช็ดกระจกเลยชวนมาเย็ดในบ้านโครตเด็ด เจอควยใหญ่กระแทกหีหายเงี่ยนเลยป่ะล่ะเงี่ยนดีนัก\\nพริตตี้สาวสวย น้องถุงแป้ง!ก่อนมาเป็นพริตตี้เธอขายตัวมาก่อนคลิปเธอกำลังดังโดนฝรั่งซื้อตัวมาเย็ดในโรงแรมแล้วถ่ายคลิปแต่หลุดโดนแหกหีเลียเสียวสุดๆ\\nโป๊ญี่ปุ่นxxxx เห็นแค่ลีลาก็ชวนให้เสียวแล้วยิ่งเห็นนมเล็กน่าเย็ดจริงๆลีลามาแบบจัดเต็มกระแทกใส่กันแบบไม่ยั้งแม่งโคตรเสียว']\n","row\n","['ขอเย็ดกันดื้อ ๆ แบบนี้เลย เพื่อนน้องสาวนมอย่างใหญ่อะ แค่เห็นนมก็เงี่ยนแล้วว | รวมคลิปโป๊ฟรี คลิปpornหนังโป๊ใหม่ xxxเน็ตไอดอลน่ารัก คลิปหลุดจากเฟสบุ๊คในกลุ่มลับเฉพาะ | atpl59.ru\\nหนังโป๊ | หนังโป๊ฝรั่ง | ขอเย็ดกันดื้อ ๆ แบบนี้เลย เพื่อนน้องสาวนมอย่างใหญ่อะ แค่เห็นนมก็เงี่ยนแล้วว\\nหนังโปนองใหม สาวไทยโดนฝรั่งเย็ดตูด รวมหนังxxxแนวคนแก่เย็ดหีเด็ก มันๆ หนังโป๊วัยรุ่นเย็ดกัน pornโกนหมวยให้เมีย เย็ดเมีย2คน เย็ดพนักงานใหม่ เย็ดกับผัวบ้านๆ ดาราโป๊ หนังเกย์เวียดนามน้ำแตกเยอะมาก ฝรังเย็ดสาวเอเชีย หีไท เย็ดแก่วัยทอง pornเย็ดหีสาวให่ย หนังโป๊ไทยจัดหนังต่างชาติ pornไทยขายบริการ2018 สาวเวียดนามขายตัวให้ฝรั่ง หนังโป๊ไทยจัดหนังต่างชาติ หนังโป๊คิดตี้มิยาบิ หีสวยควยแทง หนังเอ๊กชนักเรียนญี่ปุ่น สาวไทยเย็ดกับฝรั่ง คลิปโป๊ลูกเ***ห*แม่ สาวจีนอวบขาวหีสวยแตกใน สาวสวยนมเล็กxxx เกตี๋ขาวอมควย เย็ดสาวสวยเมา ฝรั่งเย็ดสาวหน้าหวานไทย redtobe xxx อึบสองสาวอวบ ดูคลิปโป๊ฟรีใหม่มัน youpornt xxx หนังโปเกาหลี คลิปโป๊ เซ็กกลุ่ม แลกน้องสาวกัน หนัง av เย็ดถุงแตก เย็ดหีใหญ่ เย็ดที่บ้านพับรินทะเล คลิปโป๊ญี่ปุ่นแตกใน มียโดนเย็ดแตกใน ฝรั่งสาวสวยเงี่ยนช่วยตัวเองใหม่ๆ กินน้ำหี เพื่อนอยู่ดวย้ยังเย็ด xxxเงี่ยนสามีไม่อยู่เย็ดกับคนใช้ ใช้ sex toy ช่วยตัวเอง หนังเอ็กซ์นมสวย ดูคลิปxญีปุ่ดพ่อเย็กหีเด็กข้าบ้านดูฟรี mobile 3gp แนวข่มขืน โหลดได้ สาวแว่น korea xxx หนังเกย์เวียดนามน้ำแตกเยอะมาก ควย นายเคน เย็ดฝรุ้ง หนังโป็ญืปุ่นลูกเย็ดหืแม่ ro89 แอบถ่ายสาวช่วยตัวเองเอ็กร์ๆๆไทยๆๆ xxxกระหรี่ๆไทยจัดฟันหัวนมเข้ท เย็ดแม่ยายคนเอเชียแบบมัน ฝรั่งสวยชักว่าวในรถ คริปโป้กินน้ำอสุจิ www.xxx.com.ปู.xx เพื่อนอยู่ดวย้ยังเย็ด คลิปโป้เย็ดสาวจีนคาชุด เกย์นักเรียนเอเชียดูดควยกันเอง หนังโป๊ไทยเวลาผู้หญิงไปสักหี หนังavคลิปเย็ดไทย เกย์ไทยเพื่อนเก่า แม่พาลูก เข้าม่านรูด porn คลิปโป้ฟรี พริิิิตน่าเย็ด jizzสาวไทยพัทยา']\n"]}]},{"cell_type":"code","source":["df.sample(20)[[\"clean_text\"]]"],"metadata":{"id":"x2LwHHZiQhhL"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["!pip install transformers \n","from transformers import AutoTokenizer\n","\n","t5_tokenizer = AutoTokenizer.from_pretrained(\"google/mt5-base\")\n","def len_tokenized(text):\n"," return len(t5_tokenizer(text)[\"input_ids\"])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":495,"referenced_widgets":["68b8492a512f4f2186b451cfc29be6c5","509267521f3d4d8986defc3c20d73ee3","9111cecf899f45f19dfab6278bb6fbf2","6f7b1d23a83c4a6cb3c82edf4839cd51","1a86a0ef9dbf457bbe8d7636488423fb","6930c369a7a94c3dba6c71efcde42ab3","695f189c0a934d618e5e235f8dba8ed1","8093712e759c43079f1f03517697e995","fac0401829634e2d8b2aae0009ff9f61","53ba538018a143b9a023c56eb111ef43","5b61268a721d4df89ed01c2233feffd4","bc182cffc867494a82445a255e87e65f","40f7fbd1cede409a955d2a978711dd54","43b617a7e5ff4e0294436717e207a4d9","8c326b3c08c04cec9b111c96411d72a1","0ac9528c3cb444aaafce65ede6b2a7c5","8cb23b82275e4987bcfd297061535a7f","055b6e2827c24948b3806947b3fa1b61","8ba1d4f2af3440a7a6ecaeabbca7d995","2628fb5a45ff4b069e88528a7dc5fb0b","6bce0d39756f41cea61384451d799532","cce329b5769d4b5395ad33de75283d0e","8e971813939047878cbeacaccf58bd03","49ce216c3f684ddd8c09834e9aaa10d7","2be607c544154c85bddd5dbbaba8850d","baccd59d7e824a568dadfa66f6cf4f3a","cbfcb2e011724b4c9e8c783851f5d94a","9f1e6645fcb24f05be3cb6c051ab4428","a31a3645d9784e4295d6e2d556e73fca","74c66b312c64458a9258f0969ef77218","86b7865deff64ba9af78a0d7ee2251ad","02ab2a15576445f58bc11e5e13d246f2","a7b9f1b7dc3d42e4bb54dd624167bcbb","8ff7df23ac54492c86cf99edddeb78a7","e05957e3e53e45f1ae08e33f1995da12","c1a8d68bf98943eb801ab5654ba3969e","31b1f154ff9c45c19f7be8945db7c933","e3ef52636566473599869d4da18bd268","7e92d491f26542858b272482e36e3e4b","4f1540c6fdc34b809a4a3ab933278f73","351ca766f2114b99899f3f7bd7de75ca","6095426ae3c84c82894a5807ca8a1bff","c606805481d34693a21c9be6b2a8c43a","61fedb237ea64de78d007563118ce509"]},"id":"23m0dXwvbwIZ","executionInfo":{"status":"ok","timestamp":1682765832297,"user_tz":-420,"elapsed":17995,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"46ea002c-439f-4c8b-abd8-7afcf94320fd"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: transformers in /usr/local/lib/python3.10/dist-packages (4.28.1)\n","Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n","Requirement already satisfied: tokenizers!=0.11.3,<0.14,>=0.11.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.13.3)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n","Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n","Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.24.3)\n","Requirement already satisfied: huggingface-hub<1.0,>=0.11.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.14.1)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n","Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (2023.4.0)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)\n"]},{"output_type":"display_data","data":{"text/plain":["Downloading (…)okenizer_config.json: 0%| | 0.00/376 [00:00\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtext
115115นางเอกคลิปโป๊ วัยใส น่ารัก สดใส Suzu Harumiya ...
422422xxxxรูหีอะไรจะฟิตขนาดนี้หีน้องเมียนี่พี่เขยสุด...
435435แชร์ทั่วเน็ต! ทหารสละที่นั่งตัวเอง ให้กับผู้หญ...
596596“Mola mola Sunshine!” เป็นโปรเจคพิเศษของ “ด่อง...
672672Porn | แหล่งรวมคลิปโป๊ XXX ภาพโป๊ หนังX แอบถ่า...
.........
2926829268หลุดจากเฟสส่วนตัวเลยครับ คลิปPrivat ผัวเมียถ่า...
2970129701สอนเล่นโยคะ กลายเป็นเย็ดคะ สะงั้นก้มอมควยใหญ่ม...
2972929729น้องเขาควักหีซะน้ำเงี่ยนเต็มหี น้ำแตกสดๆคาห้อง...
2975629756ฝรั่งเลียหี | ดูหนังโป๊ฟรีออนไลน์ คลิปโป๊xxxนั...
2996129961ครั้งแรกที่โดนแฟนข่มขืนเจ็บมาก - ประสบการณ์เสี...
\n","

439 rows × 2 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":45}]},{"cell_type":"code","source":["df.iloc[96][\"text\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":243},"id":"ehgrYT2Iq1R_","executionInfo":{"status":"ok","timestamp":1680333308218,"user_tz":-420,"elapsed":8,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"d0c355f5-4750-46ab-fc2f-4e7cf5795bff"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'นักแข่งดาวรุ่งชาวไทย “ แสตมป์ ” อภิวัฒน์ วงศ์ธนานนท์ กำลังจะลงแข่งขัน ในการแข่งขันรถจักรยานยนต์ทางเรียบชิงแชมป์โลก โมโตจีพี 2018 เว็บบอล\\nเว็บบอลนักแข่งไทยหมายเลข 9 จาก วีอาร์46 มาสเตอร์ แคมป์ ทีม “ แสตมป์ ” อภิวัฒน์ วงศ์ธนานนท์ เตรียมตัวแข่งขันความเร็วในสนามที่ 18 ทีกำลังจะจัดขึ้นในระหว่างวันที่ 2 – 4 พฤศจิกายน 2561 โดยการแข่งขันในครั้งนี้จะจัดขึ้นที่สนามเซปัง อินเตอร์เนชั่นแนล เซอร์กิต ประเทศมาเลเซีย ในรายการ มาเลเซียน กรังด์ปรีซ์ ซึึ่งทาง “ แสตมป์ ” อภิวัฒน์ วงศ์ธนานนท์ นักแข่งไทย สังกัด Yamaha Thailand Racing Teamเว็บบอลหมายเลข 9 จะเข้าร่วมการแข่งขันในครั้งนี้ ด้วยสิทธิ์ไวลด์การ์ดในรุ่นโมโตทรี เวิลด์ แชมเปียนชิพ ในสังกัดวีอาร์ 46 มาสเตอร์ แคมป์ ทีม ซึ่งก่อนหน้านี้ทางด้าน “ แสตมป์ ” อภิวัฒน์ วงศ์ธนานนท์ ได้สร้างผลงานอันยอดเยี่ยมไว้ในรายการเอฟไอเอ็ม ซีอีวี โมโตทรี จูเนียร์ เวิลด์ แชมป์เปียนชิพ 2018 ที่นับว่าเป็น นักแข่งของไทยคนแรกที่ได้ขึ้นโพเดียมของรายการนี้ และล่าสุดเขากเพิ่งจะคว้าชัยในอันดับที่ 4 จากการแข่งขันที่อัลบาเซเต ประเทศสเปน อีกด้วย ก่อนหน้านี้ “ แสตมป์ ” อภิวัฒน์ วงศ์ธนานนท์ เคยได้รับสิทธิ์ไวลด์การ์ด เข้าร่วมในการแข่งขันโมโตทรี เวิลด์ แชมเปียนชิพ มาแล้ว 1 ครั้ง ที่จัดขึ้นบริเวณ สนามช้าง อินเตอร์เนชั่นแนล เซอร์กิต ในรายการพีทีที ไทยแลนด์ กรังด์ปรีซ์ เมื่อช่วงต้นเดือนตุลาคมที่ผ่านมา โดยนับว่าเขาเป็นนักแข่งไทยที่คว้ากริดสตาร์ตได้ดีที่สุด และจบการแข่งขันด้วยการคว้าอันดับ 16 ซึ่ง “ แสตมป์ ” อภิวัฒน์ วงศ์ธนานนท์ ก็ได้กล่าวว่า รู้สึกดีใจและภูมิใจมากที่ได้รับโอกาสจาก บริษัท ไทยยามาฮ่ามอเตอร์ จำกัด ที่มีการสนับสนุนให้ลงแข่งเรซระดับโลกอีกครั้ง ในการแข่งขัน โมโตทรี ด้วยสิทธิ์ไวลด์การ์ดครั้งที่ 2 ซึ่งจะลงแข่งในสุดสัปดาห์นี้ โดยตนเองนั้นเคยลงแข่งที่นี่มาก่อนแล้ว จึงเชื่อว่าจะทำผลงานออกมาได้ดีแน่นอน และตอนนี้เราก็ทำงานกันอย่างหนักและมีความต่อเนื่องอย่างมากในการเซ็ตอัพรถแข่งอีกทั้งยังต้องปรับตัวให้เข้ากับการแข่งขันโมโตทรีอีกด้วย โดยเชื่อว่าในส่วนของข้อมูลรถมีความพร้อมมากกว่าเดิม และการแข่งขันระดับโลกยังคงเป็นงานยากเสมอ แต่จะตั้งใจมากๆ เพื่อตอบแทนกำลังใจจากแฟนๆ ชาวไทย และจะสู้เกินร้อย เพื่อเก็บแต้มมาฝากทุกคน แทงบอลไทยลีค'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":11}]},{"cell_type":"code","source":["df.iloc[28][\"text\"]\n"," "],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":330},"id":"fS1Yj5bNqeZN","executionInfo":{"status":"ok","timestamp":1680333277162,"user_tz":-420,"elapsed":437,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"2f6ac606-3317-41a7-f938-7a7e81aec592"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'กระติเตียนบข้าวหมายถึงภาชนะสำหรับเพื่อการ แทงบอล เก็บของกินที่เป็นงานฝีมืออันมีคุณค่าประเภทหนึ่งที่มากด้วยภูมิปัญญาพื้นบ้าน เป็นของที่มีประจำบ้านของคนประเทศไทยทางภาคอีสานและก็ภาคเหนือมายาวนาน ใช้สำหรับใส่ข้าวเหนียวที่นึ่งสุกแล้วหรือใช้เก็บเมล็ดพันธุ์พืช หรือแม้กระทั้งใช้เป็นเครื่องเพชรพลอยในครอบครัวหรือตกแต่งสถานที่ต่างๆเป็นเครื่องหัตถกรรมที่ทำมาจากอุปกรณ์ธรรมชาติ ตัวอย่างเช่น ไผ่ ใบจาก แทงบอลโลก ใบตาล ใบลาน ต้นคล้า หรือ จากต้นพืชที่มีลักษณะยาวเรียว\\nการถักกระตำหนิบเป็นงานฝีมือที่มีพื้นฐานมาจากสังคมทำการเกษตร แล้วก็ค่าความนิยมสำหรับการบริโภคข้าวเหนียวเป็นของกินหลักของคนประเทศไทยในภาคอีสานและก็ภาคเหนือ ตอนแรกภาชนะที่ใช้ใส่ข้าวเหนียวมักทำมาจากต้นไม้ต้นเล็กๆเอามาเจาะลำต้นให้กลวงแล้วตัดเป็นท่อนขนาดสั้นๆเป็นกระบอก มีฝาปิด หรือบางเวลาก็ใช้ไผ่มาตัดเป็นกระบอกสั้นๆเอามาเป็นภาชนะใส่ข้าวเหนียว ถัดมามีการคิดถึงจำนวนไผ่ในพื้นที่ซึ่งมีมากมายบ้างน้อยบ้างและก็ความสบาย ถ้าเกิดนำต้นไผ่มาอีกทั้งต้นแบบเดิมต้นไผ่ก็บางครั้งอาจจะไม่พอต่อการใช้แรงงาน ทั้งภาชนะใส่ข้าวเหนียวต้นแบบเดิมก็งุ่มง่าม นำพาไม่สบายสำหรับเพื่อการเดินทางไกล\\nก็เลยมีการเริ่มนำเอาไผ่มาผ่าเป็นด้านเล็กๆมาเหลาเป็นแผ่นบางๆเอามาจักสานเป็นกระเช้ากระบุง ใส่ข้าวสาร และก็ปรับปรุงนำไผ่มาจักสานมาเป็นภาชนะใส่ข้าวเหนียว (กระตำหนิบ) ซึ่งมีน้ำหนักค่อยรวมทั้งระบายอากาศได้ดิบได้ดีทำให้ละอองน้ำระเหยออกไปได้ ซึ่งจะก่อให้ข้าวเหนียวที่ใส่อยู่ข้างในยังมีความร้อนแล้วก็ข้าวไม่เฉอะแฉะด้วยละอองน้ำ นำเอาง่ายเนื่องจากมีการทำสายสะพาย ทั้งยังยังมีหลายต้นแบบ ทรงกลม ทรงรี นานาประการขนาดสอดคล้องกับการใช้แรงงานเป็นกระตำหนิบขนาดเล็กสำหรับใส่ข้าวเหนียวสำหรับกินผู้เดียว ขนาดกึ่งกลางสำหรับกิน 2-3 คน ขนาดใหญ่สำหรับกินครอบครัว ฯลฯ\\nซึ่งผู้สานจะใช้ช่วงว่างภายหลังจากกระบวนการทำไร่ทำไร่ทำนา เลือกใช้ทรัพยากรธรรมชาติซึ่งหาได้ในเขตแดนมาผลิตเป็นเครื่องหัตถกรรม เพื่อความสำราญ สนุกสนานเพลิดเพลินเจริญใจสำหรับในการจับกลุ่มกันดำเนินการหัถกรรม ตลอดจนตอบสนองผลดีใช้สอยในครอบครัวของตนแล้วก็สมาชิกในครอบครัว การถักกระตำหนิบเป็นงานที่ชอบปฏิบัติกันข้างในครอบครัวหรือชุมชน ซึ่งภายหลังทานอาหารเย็นแล้ว คนภายในครอบครัวจะมารวมกันเพื่อช่วยเหลือกันดำเนินงาน ส่งผลให้เกิดความอบอุ่น สมัครสมานสามัคคีเนื่องจากว่าเมื่อมารวมตัวกันดำเนินงาน ก็จะมีการเปลี่ยนคุยกันถึงเรื่องวิถีชีวิตชีวิตความเป็นอยู่ในทางมุมต่างๆตลอดจนสอนลูกสอนหลานไปด้วย\\nนำไปสู่ให้เป็นความคิดท้องถิ่นที่สืบทอดรวมทั้งสืบต่อกันมาจากรุ่นสู่รุ่น แบบอย่างสินค้าเครื่องหัตถกรรมก็เลยเป็นศิลปหัตถกรรมพื้นเมืองที่มีความ สวยบริสุทธิ์แบบธรรมชาติ สะท้อนถึงอิสรภาพรวมทั้งการแสดงออกถึงความฉลาดรวมทั้งความรู้ความเข้าใจของผู้จักสาน ทำให้รู้คุณประโยชน์ทางอารธรรมสำหรับเพื่อการรู้เรื่องใช้อุปกรณ์ธรรมชาติให้กลมกลืนกับสิ่งแวดล้อมของการดำรงอยู่ ทั้งยังยังคงไว้ซึ่งเอกลักษณ์ทางด้านวัฒนธรรมที่ตกทอดกันมาอย่างนานอีกด้วย'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":10}]},{"cell_type":"code","source":["df.iloc[2899][\"text\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":70},"id":"aLZqqsBQ1vGw","executionInfo":{"status":"ok","timestamp":1680160475609,"user_tz":-420,"elapsed":30,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b94d3411-8e11-466e-dfcf-ff936af2054e"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'János Kádár, Bucharest, 1970s, Street, subway, car, church, buildings, rendőrség.konvoj, celebrating มวล Ceaucesco เจรจา รับรองเอกสาร อสังหาริมทรัพย์ บ้าน ตลาด ร้านค้า โรงงาน koccintás, Ceausesco สภาพูด Ceaușescu Kádár,'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":7}]},{"cell_type":"code","source":["df.iloc[5587][\"text\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":226},"id":"srFbo5032RV8","executionInfo":{"status":"ok","timestamp":1680160475610,"user_tz":-420,"elapsed":29,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"9630d917-faa5-4525-b552-a7051db4b04d"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["\"Tags: เด็กเก่ง , เครื่องกระดาษกงเต๊ก , เก็บเงินค่าเทอม , เด็ก10ขวบ , ดช.ธีรวงศ์ หงษ์คำ , lifestyle , Showroom ,\\nTags: ของขวัญ , ของขวัญ diy , ของขวัญวาเลนไทน์ , วันวาเลนไทน์2561 , วันวาเลนไทน์2018 , วาเลนไทน์ , lifestyle , Showroom ,\\nTags: onet61 , เทคนิคสอบ , สอบเข้ามหาวิทยาลัย , แอปพลิเคชั่นสอบ , การสอบ , ตัวช่วยในการสอบ , เตรียมตัวสอบ , onet , gat pat61 , 7วิชาสามัญ ,\\nTags: วาเลนไทน์ , ของขวัญวันวาเลนไทน์ , ของขวัญ , การ์ด , วันวาเลนไทน์ , การ์ดวันวาเลนไทน์ , การ์ดวาเลนไทน์ , valentine's daycards , valentine's day , lifestyle ,\\nTags: อุทยานวิทยาศาสตร์ ณ หว้ากอ , อุทยานหว้ากอ , หว้ากอ , เฌอปราง , หมอแล็บ , กระทรวงศึกษาธิการ , กระทรวงวิทยาศาสตร์ , lifestyle , Showroom ,\\nTags: นายเปรมชัย กรรณสูต , บุกรุกพื้นที่ป่า , คดีล่าเสือดำ , ล่าสัตว์ , นักอนุรักษ์ , วิเชียร ชิณวงษ์ , สืบ นาคะเสถียร , หมอล็อต ภัทรพล มณีอ่อน , หมอเบนซ์ เบญจพล หล่อสัญญาลักษณ์ , ติ๊ก เจษฎาพร ผลดี ,\\nTags: เนื้อย่าง , เนื้อย่างญี่ปุ่น , เนื้อย่าง 7 สี , ถ่ายรูปแปลกๆ , ถ่ายรูป instagram , ig , instagram , instabae , ญีปุ่่น , วัยรุ่น ,\\nTags: สนามเด็กเล่น , tcdc , แหล่งเรียนรู้ , เด็ก , เยาวชน , สนามเด็กเล่นอัจฉริยะ , สสส. , lifestyle , Showroom ,\\nTags: การ์ตูนญี่ปุ่น , การ์ตูนสัญลักษณ์ญี่ปุ่น , เซเลอร์มูน , ก็อตซิลล่า , กันดั้ม , โทโทโร่ , โกคู , คิ๊ตตี้ , อันปันแมน , มาริโอ้ ,\\nTags: โรงพยาบาลกันตัง , โรงพยาบาลตากใบ , คุกกี้เสี่ยงทาง , bnk48 , koisuru fortune cookie , คัฟเวอร์ , เต้นคัฟเวอร์ , lifestyle , Showroom ,\\nTags: ชุดแฟชั่น , ความเป็นไทย , กระแสโซเชี่ยล , กีกี้จูโน่ นางฟ้าบ้านนา , รีไซเคิล , reuse , recycle , lifestyle , Showroom ,\\nTags: ฝาท่อน้ำ , ญี่ปุ่น , ไอเดียญี่ปุ่น , ฝาท่อ , ท่อน้ำญี่ปุ่น , ประเทศญี่ปุ่น , lifestyle , Showroom ,\\nTags: วิศวกรรมดนตรีและสื่อประสม , วิศวกรรมดนตรี , สาขาใหม่ลาดกระบัง , ลาดกระบัง , วิศวกรรมศาสตร์ ลาดกระบัง , สาขาใหม่ , สถาบันเทคโนโลยีพระจอมเกล้าคุณทหารลาดกระบัง , วิศวกรรมศาสตร์ , lifestyle , Showroom ,\\nTags: หนังสือนิยาย , วรรณกรรม , หนังสือวรรณกรรม , วรรณกรรมน่าอ่าน , นิยายน่าอ่าน , lifestyle , Showroom ,\\nTags: การ์ดปีใหม่ , เครื่องรางนำโชค , ญี่ปุ่น , การ์ดปีใหม่ญี่ปุ่น , เครื่องรางนำโชคญี่ปุ่น , ประเทศญี่ปุ่น , ของฝาก , ของขวัญ , ของสะสม , omamori nenga ,\""],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":8}]},{"cell_type":"code","source":["df.iloc[226][\"text\"]\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":52},"id":"v4H0Sfus1hsJ","executionInfo":{"status":"ok","timestamp":1680160475611,"user_tz":-420,"elapsed":28,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"adf4121d-2ea0-4ce6-8c58-48e036f26a2e"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'《感恩的心离财富最近》徐鹤宁老师面对面分享 - SALVIA Renderer (DX10-like Software Renderer) - 中文第一计算机图形学社区OpenGPU 版权所有2007-2018 - Powered by Discuz!'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":9}]},{"cell_type":"code","source":["df.iloc[740][\"text\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":104},"id":"JKP5pi5c2oYG","executionInfo":{"status":"ok","timestamp":1680160475612,"user_tz":-420,"elapsed":28,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b703b52d-96bd-4fba-c3ee-8665669cf300"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'Main Mark: แอฟริกา , อเมริกา , เอเชีย , แคริบเบียน , ยุโรปตะวันออก , ยุโรป , ตะวันออกกลาง , ยุโรปเหนือ , โอเชียเนีย , ตลาดอื่น ๆ , ยุโรปตะวันตก , ทั่วโลก\\nชา เห็ดหลินจือ ทำจากกลีเซอสและสารสกัดจากเทคโนโลยีการสกัดขั้นสูงของ เห็ดหลินจือ มันมีรสชาติขมเล็กน้อยและหวาน การใช้งานในระยะยาวสามารถควบคุมไขมันในเลือดป้องกัน cardio-cerebral-vascular และช่วยบำรุงตับ เหมาะอย่างยิ่งสำหรับผู้ที่ทำงานภายใต้ความกดดันสูงและมีส่วนร่วมในกิจกรรมทางสังคมบ่อยๆ'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":10}]},{"cell_type":"code","source":["# WTF is this format\n","df.iloc[4835][\"text\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":226},"id":"9EhXW0_r2aUG","executionInfo":{"status":"ok","timestamp":1680160475612,"user_tz":-420,"elapsed":27,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"9b8b83d6-4389-46d6-cc39-8669d1b9e946"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["\"Sticky: [เกาหลี ]-ใหม่ [* 1080p Web-DL *]Keys To The Heart (2018) : พี่หมัดหนัก กับน้องอัจฉริยะสุดป่วน [พากย์ไทย 5.1 เท่านั้น!] [บรรยายเกาหลี (ฝัง)] [เสียงไทย From MASTER]\\n••• Mkv 1080p Web-DL ••• เสียงไทย From DVD Master. Keys To The Heart_(2018) เรื่องราวของ โจฮา นักมวยตกอับที่ปัจจุบันเป็นแค่คนแจกใบปลิว เขาได้กลับมาหาแม่ อินซุก ในรอบ 17 ปี ผู้ที่เคยทิ้งเขาไปเมื่อยังเด็ก แล้วเขามาอาศัยอยู่บ้านเดียวกันที่เขาได้พบกับ จินแท น้องชายออทิสติก...\\nSticky: [• เกาหลี •]-((>*BR-Mini 1080p HQ*<)) Along with the Gods: The Last 49 Days (2018) : ฝ่า 7 นรกไปกับพระเจ้า 2 •[เสียงเกาหลี 5.1 + พากย์ไทย 5.1]-[บรรยายไทย + อังกฤษ]-[เสียงไทย + ซับไทย From MASTER +ซับ PGS คมชัด]\\n•• พิเศษ จัดให้สำหรับแฟน ชัด-เล็กกระทัดรัด! Mini 1080p HQ ครับ! ••• เสียงไทย + ซับไทย From DVD Master. Along with the Gods: The Last 49 Days_(2018) เตรียมตัวทะลุขุมนรกไปผจญภัยครั้งใหม่กับสามเทพผู้พิทักษ์อย่างผู้นำทีมเทพผู้พิทักษ์ ยมทูตคังลิม (ฮา จุงวู), เทพนักต่อสู้ฝีมือโคตรแกร่ง...\\nSticky: [Master from iTunes] • Christopher Robin (2018) คริสโตเฟอร์ โรบิน • [WEB-DL.H.264.1080] • [พากย์อังกฤษ 5.1/พากย์ไทย มาสเตอร์ + บรรยายไทย/บรรยายอังกฤษ]\\nเป็นเรื่องราวที่เกิดขึ้นเมื่อ คริสโตเฟอร์ โรบิ้น กลายเป็นผู้ใหญ่ เขาจะต้องต่อสู้กับปัญหาในการทำงานไปพร้อมๆกับการเเบ่งเวลาให้กับครอบครัว ความเครียดของเขาค่อยๆก่อตัวขึ้นเรื่อยๆ แต่เเล้วเขาก็ได้พบกับ วินนี่ เดอะ พูห์ เพื่อนตุ๊กตาหมีจากในอดีตที่เขาไม่ได้เจอมานาน...\\nFirst Kill นำแสดงโดย เฮย์เดน คริสเตนเซน (Star Wars, Jumper) และ บรูซ วิลลิส (Die Hard, The Sixth Sense), เกธิน แอนโธนี่ (We Are Monster), มากี อวิล่า (Caf้ Society) โดยมี สตีเฟ่น ซี. มิลเลอร์ (Marauders) นั่งแท่นผู้กำกับ มีกำหนดเข้าฉายในสหรัฐอเมริกา 21 กรกฎาคม 2017 ถือเป็นอีกหนึ่งภาพยนตร์...\\nSticky: [ฝรั่ง]-[#ใหม่สดๆร้อนๆ ภาพชัดระดับมาสเตอร์!] The Equalizer 2 (2018) มัจจุราชไร้เงา 2 #[เสียงไทยโรงครบ!] : [พากย์ไทยโรง 2.0 + เสียงอังกฤษ 5.1] : [บรรยายอังกฤษ] : [1080p WEB-DL]\\nThe Equalizer 2 (2018) มัจจุราชไร้เงา 2 #เรื่องย่อ : ถ้าคุณมีปัญหาและไม่รู้ว่าจะหันหน้าไปทางไหน โรเบิร์ต แม็คคอล จะช่วยคุณ เขาคือมัจจุราชไร้เงา แม็คคอลคอยช่วยเหลือพวกที่ถูกทำร้าย ทารุณและกดขี่ด้วยการจัดความยุติธรรมแบบไม่ไว้หน้าอินทร์หน้าพรหม แต่ในตอนที่อดีตอันตรายของเขาเข้ามาส่งผลต่อเขา...\\nSticky: [ฝรั่ง]-[#ใหม่.ภาพชัดระดับมาสเตอร์!] Kin (2018) โคตรปืนเอเลี่ยน #[เสียงไทยโรงครบ!] : [พากย์ไทยโรง 2.0 + เสียงอังกฤษ 5.1] : [1080p WEB-DL]\\nKin (2018) โคตรปืนเอเลี่ยน #เรื่องย่อ : เรื่องราวที่ไม่น่าเชื่อของเด็กชายธรรมดาคนหนึ่ง (รับบทโดย ไมลส์ ทรุตต์) ที่บังเอิญไปพบอาวุธทำลายล้างจากต่างดาว เขาจึงนำมันมาช่วยเหลือพี่ชายบุญธรรม (รับบทโดย แจ็ค เรย์เนอร์) ที่เพิ่งออกจากคุก แต่เข้าไปข้องเกี่ยวกับขบวนการสุดโหดของเจ้าหนี้เลือดเย็น (รับบทโดย...\\nเ รื่ อ ง ย่ อ 10 ปีหลังจากหนังมิวสิคัล Mamma Mia! กวาดรายได้ทั่วโลกไปกว่า 600 ล้านเหรียญสหรัฐ คุณได้รับเชิญให้กลับไปสัมผัสเรื่องราวมิวสิคัล ณ เกาะคาโลไคริ ณ ประเทศกรีก ในโฉมใหม่ของ Mamma Mia! Here We Go Again ที่สร้างจากบทเพลงของ ABBA ...\\nSticky: [ฝรั่ง]-The Predator [2018] เดอะ เพรดเดเทอร์-Encode.H.264.1080p. [Modified]-[ภาพชัด]-[พากย์ไทยโรงชัด+อังกฤษ]-[ซับเกาหลีฝัง]\\nเรื่องย่อ The Predator เป็นเรื่องราวเกิดขึ้นที่ จากห้วงอวกาศอันไกลโพ้น สู่ถนนเล็กๆ ในย่านชานเมือง การไล่ล่ากลับมาอีกครั้ง ในซีรีย์เพรดเดเทอร์อันโด่งดังของเชน แบล็ค และในตอนนี้ นักล่าที่อันตรายที่สุดในจักรวาลก็แข็งแกร่งขึ้น ฉลาดขึ้น และอันตรายยิ่งกว่าที่เคยเป็นมา...\\nSticky: [ฝรั่ง]-ใหม่[* เล็กพริกขี้หนู 1080p Super HQ *]The Spy Who Dumped Me (2018) : 2 สปาย สวมรอยข้ามโลก [พากย์ไทย 5.1 + เสียงอังกฤษ DTS] [บรรยายไทย + อังกฤษ] [เสียงไทย + ซับไทย From MASTER +ซับ PGS คมชัด]\\n••• ไฟล์เล็ก 1080p คุณภาพสูง! ••• เสียงไทย + ซับไทย From DVD Master. The Spy Who Dumped Me_(2018) เรื่องราวของ ออเดรย์ (มิลา คูนิส) และเพื่อนสาว มอร์แกน (เคต แมคคินนอน) ที่ชีวิตกำลังจะเปลี่ยนไปตลอดกาล เมื่อ ดรูว์ (จัสติน เธอโรซ์)...\\nเรื่องย่อ สิ่งที่เขาค้นพบ คือสิ่งที่จักรวาลตามล่า เมื่ออาวุธ “โคตรปืนเอเลี่ยน” ที่จักรวาลออกตามล่า ต้องตกอยู่ในมือเด็กผู้ชายธรรมดาหนึ่งคน จากสุดยอดอาวุธถูกสร้างมาเพื่อฆ่า แต่เขาจะใช้มันเพื่อปกป้องคนที่เขารักและอนาคตโลก ผลงานไซไฟสุดคูลจากผู้อำนวยการสร้าง Arrival และซีรีส์ฮิต Stranger Things ...\\nSticky: [ฝรั่ง]-ใหม่[* 1080p HQ Web-DL *]Alpha (2018) : ผจญนรกแดนทมิฬ 20,000 ปี [พากย์ไทย 5.1 + เสียงอังกฤษ 5.1] [บรรยายไทย + อังกฤษ] [เสียงไทย + ซับไทย From MASTER +ซับ PGS คมชัด]\\n••• Mkv 1080p HQ Web-DL ••• เสียงไทย + ซับไทย From DVD Master. Alpha_(2018) นี่คือการผจญภัยครั้งยิ่งใหญ่ที่เกิดขึ้นในช่วงยุคน้ำแข็งครั้งล่าสุด ในยุโรป เมื่อ 20,000 ปีก่อน ในขณะที่เขาเริ่มต้นการล่าสัตว์เป็นครั้งแรกกับเผ่าของเขา เด็กหนุ่มได้รับบาดเจ็บสาหัส...\\nSticky: [จีน]- Hanson and the Beast (2017) ป่วนหัวใจยัยปีศาจ เสียงไทย จีน-MiniBD.H.264.1080p. [Rip]-[พากย์ไทย]\\nHanson and the Beast (2017) ป่วนหัวใจยัยปีศาจ นักแสดง: หลิวอี้เฟย (Liu Yifei),เฝิงเส้าเฟิง(Feng Shaofeng),กัวจิงเฟย(Guo Jingfei), Li Guangjie กำกับโดย เซียวหยาง ประเภท: โรแมนติก, คอมเมดี้, แฟนตาซี เรื่องย่อ: หยวนซ่วย (เฝิงเส้าเฟิง)...\\nSticky: [ฝรั่ง]-ใหม่[* เล็กพริกขี้หนู 1080p HQ *] The Meg (2018) : โคตรหลามพันล้านปี [พากย์ไทย มาสเตอร์ + เสียงอังกฤษ DTS] [บรรยายไทย + อังกฤษ] [เสียงไทย + ซับไทย MASTER From iTunes. +ซับ PGS คมชัด]\\n••• ไฟล์เล็ก 1080p คุณภาพสูง! ••• #The Meg_(2018) The Meg ดัดแปลงมาจากหนังสือของนักเขียน สตีฟ อัลเทน (Steve Alten) ที่บอกเล่าเรื่องราวของฉลามยักษ์เม็กกาโลดอนในตำนาน ที่มีขนาดใหญ่ถึง 70 ฟุต น้ำหนักกว่า 40 ตัน เหล่านักวิทยาศาสตร์ชาวจีนจะนำพวกเราลงไปสำรวจโลกใต้ท้องทะเลลึก...\\nSticky: [ เกาหลี] ใหม่[* เล็กพริกขี้หนู 1080p Super HQ *] Along with the Gods: The Last 49 Days (2018) : ฝ่า 7 นรกไปกับพระเจ้า 2 [พากย์ไทย 5.1 + เสียงเกาหลี DTS] [บรรยายไทย + อังกฤษ] [เสียงไทย + ซับไทย From MASTER +ซับ PGS คมชัด]\\n••• ไฟล์เล็ก 1080p คุณภาพสูง! ••• เสียงไทย + ซับไทย From DVD Master. Along with the Gods: The Last 49 Days_(2018) เตรียมตัวทะลุขุมนรกไปผจญภัยครั้งใหม่กับสามเทพผู้พิทักษ์อย่างผู้นำทีมเทพผู้พิทักษ์ ยมทูตคังลิม (ฮา จุงวู), เทพนักต่อสู้ฝีมือโคตรแกร่ง ยมทูตเฮวอนเมก (จู จีฮุน), เทพแห่งมันสมอง...\\nSticky: [ฝรั่ง]-ใหม่[* เล็กพริกขี้หนู 1080p Super HQ *] Hotel Transylvania 3: Summer Vacation (2018) : โรงแรมผีหนี ไปพักร้อน 3: ซัมเมอร์หฤหรรษ์ # [พากย์ไทย 5.1 แท้ / 640 Kbps + เสียงอังกฤษ DTS] [บรรยายไทย + อังกฤษ] [เสียงไทย + ซับไทย From Blu-Ray MASTER]\\n••• ไฟล์เล็ก 1080p คุณภาพสูง! ••• เสียงไทย + ซับไทย From Blu-Ray Master. Hotel Transylvania 3 : Summer Vacation_2018 โรงแรมผีหนีไปพักร้อน 3: ซัมเมอร์หฤหรรษ์ ภาพยนตร์อนิเมชั่นจากโซนี พิคเจอร์ส Hotel Transylvania 3: Summer Vacation , มาร์วิสเซอร์ไพร์สแดร็กคูล่า...\\nแอนนิเมชั่นการผจญภัยของ นักปราบผี จอห์น คอนสแตนติน Format : Matroska Format version : Version 4 / Version 2 File size : 7.56 GiB Duration : 1 h 30 min Overall bit rate : 12.0 Mb/s Movie name ...\\nSticky: [ฝรั่ง]-ใหม่ [* เล็กพริกขี้หนู 1080p Super HQ *] Skyscraper (2018) : ระห่ำตึกเสียดฟ้า [พากย์ไทย 5.1 แท้ / 640 Kbps + เสียงอังกฤษ DTS] [บรรยายไทย + อังกฤษ] [เสียงไทย + ซับไทย From Blu-Ray MASTER +ซับ PGS คมชัด]\\n••• ไฟล์เล็ก 1080p คุณภาพสูง! ••• เสียงไทย + ซับไทย From Blu-Ray Master. Skyscraper_(2018) ดเวนย์ จอห์นสัน กลับมารับบทนำเป็นหัวหน้าทีมช่วยเหลือตัวประกันแห่ง FBI ผู้เคยเป็นทหารผ่านศึกชื่อว่า วิล ฟอร์ด ผู้ถูกเลือกให้มาดูแลความปลอดภัยของตึกสูงระฟ้า ในประเทศจีน เขาได้มาถึงตึกที่สูงที่สุด...\\nSticky: Mission: Impossible - Fallout (2018) มิชชั่น: อิมพอสซิเบิ้ล ฟอลล์เอาท์[พากย์:อังกฤษ/ไทย][SUB:อังกฤษ] 1080p ภาพชัด WEB-DL เสียงอังกฤษ DolbyD 5.1 เสียงไทยโรงชัดๆ AC3\\nMission: Impossible - Fallout (2018) มิชชั่น: อิมพอสซิเบิ้ล ฟอลล์เอาท์, M:I 6 - Mission Impossible 147 นาที | Action, Adventure, Thriller เข้าฉาย 26 กรกฎาคม 2561 เรื่องย่อ อีธาน ฮันท์ (ทอม ครูซ) และทีม IMF (อเล็ก บอลด์วิน, ไซม่อน เพ็กก์, วิง เรมส์) พร้อมด้วยพันธมิตร (รีเบ็คกา เฟอร์กูสัน...\\nSticky: [ฝรั่ง]-ใหม่[* เล็กพริกขี้หนู 1080p Super HQ *] Leave No Trace (2018) : ปรารถนาไร้ตัวตน [พากย์ไทย 5.1 + เสียงอังกฤษ DTS] [บรรยายไทย + อังกฤษ] [เสียงไทย + ซับไทย From MASTER +ซับ PGS คมชัด]\\n••• ไฟล์เล็ก 1080p คุณภาพสูง! ••• เสียงไทย + ซับไทย From DVD Master. Leave No Trace เล่าเรื่องของพ่อและลูกสาว วิลล์ และ ทอม ที่ใช้ชีวิตอยู่ในป่าสงวน โดยไม่เล่าที่ไปที่มา เปิดฉากมาให้เห็นว่าทั้งคู่ดำเนินชีวิตกันไปแต่ละวันอย่างมีความสุขกับการทำอาหาร เก็บเห็ด ประทังชีวิตกันไปวัน ๆ...\\nเรื่องย่อ: A-X-L แอคเซล โคตรหมาเหล็ก 2018 บอกเล่าถึง4 ขาของมนุษย์กำลัง0tมีการพัฒนาไปอีกระดับ แอคเซล ยุทโธปกรณ์ทางการทหารล่าสุดที่มีลักษณะคล้ายกับสุนัข มันคือเครื่องจักรสังหารประสิทธิภาพสูง เพียบพร้อมไปด้วยอาวุธสังหารและความสามารถในการเคลื่อนที่อันฉับไว รวมถึงปัญญาประดิษฐ์อันล้ำสมัย...\\nตั้งอยู่ในปี ค.ศ. 2245 เมื่อดวงอาทิตย์ของโลกกำลังจะทำลายล้างมนุษย์ทั้งหมด 'The Dawnseeker' จะติดตามผู้ลอบสังหารที่ได้รับการว่าจ้างห้าคนที่เดินทางไปยังดาวเคราะห์ที่ไม่มีใครสังเกตเห็นเพื่อรวบรวมแร่ธาตุที่หายากที่เรียกว่า stardust เพื่อช่วยดวงอาทิตย์ที่กำลังจะตาย...\\nSticky: [เกาหลี]-The.Villainess(Ak-Nyeo)สวย.แค้น.โหด.(บุษบาล้างแค้น)2017.BDRip.1080p. x264.DTS [ พากย์ไทยมาสเตอร์ + เกาหลี DTS 5.1 ] [ บรรยายไทย + อังกฤษ ]-Blu-ray.H.264.1080p. [Master]-[พากย์ไทย บรรยายไทย]\\nเรื่องราวของ ซุกฮี หญิงสาวที่พ่อถูกฆ่าตายตั้งแต่เด็ก จึงถูกแก็งมาเฟียเลี้ยงดูและได้รับการฝึกฝนให้เป็นนักฆ่า ซึ่งเธอก็ตั้งใจจะตามล่าและล้างแค้นให้พ่อของเธอให้ได้ จนได้ทำภารกิจไล่ล่าบุกทลายแก๊งค้ายาด้วยการสังหารเรียบ แต่กลับถูกดึงตัวจากรัฐบาลให้มาเป็นสายลับเพื่อโค่นล้มองค์กรมาเฟีย ...\\nDuke Diver อาศัยอยู่ในฐานะผู้บริหารอิสระในรีสอร์ทที่หรูหราในเมืองปาล์มสปริงส์รัฐแคลิฟอร์เนียในไม่ช้าเขาก็ต้องเผชิญกับการแข่งขันจากลีโอซึ่งเป็นอดีตทหารที่ชอบผู้หญิงคนเดียวกันกับเขาเมื่อ Diver เมื่อถึงเวลา เขาต้องทิ้งความบาดหมางและไม่ลังเลที่จะร่วมมือกับลีโอเพื่อหยุดผู้ที่พยายามที่จะฆ่าเขา Just...\\nSticky: [ฝรั่ง]-[ไฟล์ mkv จากนอกภาพคมชัดสุดๆ+เสียงไทยโรงคมชัด] mission impossible 6 fallout (2018) - มิชชั่น อิมพอสซิเบิ้ล 6 ฟอลล์เอาท์ 1080p @henrykai -[พากย์ไทยโรง]\\nพบกับการกลับมาของทอม ครูซ ใน MISSION: IMPOSSIBLE – FALLOUT มิชชั่น: อิมพอสซิเบิ้ล – ฟอลล์เอาท์ ซึ่งอีธาน ฮันท์ (ทอม ครูซ) และทีม IMF (อเล็ก บอลด์วิน, ไซม่อน เพ็กก์, วิง เรเมส) พร้อมด้วยพันธมิตร (รีเบ็คกา เฟอร์กูสัน และมิเชลล์ โมนาแฮน) ต้องกลับมาในปฏิบัติการที่ต้องแข่งกับเวลา...\\nSticky: [MASTER HQ] Mazinger Z Infinity 2017 : สงครามหุ่นเหล็กพิฆาต [พากย์:ไทย / ญี่ปุ่น][SUB:ไทย][1080p] สุดยอดการ์ตูนหุ่นรบในตำนาน มาชินก้า แซด\\nMazinger Z Infinity : สงครามหุ่นเหล็กพิฆาต Mazinger Z หรือในชื่อภาษาญี่ปุ่นคือ?????Z เป็นอนิเมชั่นแนวซูเปอร์โรบ๊อตที่สร้างมาจากผลงานต้นฉบับมังงะ ที่แต่งโดยอ. Go Nagai เริ่มเขียนเมื่อปี 1972 ถึงปี 1974 เรียกได้ว่าเป็น “ยุคบุกเบิก” ของหุ่นแนวอภินิหารงซูเปอร์โรบ๊อต...\\nSticky: [ฝรั่ง]-Alpha.2018.ผจญนรกแดนทมิฬ 20,000 ปี.1080p.WEB-DL.DD5.1.H264 [เสียงไทยมาสเตอร์ AC3-5.1 + อังกฤษ-5.1] [ บรรยายอังกฤษ ]-WEB-DL.H.264.1080p. [Modified]-[พากย์ไทย]\\nย้อนหลังไปเมื่อ 20,000 ปีก่อน สมัยยุคน้ำแข็ง เป็นเรื่องราวของเด็กหนุ่มเคด้า ผู้ออกล่าสัตว์ใหญ่เป็นครั้งแรกและด้วยความอ่อนประสบการณ์จึงพลัดตกจากหน้าผา และถูกทิ้งไว้ที่หุบเหวเพราะทุกคนคิดว่าเขาตายไปแล้ว เคด้าต้องใช้สติปัญญา ความเข้มแข็งอดทนทุกอย่างฟันฝ่าอุปสรรคเพื่อกลับไปยังเผ่าตัวเองให้ได้ ...\\n[จีน]-American Dreams in China (2013) สามตี๋ซ่า ท้ามะกัน-Blu-ray.AC-3.1080p. [Modified]-[พากย์ไทย บรรยายไทย]\""],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":11}]},{"cell_type":"code","source":["df.iloc[5231][\"text\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":174},"id":"qfTyNIZyVBOK","executionInfo":{"status":"ok","timestamp":1680343449717,"user_tz":-420,"elapsed":4,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"0e9d087c-aef0-4f7d-a9e9-66967764b8b6"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["', so it can mine bitcoin ARM Miner Bitcoin is. gddr5 майнинг NiceHash โปรแกรมข ดบ ทคอยน ฟร เพ ยงม คอมพ วเตอร หร อโน ตบ คท บ าน.\\nถ าผมม คอมหลายเคร อง แล วข ดพร อมก น แต ให เง นไปเข าแอคเค าเด ยวได ม ยค บ. KittoKung CH. io 23773 สม ครท งไว้ ข ดบ ตคอยให ขุดโปรแกรมบิตcoin สบายๆ.\\nth ค าโอนบ ทแพงจ ง ช วยหาท ใหม ท โอนถ กกว าน ม ม ยคร บ. Sakulwadee Charoenphol. สายฟรี เว บน จ ายเยอะ.\\nMinergate คอมกากก ข ดได้ mycoinblog 2015年11月9日 คำเต อน การข ด Coin สามารถทำให คอมพ งได เขาว ามาง แต ผมเข าใจว าถ าไม โหม จนเคร องร อนหร อพ กบ างเป นคร ขุดโปรแกรมบิตcoin งคราวก น าจะย ดอาย ได บ าง แต ย งไงม นก เส อมแหละ เพราะผมเล นเกมส ท เป น 6 7 ขม. ส วนต วท ลองทำนะคร บ อย างปรกป ดคอมแล วเป ดใหม่ คร บ อย างท สองลงดโปรแกรมใหม่ คร บ ถ าไม ได อ ก ขอโทษคร บตรงน ไม ร จร งๆคร บ. MinerGate โปรแกรมข ดเหร ยญ เเค เป ดคอมพ วเตอร ท ม เน ตแค น น ก สามารถข ด.\\n2016年5月1日 MinerGate โปรแกรมข ดเหร ยญ เเค เป ดคอมพ วเตอร ท ม เน ตแค น น ก สามารถข ดเหร ยญก นได เเล ว. ท ล กศรแดงช อย.\\ncom benz jsb เร มต นทำเหม องบ ทคอยน์ Step by Step ฉบ บ. 2014年1月25日 หล งจากท เราหาเคร องม อข ดมาได แล วส งแรกท เราต องเตร ยมการค อ กระเป าสตางค Bitcoin หร อเร ยกก นว า Bitcoin Wallet.\\nหล งจากท เราม Bitcoin Walletเป นของต วเองแล วเราก พร อมท จะเร มทำMining ได ท นท โดยการข ดBitcoin จะเล อกข ดได สองแบบค อ. 1. การข ดแบบ.\\nหล งจากท เราเล อก Pool เสร จแล วเราก ต อง Setting โปรแกรมข ดของเรา. ใช ม อถ อข ดโดยใช โปรแกรม minergate เวบ minergate com a b646f0a222c3b295c3844076. Bitcoin แผนภ ม และกราฟ Blockchain Blockchain.\\ninfo ม ลค ารวมของค าธรรมเน ยมในการทำธ รกรรมท งหมดท จ ายให ก บน กข ดไม รวมม ลค าเป นคอยน ของรางว ลในการออกบล อก. ต นท น% ของปร มาณธ รกรรม. แผนภ ม แสดงรายได ของคนงานเหม องเป นร อยละของปร มาณการทำธ รกรรม.\\nค าใช จ ายต อการทำธ รกรรม. แผนภ ม แสดงรายได ของคนงานเหม องหารด วยจำนวนของการทำธ รกรรม. ขอแนะนำ No Coin ป องก นเว บด ง ซ พ ยู ไปข ด บ ทคอยน์ Sanook.\\nHitech 2017年9月20日 จากกรณ ท บางเว บไซต ได ด งทร พยากรจากเคร องผ ใช ไปข ดบ ทคอยน น น ล าส ดได ม การนำเสนอว ธ ป องก นแล ว. PaBaNet งานดี เง นไว รายได เสร ม: ป ม Bitcoin. สอนป มเง นจากเว บไซต แจก.\\n2015年10月26日 เว บแจกบ ทคอยน ฟรี ทำไมต องแจก แจกแล วเว บได อะไร. ส งท เว บแจกบ ทคอยน์ ได จากเราก ค อ รายได จากยอดผ เข าชมเว บ และรายได จากการคล กด โฆษณาคร บ ทำให เว บม เง นบ ทคอยน์ มาจ ายผ ใช งานในการร บบ ทคอยน ฟรี ท หน าเว บ แต เหน อส งใดในบรรดาเรา ผ ใช งานน นต องเข าใจในข นตอนการทำงานของเว บ ซ งทาง iSitePLUS.\\nMinerGateโหลดโปรแกรมข ดบ ทคอยน ก นฟร เพ ยงม คอมเป ดเน ต ท จร งคอมไม ต องแรงอะไรมาก เน ตก อไม ต องแรง คอมร นไหม เด ยวน ก อเป นท ใช ได้ ก อนอ นจะมาเล าเร องว า ทำไมบ ทคอยน ม น ถ งทำเง นไห เรา พอคนเร มใช จ ายบ ทคอยน ทำไห้ การใช จ ายบ ทคอยน เพ มข น ม นก อม ความต องการ บ ทคอยน เพราะเด ยวน ม นสามารถใช จ าย ได ก บหลายเว บ และแลกเป นเง นได้ ก บหลายท ไห หาข อม ลในบล อกน เอา). เร มต นการข ดบ ทคอยน์ Bitcoin Mining เม อค ณม ฮาร ดแวร สำหร บข ดแล วค ณจะต องดาวน โหลดโปรแกรมสำหร บข ดบ ทคอยโดยเฉพาะ ม นม มากมายหลายโปรแกรมแต ท น ยมก นมากก ค อ CGminer และ BFGminer ซ งเป น ซอฟท แวร ท ใช คำส งผ านต วหน งส อcommand line.\\nแต ถ าค ณชอบท จะใช แบบ GUI ซ งใช ง ายกว า ก ขอแนะนำ EasyMiner ซ งเป นโปรแกรมสำหร บต ดต งใน windows Linux Android.\\nข ด bit coin ด วย minergate on pvs server hd 7950 майнинг ฝากเว บน คร บ สายฟรี เป นแบบ cloud ming สม ครง าย จ ายจร งclaim ได เยอะ ข ดเหร ยญได ขุดโปรแกรมบิตcoin หลายชน ด ม อถ อก ข ดได นะ ไม ต องไปเป ดโปรแกรม ไม ต องเป ดจอไว้ สม ครล ม ปล อยเพ มพล งข ดหร อข ดได เลย ได ครบตามยอดถอนได ท นที สม ครร บฟรี 100GH s ล งค สม คร คล กเลย. ref golfago. นายบ ณยกร สมบ รณ.\\nแนะนำ 3 เว บน เลยคร บ. ทำความร จ ก Bitcoin และการข ดเหม อง ทำไมท กคนต องแย งก นซ อการ ดจอ. 2017年6月24日 บ ญชี Bitcoin.\\nการท จะเป นเจ าของต องเร มจากการสร างบ ญชี Bitcoin ก อนโดยสามารถสร างได ผ านเว ปไซต์ และโปรแกรมต างๆ โดยบ ญชี Bitcoin จะม ล กษณะเป นต วช ดอ กษร 256 bit และใน 1 คน สามารถสร างบ ญชี Bitcoin ก บ ญช ก ได ซ ง ทาง Bitcoin จะให เลขบ ญช มา 2 ช ด ค อ Pulblic key ต วน จะเป นรห สท ท กคนร ได ใช ในการโอน และ Private. บ ทคอยน์ Bitcoin ค ออะไร ข ดย งไง การเง น Kapook บ ทคอยน์ ค ออะไร Bitcoin ค อ เง นย คด จ ท ล หลายคนสงส ย บ ทคอยน์ ข ดย งไง เล นย งไง ผ ดกฎหมายไหม 1 บ ทคอยน์ เท าก บก บาท.\\nตอนน เปล ยนช อใหม เป น Storm play แล ว กดร บบ ทคอยน ฟร ท ก ๆ 10 30 นาที สามารถเล อกถอนเป นสก ลเง นด จ ตอล บ ทคอยน Bitcoin สตอร มStorm) หร ขุดโปรแกรมบิตcoin อ อ เธอเร ยมEthereum) ก ได ส วนต วแนะนำให ถอนเป น Bitcoin คร บ) หล งจากกดถอนข นต ำตามท ระบบกำหนดไว้ เง นจะเข ากระเป าเราในประมาณ 4'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":7}]},{"cell_type":"code","source":["df[df[\"text\"].str.contains(\"อวัยวะเพศ\")][\"text\"][29556]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":278},"id":"lzcjuuTRSoU9","executionInfo":{"status":"ok","timestamp":1680343732094,"user_tz":-420,"elapsed":590,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"982bc8ec-60a3-4e1c-e671-b501c3e43fc3"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'ว่ามีหนอนใน somge ไม่ว่าคุณจะสามารถขับรถเด็กไปโรงเรียนอนุบาลกับเวิร์ม, Giardia เลือดสิ่งที่ Alcoholate กับ chanterelles จากปรสิต. เรียนรู้เกี่ยวกับปรสิต mycoplasmosis หรือเวิร์ม, ที่มาปรสิต ไม่ว่าจะเป็นปรสิตส่งผ่านจูบ.\\nความดันสูงและปรสิต ปรสิตในความคิดเห็นของคน, Giardia ในเด็กเป็นจับ การรักษาของเวิร์มสำหรับเด็กเล็ก. วิธีการที่จะขับไล่พยาธิในเด็ก ปรสิตในปลาทูปลา, อย่าหนอนอาศัยอยู่ในน้ำ ไม่ว่าจะเป็นปรสิตกลัวของกระเทียม.\\nปรสิตในโรคดิน กว่าการเยียวยาปรสิตพื้นบ้านขับถ่าย, วิธีการในการเก็บอุจจาระไข่ของหนอน เหยื่อหนอนแมว. วิธีที่จะเข้าใจเป็นหนอนนิวยอร์ก เพื่อกำจัดปรสิตในปลา, ปรสิตที่กิน วิธีที่จะให้แมวแท็บเล็ตจากเวิร์ม.\\nวิเคราะห์อุจจาระไข่พยาธิเครื่องจักร เวิร์มในมนุษย์ lamblia, มีพยาธิในไขมัน โรคหอบหืดและโรคพยาธิ. ได้อย่างรวดเร็วรักษาแมวของเวิร์ม tar ฆ่าพยาธิทั้งหมด, เวิร์มที่ทำให้คน เวิร์มและเด็กและผู้ใหญ่.\\nปรสิตอยู่ในแมว เวิร์มซึ่งในเลือด, กว่าที่จะรักษาพยาธิในนกแก้ว การวินิจฉัย bioresonance ปรสิตชีวิต. อะนิเมะปรสิตธีม 1 เปิดในรัสเซีย ที่จะซื้อที่ลดลงของเวิร์ม, วิธีการดูเวิร์มในลูกสุนัขที่ Mutualists และปรสิตคือ.\\nวิธีการที่จะได้รับน้ำหนักกับเวิร์ม ปรสิต 5 เซนติเมตร, ปรสิตรักษาชาติ ชีววิทยาเกรดปรสิตเห็ด 6 บทเรียน. ถ้าสัญญาณแรกของปรสิตตับ อาการของ Giardia และ Opisthorchis, ตัวแทนที่ดีของเวิร์มสำหรับแมว มีอาการอะไรว่าแมวมีหนอน.\\nสิ่งที่ฝันหนอนหนอน ไข่พยาธิตัวอ่อน, ยากับปรสิตในร่างกายมนุษย์ มันอาจจะมาจากหนอนแฮร์ริ่ง. ว่าการใช้ปรสิต วิธีการส่งปรสิตบนที่น่ากลัว, เค็มกับเวิร์ม ระดับของปรสิตนี้.\\nปรสิตในข้อไหล่ คนหนอนป้องกันในเด็ก, ที่มีเรียกว่าปรสิต อวัยวะเพศพยาธิ. ได้อย่างรวดเร็วรักษาปรสิต เด็กหนอนคือ 8 เดือน, ปรสิตในความคิดเห็นของเด็ก ทดสอบ Rospotrebnadzor มอสโก Giardia.\\nปรสิตชีวิตอะมีบาบิดของมนุษย์ เวิร์มมีวิธีการ koshek.narodny, ลูกแมวป่วยด้วยหนอน ตรวจหาปรสิต. ถูกดึงออกมาจากปรสิตของหัวใจ ฝนตกหนัก Anime ปรสิต, ปรสิต Marina Maltseva HLS กำจัดปรสิต.\\nโรคดวงตาแดง ตาต้อลม ต้อเนื้อ ต้อหิน ต้อกระจก จอประสาทตาเสื่อมดีได้ ด้วยสมุนไพรธรรมชาติ 0924945225 คุณจะรู้ว่าคุณมีหนอนซึ่งอาการของพวกเขาอยู่ในร่างกาย\\nหนอน 6 ตัวอักษร อาชีพความเชื่อปรสิตไร้ยางอาย, ปรสิตอีในมนุษย์ รหัส Parasite Eve. Evalar จากคู่มือของปรสิต การรักษา celandine ของเวิร์ม, ซึ่งมีหนอนในเด็ก สิ่งที่สามารถทำได้เมื่อหนอนในอุจจาระ.'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":15}]},{"cell_type":"code","source":["df[df[\"text\"].str.contains(\"ปั้มไลค์\")].sample(1)[\"text\"].tolist()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"EipzWcQJS5L4","executionInfo":{"status":"ok","timestamp":1680343817122,"user_tz":-420,"elapsed":578,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"718fb728-5911-44e9-dd7b-7bd427594d98"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["['แท็ก: ปั้มไลค์เพจ, สร้างเพจใหม่พร้อมยอดไลค์, เพิ่มไลค์แฟนเพจ ราคาถูก, จ้างไลค์, เพิ่ม Like, รับทำเพจสินค้าพร้อมยอดไลค์, ปั้มไลค์ครบวงจร, ปั้มไลค์เพจ Facebook, รับจ้างปั้มไลค์, รับปั้มไลค์เพจ, ปั้มเพจ, กดไลค์รูป, บริการเพิ่ม Like ให้แฟนเพจของคุณ โดยทีมงานระดับมืออาชีพ ในระยะเวลาอันสั้นและราคาถูก รับประกันไลค์จากคนไทย 100%, กด Like, รับทำไลค์แฟนเพจจำนวนมาก, ปั้มไลค์เฟสบุ๊ค, ปั้มยอดไลค์เป็นคนไทย 100%, ไลค์แฟนเพจได้สูงสุดหนึ่งล้านไลค์, ปั้มไลค์เพจคนไทย, ปั้มเพจเฟสบุ๊ค, ไลค์คนไทย 100%, Add Like Fanpage, ปั้มไลค์รูป, รับจ้างเพิ่มไลค์, โกงไลค์, รับเพิ่มไลค์แฟนเพจเฟสบุ๊ค, ปั้มไลค์ง่ายๆ, วิธีปั้มไลค์ฟรี, ปั้มไลค์ฟรี, เพิ่มไลค์คนไทย, ปั้มโพสต์, เพิ่มไลค์, ปั้มไลค์รูป Facebook, ไลค์ไลค์แฟนเพจ, รับ Like Fanpage, รับปั้มไลค์รูป, บริการปั้มไลค์ฟรี, ไลค์แฟนเพจ, Auto Like, ปั้มไลค์รูปเฟส, รับเพิ่มไลค์, ปั้มไลค์มือถือ, การเพิ่ม Like เป็นการเพิ่มโอกาสทางการขายสินค้าของคุณนั่นเอง ด้วยงานบริการเพิ่มไลค์แฟนเพจระดับมืออาชีพ ประสบการณ์การทำงานหลายปี, ปั้มไลค์สถานะ, ไลค์แฟนเพจราคาถูก, รับไลค์แฟนเพจ, Like Fanpage, ปั้มเพจ เหมาะสำหรับผู้ที่ต้องการยอดไลค์เพจเพจเยอะๆ, ปั้มไลค์ราคาถูก, เพิ่มไลค์เพจ ราคาถูก, จ้างเพิ่มไลค์, รับเพิ่ม Like Fanpage Facebook ราคาพิเศษ เหมาะสำหรับผู้ที่ต้องการเพิ่ม Like Fanpage ให้ดูเป็นความน่าเชื่อถือของร้าน, รับสร้างแฟนเพจพร้อมยอดไลค์, ปั่นไลค์, ปั้มรูป, บริการเพิ่มไลค์เฟสบุ๊คให้แฟนเพจ, ไลค์เพจ, ไลค์แฟนเพจเฟสบุ๊ค, รับทำไลค์ครบวงจร, บริการปั้มไลค์แฟนเพจฟรี, Up Like Fanpage, แฟนเพจพร้อมยอดไลค์, กดไลค์, ซื้อไลค์แฟนเพจ, กดไลค์แฟนเพจ, ปั้มไลค์, รับไลค์ครบวงจรทั่วไทย, ปั้มไลค์ Facebook, สั่งไลค์แฟนเพจ, เพิ่มไลค์แฟนเพจ, เพิ่มไลค์ฟรี, รับจ้างกดไลค์, รับทำเพจเฟสบุ๊ค, ปั้มไลค์แฟนเพจ, Pump Like, จ้างไลค์รูป, บริการเพิ่มไลค์แฟนเพจฟรี, จ้างกดไลค์, ปั้มไลค์ทั่วไป, ไลค์รูป, จ้างปั้มไลค์, ปั้มไลค์ ในโทรศัพท์, ปั้ม Like ฟรี, รับเพิ่มไลค์แฟนเพจ เป็นการโปรโมทแฟนเพจ เพื่อเพิ่มยอดขายสินค้าได้, เพิ่มไลค์เพจ, ปั้มไลค์เพจฟรี\\nคอนเทค-คาปา - แก้ปัญหาค่าไฟฟ้าแพง เราทำได้เร็ว คืนทุนเร็ว ทำรายงานแบบเบ็ดเสร็จ ประหยัดไฟฟ้าได้มากกว่า 75 %\\n\"อินทรีเหล็ก\" เยอรมัน เตรียมจัด ลีรอย ซาเน่ หนุนทัพปิดสกอร์ เกมรับแข้ง \"กระทิงดุ\" สเปน ที่จะใช้ ดีเอโก้ คอสต้า ล่าตาข่าย ในศึกฟุตบอลกระชับมิตร ทีมชาติ คืนวันศุกร์ที่ 23 มี.ค. ศกนี้ ถ่ายทอดสด : ช่อง 7 HD, เวลา : 02.45 น.\\n\\'\\'อินทรีเหล็ก\\'\\' แชมป์โลกทีมปัจจุบัน ลงเตะเกมทางการล่าสุดด้วยการเอาชนะอาเซอร์ไบจาน 5-1 ส่งท้ายฟุตบอลโลก รอบคัดเลือก ส่วนเกมกระชับมิตรเสมอฝรั่งเศสสุดมันส์ 2-2\\nเทรนเนอร์ โยอาคิม เลิฟ เรียกนักเตะมาติดทีมทั้งหมด 26 คน โดยไร้เงา มานูเอล นอยเออร์ นายทวารมือหนึ่งจากสโมสรบาเยิร์น มิวนิค ที่ยังต้องต่อสู้กับอาการบาดเจ็บ เช่นเดียวกับ มาร์โค รอยส์ และ มาริโอ เกิทเซ่ สองมิดฟิลด์ตัวรุกจากค่าย โบรุสเซีย ดอร์ทมุนด์\\nสภาพความพร้อมล่าสุด เซบาสเตียน รูดี้ พลาดซ้อมกับเพื่อนๆ ในการเตรียมทีมครั้งสุดท้ายที่ดุสเซลดอร์ฟ เนื่องจากต้องไปเฝ้าภรรยาที่กำลังคลอดลูก ขณะที่ เอ็มเร่ ชาน มิดฟิลด์เนื้อหอมจากลิเวอร์พูล มีอาการบาดเจ็บแผ่นหลังเล็กน้อย คาดว่าคงไม่ถูกเสี่ยงส่งลง\\nมาร์ก-อันเดร แทร์ ชเตเก้น จะได้ลงเฝ้าเสาเป็นตัวจริงในวันที่นอยเออร์ยังไม่พร้อมให้บริการ แนวรับนำมาโดย 3 ทหาร \\'\\'เสือใต้\\'\\' อย่าง มัทส์ ฮุมเมิ่ลส์, เยโรม บัวเต็ง และ โยชัว คิมมิค\\nแดนกลางวางให้ อิลคาย กุนโดกัน คุมเกมกับ โทนี่ โครส แดนหน้า ติโม แวร์เนอร์ จะได้ออกสตาร์ตก่อนหน้าของจอมเก๋าอย่าง มาริโอ โกเมซ ที่กลับมายิงต่อเนื่องในคราบไคลของสตุ๊ตการ์ท\\nฟากกองทัพ \\'\\'กระทิงดุ\\'\\' ส่งท้ายรอบคัดเลือกฟุตบอลโลกด้วยการเอาชนะอิสราเอล 1-0 ก่อนที่จะลงเตะเกมกระชับมิตรกับรัสเซีย เจ้าภาพเวิลด์ คัพ กลางปีนี้ ที่เสมอกันไปสุดสนุก 3-3\\nจูเลน โลเปเตกี เรียกตัว ดีเอโก้ คอสต้า ที่กำลังคืนฟอร์มกับ แอต.มาดริด กลับมาติดทีมอีกครั้ง และเรียกให้ มาร์กอส อลอนโซ่ แนวรับซ้ายฟ้าสั่งจากเชลซี ติดทีมเป็นครั้งแรก เช่นเดียวกับ โรดรี้ เอร์นานเดซ จากบียาร์เรอัล และ ดานี่ ปาเรโฆ กัปตันทีมบาเลนเซีย\\nอย่างไรก็ตาม ทีมชุดนี้ไม่มีชื่อของ อัลบาโร่ โมราต้า หัวหอกจากค่าย \\'\\'สิงห์บลูส์\\'\\' ทำให้ในช่วงเบรกทีมชาติครั้งนี้เสื้อหมายเลข 7 ของเจ้าตัวจะตกไปเป็นของ ซาอูล ญีเกซ มิดฟิลด์ตราหมี ส่วน เซร์คิโอ บุสเก็ตส์ ห้องเครื่องตัวเก่งจากบาร์เซโลน่า ไม่มีชื่อเหมือนกันเนื่องจากบาดเจ็บ\\nทางเลือกในการจัดทัพของสเปนเยอะพอๆ กับเยอรมันเลย โดยคาดว่าจะออกสตาร์ตด้วยทีมงานชุดใหญ่ แผงแนวรับมี เซร์คิโอ รามอส จับคู่เซนเตอร์กับ เคราร์ด ปีเก้ คู่ปรับในนามสโมสร\\nกลางสนามมี อันเดรส อีเนียสต้า ขับเคลื่อนเกม ดีเอโก้ คอสต้า ปักหอก ขนาบข้างโดย มาร์โก อาเซนซิโอ และ ดาบิด ซิลบา\\nเยอรมัน (4-2-3-1) : มาร์ก-อันเดร แทร์ ชเตเก้น - โยชัว คิมมิค, มัทส์ ฮุมเมิ่ลส์, เยโรม บัวเต็ง, โยนาส เฮคเตอร์ - อิลคาย กุนโดกัน, โทนี่ โครส - โธมัส มุลเลอร์, เมซุต โอซิล, ลีรอย ซาเน่ - ติโม แวร์เนอร์\\nสเปน (4-3-3) : ดาบิด เด เคอา - ดานี่ การ์บาฆาล, เซร์คิโอ รามอส, เคราร์ด ปีเก้, จอร์ดี้ อัลบา - อีสโก้, โกเก้, อันเดรส อีเนียสต้า - ดาบิด ซิลบา, ดีเอโก้ คอสต้า, มาร์โก อาเซนซิโอ']"]},"metadata":{},"execution_count":19}]},{"cell_type":"code","source":["df[df[\"text\"].str.contains(\"เพิ่มขนาด\")].sample(1)[\"text\"].tolist()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"_a5xD4fQTvfw","executionInfo":{"status":"ok","timestamp":1680344150456,"user_tz":-420,"elapsed":363,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"4cf6f7e8-ce50-41c9-9360-3f699aa557e6"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["['วิธีการขยายการนวดอวัยวะเพศของคุณ ซื้อยืดสมาชิกเพิ่มขึ้น, ดูสื่อลามกกระเจี๊ยวขนาดเล็ก สาวน้อยเอาในสมาชิกปาก. ครีมสำหรับเป็นสมาชิกด้วยมือของเขาเอง หากสมาชิก HOA HOA ภายใต้ 50, ยิ่งเป็นคนที่สมาชิกน้อย ขยายเพื่อเพิ่มสมาชิก.\\nสมาชิกกลายเป็นน้อยและทำไม เพิ่มสมาชิกนวด, วิธีการเพิ่มขนาดอวัยวะเพศ วิธีการเพิ่มขนาดอวัยวะเพศชาย. การฝึกอบรมเพื่อเพิ่มสมาชิก เพิ่มสมาชิกข้อเสนอแนะของตนเอง, สาวสวยน้อยและกระเจี๊ยวใหญ่ สมาชิกขนาดเล็กและบางของสามีของเธอ.\\nขยายขนาดอวัยวะเพศชาย วิธีโบราณที่จะเพิ่มสมาชิก, ทั้งในพื้นที่ของสมาชิกที่เพิ่มขึ้น สมาชิกสังฆเพิ่มขึ้น. วิธีการเพิ่มสมาชิก 13 ปี เพิ่มราคาสมาชิก Dnepropetrovsk, วิธีการเพิ่มขนาดอวัยวะเพศชาย เป็นเด็กอายุ 13 ปีที่จะเพิ่มสมาชิก.\\nถ้าคนที่มีขนาดเล็กกระเจี๊ยว กระเจี๊ยวขนาดใหญ่ในปากเล็ก, สมาชิกเพิ่มขึ้นน้ำผึ้ง ร้านขายยาขยายขนาดอวัยวะเพศ. Pisya เล็กรักกระเจี๊ยว รูเล็ก ๆ บนอวัยวะเพศชาย, เมื่อมีการเพิ่มสมาชิก เขามีไข่ที่ดี แต่น้อยกระเจี๊ยว.\\nสมาชิกที่เล็กที่สุดของความมึนงง อวัยวะเพศยาเสพติดเพิ่มขึ้น, กระเจี๊ยวระหว่างหน้าอกเล็ก ถุงยางอนามัยน้อยกว่าสมาชิก. สมาชิกกลายเป็นเหตุผลน้อย วิธีการขยายการนวดอวัยวะเพศของคุณ, ระยะยาวหนังโป๊ในตูดเล็ก ๆ น้อย ๆ ไม่ว่าจะเป็นไปได้ที่จะเพิ่มขึ้นอวัยวะเพศของเขา.\\nรับตัวแทนจำหน่ายรายได้ดี รีเเล็กซ์ ครีมนวดสมุนไพรไทย RELAX CREAM อาจจะกลายเป็นสมาชิกคนหนึ่งของที่ต่ำกว่า\\nสมาชิกเล็ก ๆ ของทีมรัสเซียคอร์ด ที่มีสมาชิกที่มีขนาดใหญ่ที่สุดและมีขนาดเล็ก, เพิ่ม hypospadias อวัยวะเพศชาย วิธีที่ดีที่สุดที่จะเพิ่มอวัยวะเพศของเขา. มีสมาชิกสูงเล็กน้อยมีสุขภาพดี สมาชิกพลาสติกใน Kursk, หนังสือกินเนสเป็นสมาชิกที่เล็กที่สุดของ Tyumen เพื่อเพิ่มสมาชิก.\\nเป็นสมาชิกเด็กน้อยยืน เพิ่มสมาชิกรีดนม, วิธีการว่าจะเพิ่มสมาชิก เพิ่มขึ้นในสภาพสมาชิก damashnih. หัวโจกใหญ่และผู้หญิงที่มีขนาดเล็ก กระเจี๊ยวในเรื่องเล็ก ๆ น้อย ๆ, ฝันเล็กกระเจี๊ยว เพิ่มสมาชิก Tula.\\nหนังโป๊กระเจี๊ยวขนาดใหญ่ในรูเล็ก ๆ ทำไมมันจึงเป็นสมาชิกเล็ก ๆ ว่า, สมาชิกขนาดเล็กที่สุด เป็นทดสอบที่แท้จริงที่จะเพิ่มสมาชิก. การทำศัลยกรรมพลาสติกในอวัยวะเพศก่อนและหลัง จริงเพิ่มสมาชิกคนหนึ่งของวิธีการที่, วิธีการที่จะแขวนภาระที่จะเพิ่มสมาชิก ยาเพิ่มขนาดอวัยวะเพศชาย.\\nสูตรของคุณยายเพิ่มสมาชิก สมาชิกคนหนึ่งของปากเล็ก, วิธีการเพิ่ม Jelqing อวัยวะเพศชาย เล็ก ๆ น้อย ๆ กระเจี๊ยวในตูดใหญ่. ท่อปัสสาวะพลาสติกและอวัยวะเพศ prischiki ขนาดเล็กที่หัวของอวัยวะเพศชายที่เป็น, อวัยวะเพศมีขนาดเล็กและไม่เหมาะ สิ่งที่ผลิตภัณฑ์เพื่อเพิ่มสมาชิก.\\nอวัยวะเพศชายภาษาอาหรับวิธีการขยาย กระเจี๊ยวใหญ่สำหรับวัวสาวน้อยนี้, สมาชิกที่เล็กที่สุดในโลก วิธีการขยายขนาดอวัยวะเพศ. หัวหน้า enlarge สมาชิกภาพ เพิ่มสมาชิก 9 ปี, สาวน้อยรัก cocks ใหญ่ จู๋เล็ก ๆ เช่นทำไม.']"]},"metadata":{},"execution_count":29}]},{"cell_type":"markdown","source":["# LDA"],"metadata":{"id":"A9iR9mWSJTQb"}},{"cell_type":"code","source":["f=open(\"/content/drive/MyDrive/Openthaigpt/stopwords.txt\",\"r\")\n","\n","stopwords = [line.strip() for line in f.readlines()]\n","\n","f.close()"],"metadata":{"id":"8HBYaPGbMTKq","executionInfo":{"status":"ok","timestamp":1680162178360,"user_tz":-420,"elapsed":5,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"3c205ed4-c7f3-48c8-cbad-6d4378001a9b"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}]},{"cell_type":"code","source":["import gensim\n","from gensim import corpora\n","from gensim.models import LdaModel\n","from pythainlp.tokenize import word_tokenize\n","import re\n","import os\n","tqdm.pandas()\n","\n","def preprocess_text(text):\n"," text = text.lower()\n"," text = text.replace(\"\\n\",\"\")\n"," text = text.replace(\"\\t\",\"\")\n"," text = re.sub(\"[^a-zA-Zก-๙๐-๙ ]\",\"\",text)\n"," tokenized_text = word_tokenize(text)\n"," return [w for w in tokenized_text if w not in stopwords and len(w)>1]"],"metadata":{"id":"k6N4am2seTlh"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["tokenized_doc = df[\"text\"].progress_apply(preprocess_text)\n","\n","\n","dictionary_path = \"/content/drive/MyDrive/Openthaigpt/lda_dict\"\n","check_file = os.path.isfile(dictionary_path)\n","\n","if not check_file:\n"," dictionary = corpora.Dictionary(tokenized_doc)\n"," dictionary.save(dictionary_path)\n","else :\n"," dictionary=corpora.Dictionary.load(\"filename\")\n","\n","\n","corpus = [dictionary.doc2bow(doc) for doc in tokenized_doc]\n","\n","num_topics = 30\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"wsGJGJLUytKH","executionInfo":{"status":"ok","timestamp":1680162289341,"user_tz":-420,"elapsed":96123,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"aa4bf8c0-3b7a-4fa6-d8b9-1f1d2c68d05d"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n","100%|██████████| 10001/10001 [01:29<00:00, 111.41it/s]\n"]}]},{"cell_type":"code","source":["lda_model = LdaModel(corpus=corpus, id2word=dictionary, num_topics=num_topics , passes=20, iterations=100,random_state=1)\n"],"metadata":{"id":"ZUog67zjpEAo","executionInfo":{"status":"ok","timestamp":1680162646982,"user_tz":-420,"elapsed":299142,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"789e0425-52a2-434b-c063-a7e2f0be853b"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}]},{"cell_type":"code","source":["for topic in lda_model.print_topics():\n"," print(topic)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"5yaccnLoK9DR","executionInfo":{"status":"ok","timestamp":1680162646984,"user_tz":-420,"elapsed":22,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"dd742681-a4f9-450c-f564-0fdd02434b40"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["(6, '0.141*\"รุ่น\" + 0.103*\"หมวก\" + 0.032*\"น็อค\" + 0.028*\"รองเท้า\" + 0.013*\"แว่น\" + 0.010*\"ฟาร์ม\" + 0.010*\"วิบาก\" + 0.009*\"สอนพิเศษ\" + 0.008*\"เหล็กดัด\" + 0.007*\"หลิว\"')\n","(23, '0.117*\"ไลค์\" + 0.076*\"เพจ\" + 0.058*\"ปั้ม\" + 0.045*\"เหรียญ\" + 0.042*\"แฟน\" + 0.041*\"เพิ่ม\" + 0.016*\"เฟส\" + 0.015*\"รูป\" + 0.013*\"บุ๊ค\" + 0.013*\"ฟรี\"')\n","(2, '0.103*\"โรงแรม\" + 0.095*\"ว่ายน้ำ\" + 0.050*\"ราคา\" + 0.048*\"รายชื่อ\" + 0.048*\"เริ่มต้น\" + 0.048*\"ดีมาก\" + 0.048*\"รวบรวม\" + 0.048*\"จนถึง\" + 0.048*\"สระว่ายน้ำ\" + 0.048*\"ตอนเช้า\"')\n","(17, '0.052*\"เส้นเลือด\" + 0.048*\"ขอด\" + 0.018*\"ขา\" + 0.011*\"เพชร\" + 0.010*\"หลอดเลือดดำ\" + 0.009*\"อุดตัน\" + 0.008*\"รักษา\" + 0.007*\"แหวน\" + 0.007*\"ตาก\" + 0.007*\"varices\"')\n","(8, '0.035*\"พระ\" + 0.015*\"วัด\" + 0.012*\"ท่าน\" + 0.011*\"ผู้\" + 0.010*\"ทรง\" + 0.006*\"พระองค์\" + 0.005*\"จัก\" + 0.005*\"สมเด็จ\" + 0.005*\"หลวงพ่อ\" + 0.005*\"งาน\"')\n","(10, '0.041*\"ขาย\" + 0.039*\"บ้าน\" + 0.022*\"คอนโด\" + 0.017*\"ใกล้\" + 0.015*\"ที่ดิน\" + 0.014*\"โครงการ\" + 0.014*\"ราคา\" + 0.013*\"ถนน\" + 0.013*\"บาท\" + 0.013*\"ห้อง\"')\n","(13, '0.026*\"น้ำ\" + 0.025*\"หน้าอก\" + 0.021*\"ไม้\" + 0.011*\"ทำ\" + 0.011*\"ดอก\" + 0.011*\"เต้านม\" + 0.010*\"พลาสติก\" + 0.009*\"ใบ\" + 0.009*\"ขนาด\" + 0.009*\"ใส่\"')\n","(19, '0.016*\"ระบบ\" + 0.015*\"เครื่อง\" + 0.015*\"ใช้\" + 0.014*\"สามารถ\" + 0.011*\"งาน\" + 0.010*\"สำหรับ\" + 0.010*\"อุปกรณ์\" + 0.008*\"ติดตั้ง\" + 0.008*\"ออกแบบ\" + 0.007*\"ขนาด\"')\n","(29, '0.042*\"เพิ่ม\" + 0.034*\"เล็ก\" + 0.028*\"สมาชิก\" + 0.028*\"ผู้หญิง\" + 0.021*\"สำหรับ\" + 0.018*\"กาแฟ\" + 0.016*\"ขยาย\" + 0.016*\"แรง\" + 0.015*\"ความแข็งแรง\" + 0.014*\"ที่จะ\"')\n","(26, '0.029*\"ทีม\" + 0.015*\"บอล\" + 0.011*\"เกม\" + 0.010*\"เล่น\" + 0.010*\"ลีก\" + 0.009*\"ออนไลน์\" + 0.008*\"เว็บ\" + 0.007*\"ฟุตบอล\" + 0.007*\"ชาติ\" + 0.007*\"สมัคร\"')\n","(22, '0.076*\"ชุด\" + 0.068*\"เพลง\" + 0.055*\"กลอง\" + 0.045*\"ราคา\" + 0.026*\"กีต้าร์\" + 0.018*\"ขาย\" + 0.013*\"ไฟฟ้า\" + 0.012*\"เครื่อง\" + 0.012*\"เครื่องดนตรี\" + 0.011*\"กาว\"')\n","(11, '0.025*\"ครู\" + 0.022*\"มหาวิทยาลัย\" + 0.022*\"โรงเรียน\" + 0.018*\"นักเรียน\" + 0.018*\"เรียน\" + 0.018*\"ประกาศ\" + 0.016*\"สอบ\" + 0.012*\"การแข่งขัน\" + 0.011*\"งาน\" + 0.011*\"หลักสูตร\"')\n","(18, '0.043*\"ราคา\" + 0.035*\"สี\" + 0.024*\"ซื้อ\" + 0.024*\"รุ่น\" + 0.022*\"เสื้อ\" + 0.021*\"สินค้า\" + 0.018*\"กระเป๋า\" + 0.017*\"กำจัด\" + 0.015*\"นิ้ว\" + 0.014*\"โปรโมชั่น\"')\n","(25, '0.019*\"ทัวร์\" + 0.016*\"เมือง\" + 0.011*\"เดินทาง\" + 0.009*\"เกาะ\" + 0.008*\"ชม\" + 0.007*\"เวียดนาม\" + 0.006*\"เที่ยว\" + 0.005*\"ประเทศ\" + 0.005*\"ไทย\" + 0.005*\"หลวงพระบาง\"')\n","(27, '0.016*\"ได\" + 0.013*\"เห\" + 0.011*\"bitcoin\" + 0.010*\"กา\" + 0.009*\"ทำ\" + 0.008*\"วา\" + 0.008*\"เพ\" + 0.008*\"ขด\" + 0.008*\"กรอบรูป\" + 0.008*\"คา\"')\n","(12, '0.090*\"โรคสะเก็ดเงิน\" + 0.045*\"ปรสิต\" + 0.037*\"กลาก\" + 0.029*\"หนอน\" + 0.028*\"สำหรับ\" + 0.023*\"การรักษา\" + 0.019*\"เด็ก\" + 0.018*\"ครีม\" + 0.017*\"รักษา\" + 0.014*\"บน\"')\n","(20, '0.045*\"ชื่นชอบ\" + 0.043*\"ความวุ่นวาย\" + 0.018*\"สำหรับ\" + 0.014*\"ฉัน\" + 0.013*\"โรงแรม\" + 0.012*\"อาหาร\" + 0.012*\"ดี\" + 0.011*\"ทั้งหมด\" + 0.009*\"ห้อง\" + 0.009*\"ดู\"')\n","(14, '0.041*\"สินค้า\" + 0.032*\"ร้าน\" + 0.021*\"บาท\" + 0.019*\"ไทย\" + 0.013*\"ขาย\" + 0.013*\"ราคา\" + 0.013*\"โทร\" + 0.012*\"ตอบ\" + 0.012*\"การ์ตูน\" + 0.011*\"ดู\"')\n","(15, '0.015*\"ผม\" + 0.013*\"มัน\" + 0.010*\"ทำ\" + 0.009*\"นะ\" + 0.008*\"เรื่อง\" + 0.008*\"ตัว\" + 0.008*\"ดู\" + 0.007*\"ทำให้\" + 0.007*\"เอา\" + 0.006*\"ดี\"')\n","(1, '0.020*\"ไทย\" + 0.019*\"ปี\" + 0.012*\"บริษัท\" + 0.010*\"จำกัด\" + 0.007*\"ริ\" + 0.006*\"ใหม่\" + 0.006*\"ประเทศ\" + 0.005*\"อร\" + 0.004*\"โลก\" + 0.004*\"ซี\"')\n"]},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}]},{"cell_type":"code","source":["import pyLDAvis.gensim_models as gensimvis\n","import pyLDAvis\n","\n","# Visualize the topics\n","vis = gensimvis.prepare(lda_model, corpus, dictionary)\n","pyLDAvis.display(vis)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":950},"id":"1PmQhQT9KXmN","executionInfo":{"status":"ok","timestamp":1680162677219,"user_tz":-420,"elapsed":30252,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"9f69b5f9-6b85-4b56-9e01-b785d8c90e26"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n","/usr/local/lib/python3.9/dist-packages/pyLDAvis/_prepare.py:243: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only.\n"," default_term_info = default_term_info.sort_values(\n"]},{"output_type":"execute_result","data":{"text/plain":[""],"text/html":["\n","\n","\n","\n","
\n",""]},"metadata":{},"execution_count":35}]},{"cell_type":"code","source":["stopwords[-1]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":90},"id":"F0ph70yncbXZ","executionInfo":{"status":"ok","timestamp":1680161754575,"user_tz":-420,"elapsed":10,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"049f977e-c305-4b2f-cd57-e34135258e30"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":["'เท่าไร'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":29}]},{"cell_type":"code","source":["docs_topic = []\n","\n","for i in tqdm(range(len(df))):\n","\n"," topics = lda_model.get_document_topics(corpus[i])\n","\n"," top_topic = max(topics, key=lambda x: x[1])\n"," docs_topic.append(top_topic[0])"],"metadata":{"id":"SyBQjjmnRZWp","executionInfo":{"status":"ok","timestamp":1680160932187,"user_tz":-420,"elapsed":13304,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"894e54df-f763-403a-84b3-6362b1886f13"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n","100%|██████████| 10001/10001 [00:14<00:00, 701.56it/s]\n"]}]},{"cell_type":"code","source":["df[\"docs_topic\"] = docs_topic"],"metadata":{"id":"ZelYyzD0SJp5","executionInfo":{"status":"ok","timestamp":1680160932188,"user_tz":-420,"elapsed":41,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"233fd167-4fac-4c93-ca7d-288e8bbf1feb"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}]},{"cell_type":"code","source":["df[\"docs_topic\"].unique()"],"metadata":{"id":"Qz9rPLMzTIAX","executionInfo":{"status":"ok","timestamp":1680160932188,"user_tz":-420,"elapsed":35,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"e82a9864-cbfa-4dcb-81c8-e801c3639a8f"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":["array([28, 29, 14, 0, 24, 27, 25, 12, 18, 6, 5, 4, 21, 23, 19, 17, 1,\n"," 16, 7, 20, 15, 9, 3, 11, 13, 10, 22, 26, 2, 8])"]},"metadata":{},"execution_count":20}]},{"cell_type":"code","source":["df[df[\"text\"].str.contains(\"อวัยวะเพศ\")]"],"metadata":{"id":"aPbA-hgeSg5D"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# df[df[\"docs_topic\"]==14][\"text\"][5231]"],"metadata":{"id":"gGYOjapqUuti"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[df[\"docs_topic\"]==17].sample(20)"],"metadata":{"id":"pWj0ev7dSoZx"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[df[\"docs_topic\"]==1].iloc[4][\"text\"]"],"metadata":{"id":"Yy4mG_G_Sffz"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[(df[\"text\"].str.contains(\"เย็ด\")) & ~(df[\"text\"].str.contains(pattern))]"],"metadata":{"id":"VtZPbegAxLUF"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# Token Count"],"metadata":{"id":"t36-mHxBWYMI"}},{"cell_type":"code","source":["from transformers import AutoTokenizer \n","t5_tokenizer = AutoTokenizer.from_pretrained(\"google/mt5-base\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"i0Zr0BO3Wbe4","executionInfo":{"status":"ok","timestamp":1680163266725,"user_tz":-420,"elapsed":6879,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b514abe3-7644-40a6-c752-379aa3782b13"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/transformers/convert_slow_tokenizer.py:446: UserWarning: The sentencepiece tokenizer that you are converting to a fast tokenizer uses the byte fallback option which is not implemented in the fast tokenizers. In practice this means that the fast version of the tokenizer can produce unknown tokens whereas the sentencepiece version would have converted these unknown tokens into a sequence of byte tokens matching the original piece of text.\n"," warnings.warn(\n"]}]},{"cell_type":"code","source":["t5_tokenizer([\"หิวข้าวจังเงย\",\"งือๆ\"])[\"input_ids\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"3D5LfH3biOdM","executionInfo":{"status":"ok","timestamp":1680163393667,"user_tz":-420,"elapsed":870,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"2151f716-7f17-4158-ebb3-3b36258ad078"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[[259, 18604, 138504, 67641, 148184, 165860, 6200, 1],\n"," [259, 5095, 99650, 4571, 1]]"]},"metadata":{},"execution_count":4}]},{"cell_type":"code","source":["from tqdm import tqdm\n","oscar19=[]\n","token_count=0\n","i=0\n","for data in tqdm(iter(dataset)):\n"," if i%10000==1:\n"," token_count += sum([len(tokenized) for tokenized in t5_tokenizer(oscar19)[\"input_ids\"]])\n"," oscar19=[]\n","\n"," oscar19.append(data[\"text\"])\n"," i+=1\n","print(token_count)\n","print(token_count/i)"],"metadata":{"id":"tKBLCBNEiHQa"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# token เฉลี่ย 478.4516566902038\n","# row 1794110462"],"metadata":{"id":"Y0YSYtr0bxwy","executionInfo":{"status":"ok","timestamp":1680178359178,"user_tz":-420,"elapsed":953,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"e767dde1-25d7-4c98-e839-454a280d025b","colab":{"base_uri":"https://localhost:8080/"}},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["3749826"]},"metadata":{},"execution_count":12}]}]} \ No newline at end of file diff --git a/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2021.ipynb b/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2021.ipynb new file mode 100644 index 0000000..2fdd359 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2021.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":77275,"status":"ok","timestamp":1682709831865,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"Fs-SsXoIw2Kx","outputId":"ac7dd437-4763-45c6-ca04-cef8d2b94c76"},"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting datasets\n"," Downloading datasets-2.12.0-py3-none-any.whl (474 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m474.6/474.6 kB\u001b[0m \u001b[31m7.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (1.22.4)\n","Collecting dill<0.3.7,>=0.3.0\n"," Downloading dill-0.3.6-py3-none-any.whl (110 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.5/110.5 kB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from datasets) (23.1)\n","Collecting huggingface-hub<1.0.0,>=0.11.0\n"," Downloading huggingface_hub-0.14.1-py3-none-any.whl (224 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.5/224.5 kB\u001b[0m \u001b[31m15.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (2.27.1)\n","Collecting responses<0.19\n"," Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n","Requirement already satisfied: fsspec[http]>=2021.11.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (2023.4.0)\n","Collecting multiprocess\n"," Downloading multiprocess-0.70.14-py310-none-any.whl (134 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.3/134.3 kB\u001b[0m \u001b[31m5.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pyarrow>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (9.0.0)\n","Collecting xxhash\n"," Downloading xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m212.5/212.5 kB\u001b[0m \u001b[31m8.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (6.0)\n","Collecting aiohttp\n"," Downloading aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m30.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets) (1.5.3)\n","Requirement already satisfied: tqdm>=4.62.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (4.65.0)\n","Collecting aiosignal>=1.1.2\n"," Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n","Collecting frozenlist>=1.1.1\n"," Downloading frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (149 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m149.6/149.6 kB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting async-timeout<5.0,>=4.0.0a3\n"," Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n","Collecting yarl<2.0,>=1.0\n"," Downloading yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (268 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m268.8/268.8 kB\u001b[0m \u001b[31m9.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (23.1.0)\n","Collecting multidict<7.0,>=4.5\n"," Downloading multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.5/114.5 kB\u001b[0m \u001b[31m5.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: charset-normalizer<4.0,>=2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (2.0.12)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (3.12.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (4.5.0)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (3.4)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (1.26.15)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (2022.12.7)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2022.7.1)\n","Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2.8.2)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas->datasets) (1.16.0)\n","Installing collected packages: xxhash, multidict, frozenlist, dill, async-timeout, yarl, responses, multiprocess, huggingface-hub, aiosignal, aiohttp, datasets\n","Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 datasets-2.12.0 dill-0.3.6 frozenlist-1.3.3 huggingface-hub-0.14.1 multidict-6.0.4 multiprocess-0.70.14 responses-0.18.0 xxhash-3.2.0 yarl-1.9.2\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting transformers\n"," Downloading transformers-4.28.1-py3-none-any.whl (7.0 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.0/7.0 MB\u001b[0m \u001b[31m51.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n","Collecting tokenizers!=0.11.3,<0.14,>=0.11.1\n"," Downloading tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.8/7.8 MB\u001b[0m \u001b[31m74.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.22.4)\n","Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n","Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n","Requirement already satisfied: huggingface-hub<1.0,>=0.11.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.14.1)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n","Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (2023.4.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)\n","Installing collected packages: tokenizers, transformers\n","Successfully installed tokenizers-0.13.3 transformers-4.28.1\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (4.3.1)\n","Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim) (6.3.0)\n","Requirement already satisfied: scipy>=1.7.0 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.10.1)\n","Requirement already satisfied: numpy>=1.18.5 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.22.4)\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting pythainlp\n"," Downloading pythainlp-4.0.0-py3-none-any.whl (13.4 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.4/13.4 MB\u001b[0m \u001b[31m83.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: requests>=2.22.0 in /usr/local/lib/python3.10/dist-packages (from pythainlp) (2.27.1)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2022.12.7)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (1.26.15)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2.0.12)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (3.4)\n","Installing collected packages: pythainlp\n","Successfully installed pythainlp-4.0.0\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting pyLDAvis\n"," Downloading pyLDAvis-3.4.1-py3-none-any.whl (2.6 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m29.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (4.3.1)\n","Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.2.0)\n","Collecting funcy\n"," Downloading funcy-2.0-py2.py3-none-any.whl (30 kB)\n","Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (67.7.2)\n","Collecting pandas>=2.0.0\n"," Downloading pandas-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m87.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.10.1)\n","Collecting numpy>=1.24.2\n"," Downloading numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m17.3/17.3 MB\u001b[0m \u001b[31m19.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: scikit-learn>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.2.2)\n","Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (3.1.2)\n","Requirement already satisfied: numexpr in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (2.8.4)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2022.7.1)\n","Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2023.3)\n","Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2.8.2)\n","Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0.0->pyLDAvis) (3.1.0)\n","Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim->pyLDAvis) (6.3.0)\n","Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->pyLDAvis) (2.1.2)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas>=2.0.0->pyLDAvis) (1.16.0)\n","Installing collected packages: funcy, numpy, pandas, pyLDAvis\n"," Attempting uninstall: numpy\n"," Found existing installation: numpy 1.22.4\n"," Uninstalling numpy-1.22.4:\n"," Successfully uninstalled numpy-1.22.4\n"," Attempting uninstall: pandas\n"," Found existing installation: pandas 1.5.3\n"," Uninstalling pandas-1.5.3:\n"," Successfully uninstalled pandas-1.5.3\n","\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n","tensorflow 2.12.0 requires numpy<1.24,>=1.22, but you have numpy 1.24.3 which is incompatible.\n","numba 0.56.4 requires numpy<1.24,>=1.18, but you have numpy 1.24.3 which is incompatible.\n","google-colab 1.0.0 requires pandas~=1.5.3, but you have pandas 2.0.1 which is incompatible.\u001b[0m\u001b[31m\n","\u001b[0mSuccessfully installed funcy-2.0 numpy-1.24.3 pandas-2.0.1 pyLDAvis-3.4.1\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting sentencepiece\n"," Downloading sentencepiece-0.1.98-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: sentencepiece\n","Successfully installed sentencepiece-0.1.98\n"]}],"source":["!pip install datasets\n","!pip install transformers\n","!pip install gensim\n","!pip install pythainlp\n","!pip install pyLDAvis\n","!pip install sentencepiece"]},{"cell_type":"code","execution_count":2,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":8571,"status":"ok","timestamp":1682709840426,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"7YkUkFRK_qq2","outputId":"d6b93ec2-f2bc-4a19-e07b-32e9cbc16bfa"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n"," _| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|\n"," _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n"," _|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|\n"," _| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n"," _| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|\n"," \n"," To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .\n","Token: \n","Add token as git credential? (Y/n) N\n","Token is valid.\n","Your token has been saved to /root/.cache/huggingface/token\n","Login successful\n"]}],"source":["!huggingface-cli login\n","# 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"]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":7165,"status":"ok","timestamp":1682709847588,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"TfFettXTCro3","outputId":"890719a4-0bb3-4dcb-c408-f626fef9cc7f"},"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting zstandard\n"," Downloading zstandard-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 MB\u001b[0m \u001b[31m29.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: zstandard\n","Successfully installed zstandard-0.21.0\n"]}],"source":["!pip install zstandard"]},{"cell_type":"code","execution_count":4,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":81,"referenced_widgets":["921a1fcb60934765bd82f4824d72ea1c","9e266fdfcda14fe6863b4715f93d4f91","ffe2bbcfbe0f4c489d9bd4839b0b0fbe","71e2d79b04f24f1db635b2b6c3897036","64907717ab634a489f096a4c0f6d39ae","6b19004e27a04910acdab7ce92a2cc7a","34f55ac544384048a325c4068e3a3137","9c333fa1b0fc4bdf845894bdafaf9e1c","7e5f70dfdac043129330f3ec7d80a815","2b03a59b6e0d4ae09039b53029b5b601","643b05bfedb5433c8fdfca11e83583e4","1ac24ce8b4904896a0e1eb4c103a7cb1","a151f392e9bf44dea1f4d1cce38cded2","9f23568575d1436b9fa1d01ec5f68158","a42e5e0698204ed88cd8a245384bf81a","27cefb4ff9ae485e83085f6ca3f5a593","1d1c87f179fa45f3bce191e700962b94","d353d448f2b04b32baeb5937be6376b7","3859ce1501434371853bfcdcc9c34a83","3d56f2f75d16483c8ad34dad2266732b","0b748b77a6c542d2af6e564fe55a50a7","eaf50b2bedac40b78de2551709f95815"]},"executionInfo":{"elapsed":12312,"status":"ok","timestamp":1682709859897,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"M5E5aa3UxbXR","outputId":"4601a335-1c4d-4569-bc35-55a66b66318e"},"outputs":[{"output_type":"display_data","data":{"text/plain":["Downloading builder script: 0%| | 0.00/19.6k [00:0020000:\n"," break\n"]},{"cell_type":"code","execution_count":7,"metadata":{"executionInfo":{"elapsed":3,"status":"ok","timestamp":1682709912772,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"OX2k-fb2xC80"},"outputs":[],"source":["import pandas as pd \n","df = pd.DataFrame(oscar21)"]},{"cell_type":"code","execution_count":8,"metadata":{"executionInfo":{"elapsed":3971,"status":"ok","timestamp":1682709916741,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"4w_qgPToxVla"},"outputs":[],"source":["import re\n","from pythainlp.util import countthai\n","\n","def check_containing_bad_keywords(text):\n","\n"," porn_keywords =[\"คลิปหลุด\",\"กระเจี๊ยว\",\"คลิปโป๊\",\"หนังโป๊\",\"หนังโป้\",\"หนังโป็\",\"เรื่องเสียว\",\"ซอยหี\",\"ชักว่าว\",\"ท่าหมา\",\"ขย่มควย\",\"เล่นเสียว\",\"ควยใหญ่\",\"หนังเอ็กซ์\",\"แหกหี\"]\n"," gamble_keywords = [\"ufabet\",\"UFABET\",\"ล้มโต๊ะ\", \"เซียนสเต็ป\",\"บอลเต็ง\",\"แทงบอล\",\"คาสิโน\",\"บาคาร่า\",\"เว็บสล็อต\",\"เกมสล็อต\",\"สล็อตออนไลน์\",\"คาสิโนออนไลน์\",\n"," \"หวยมาเลย์\", \"หวยฮานอย\", \"น้ำเต้าปูปลา\", \"หวยออนไลน์\" , \"แทงหวย\" , \"หวยหุ้น\", \"ยิงปลาออนไลน์\" ,\"ได้เงินจริง\",\"บา คา ร่า\"]\n"," movie_keywords =[\"ดูหนังออนไลน์\",\"หนังออนไลน์\",\"เว็บดูหนัง\",\"หนังชนโรง\",\"หนังใหม่ชนโรง\",\"เสียงไทย\",\"เสียงญี่ปุ่น\",\"เสียงอังกฤษ\"]\n"," like_keywords = [\"ปั้มไลค์\",\"รับจ้างกดไลค์\",\"จ้างไลค์\",\"ปั๊มไลค์\",\"ปั่นไลค์\",\"เพิ่มไลค์\",\"ซื้อไลค์\"]\n"," code_keywords =[\"padding:\",\"display:\",\"S3=n8\",\"phpBB Debug\",\"getElementById\",\"innerHTML\",\"parseInt\",\"addEventListener\",\"console\\.log\",\"checkCookieForTarget\",\"setAttribute\",\"getItem\",\"if \\(\",\"else {\",\"JSON\\.stringify\",\"onclick\"]\n","\n"," ratchakarn_website_keywords = [\"คุณกำลังใช้งานแบบปิดการใช้ Javascript\",\"Longdo Dictionary\",\"นโยบายการคุ้มครองข้อมูลส่วนบุคคล\",\"เงื่อนไขการให้บริการเว็บไซต์\",\"นโยบายความปลอดภัย\",\"นโยบายเว็บไซต์และการปฏิเสธความรับผิด\",\"คุณอาจจะยังไม่ได้เข้าสู่ระบบหรือยังไม่ได้ลงทะเบียน\",\"คุณไม่ได้เข้าสู่ระบบหรือคุณไม่มีสิทธิ์เข้าหน้านี้\"]\n","\n"," porn_keywords += [\" \".join(list(kw)) for kw in porn_keywords]\n"," gamble_keywords += [\" \".join(list(kw)) for kw in gamble_keywords]\n"," movie_keywords += [\" \".join(list(kw)) for kw in movie_keywords]\n","\n"," bad_keywords = porn_keywords + gamble_keywords + movie_keywords + like_keywords + code_keywords + ratchakarn_website_keywords\n","\n"," sparse_bad_keywords = []\n","\n"," pattern = '|'.join(bad_keywords) \n"," return bool(re.search(pattern, text))\n","\n","def check_ratio_bad_substring(text,n):\n"," month_to_count = [\"มกราคม\",\"กุมภาพันธ์\",\"มีนาคม\",\"เมษายน\",\"พฤษภาคม\",\"มิถุนายน\",\"กรกฎาคม\",\"สิงหาคม\",\"กันยายน\",\"ตุลาคม\",\"พฤศจิกายน\",\"ธันวาคม\",\n"," \"ม\\.ค\\.\",\"ก\\.พ\\.\",\"มี\\.ค\\.\",\"เม\\.ย\\.\",\"พ\\.ค\\.\",\"มิ\\.ย\\.\",\"ก\\.ค\\.\",\"ส\\.ค\\.\",\"ก\\.ย\\.\",\"ต\\.ค\\.\",\"พ\\.ย\\.\",\"ธ\\.ค\\.\"]\n"," special_to_count = [\"\\{\",\"\\+\",\"\\}\",\"/\",\":\"]\n","\n"," if len(re.findall(\"|\".join(month_to_count),text))/n > 0.015:\n"," return \"\"\n","\n"," if len(re.findall(\"|\".join(special_to_count),text))/n > 0.075:\n"," return \"\"\n","\n"," if len(re.findall(\" \",text))/n > 0.13:\n"," return \"\"\n","\n"," if len(re.findall(\",\",text))/n > 0.05:\n"," return \"\"\n","\n","def remove_bad_substring(text):\n"," to_replace_keywords = [\"Posted on\",\"Posted by\",\"Posted by:\",\"Posted By:\",\"สมาชิกหมายเลข [0-9,]+\",\"อ่าน [0-9,]+ ครั้ง\",\"เปิดดู [0-9,]+ ครั้ง\",\"ดู [0-9,]+ ครั้ง\",\"คะแนนสะสม: [0-9,]+ แต้ม\",\"ความคิดเห็น: [0-9,]+\",\n"," \"[0-9,]+ บุคคลทั่วไป กำลังดูบอร์ดนี้\",\"หน้าที่แล้ว ต่อไป\",\"ความคิดเห็นที่ [0-9,]+\",\"[0-9,]+ สมาชิก และ [0-9,]+ บุคคลทั่วไป\",\"กำลังดูหัวข้อนี้\",\"เข้าสู่ระบบด้วยชื่อผู้ใช้\",\n"," \"แสดงกระทู้จาก:\",\"กระทู้: [0-9,]+\",\"เว็บไซต์เรามีการใช้คุกกี้และเก็บข้อมูลผู้ใช้งาน โปรดศึกษาและยอมรับ นโยบายคุ้มครองข้อมูลส่วนบุคคล ก่อนใช้งาน\",\n"," \"Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use\\.\",\n"," \"Previous\\t\\nNext\\nLeave a Reply Cancel reply\\nYou must be logged in to post a comment.\\nSearch for:\\nFeatured Post\\n\",\n"," \"Click to read more\\nYou must be logged in to view or write comments\\.\",\"[0-9,]+ Views\",\"Skip to content\",\"Last Modified Posts\",\"Last Updated:\",\n"," \"\\(อ่าน [0-9,]+ ครั้ง\\)\",\"Recent Comments\",\"«.*?»\",\"< --แสดงทั้งหมด-- >\",\"นโยบายความเป็นส่วนตัว\",\"เงื่อนไขการใช้เว็บไซต์\",\"ตั้งค่าคุกกี้\",\"ท่านยอมรับให้เว็บไซต์นี้จัดเก็บคุกกี้เพื่อประสบการณ์การใช้งานเว็บไซต์ที่ดียิ่งขึ้น\",\n"," \"รวมถึงช่วยให้ท่านมีโอกาสได้รับข้อเสนอหรือเนื้อหาที่ตรงตามความสนใจของท่าน\",\"ท่านสามารถดู Privacy Notice ของเว็บไซต์เรา ได้ที่นี่\",\"You may be trying to access this site from a secured browser on the server. Please enable scripts and reload this page.\",\n"," \"เผยแพร่: \\d\\d [ก-๙]+ \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Last updated: \\d\\d [ก-๙]+\\.[ก-๙]+\\. \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\.\",\n"," \"Search for:\",\"Save my name, email, and website in this browser for the next time I comment\",\"Your email address will not be published. Required fields are marked\",\n"," \"Leave a Reply Cancel reply\",\"((?:หน้าหลัก|เข้าสู่ระบบ|หน้าแรก) \\|(?: .+(?:(?: \\|)|$))+)\",\"กลับหน้าแรก\",\"ติดต่อเรา\",\"Contact Us\",\"#\\w+\",\"ติดต่อผู้ดูแลเว็บไซต์\",\n"," \"หากท่านพบว่ามีข้อมูลใดๆที่ละเมิดทรัพย์สินทางปัญญาปรากฏอยู่ในเว็บไซต์โปรดแจ้งให้ทราบ\",\"No related posts\",\"Posted in\",\"((?:Tags:|Tagged|Tag) (?:.{1,40}(?:,|\\n|$))+)\",\"ตอบ:\",\"Sort by:\",\n"," \"All rights reserved\",\"ความยาวอย่างน้อย\",\"ระบบได้ดำเนินการส่ง OTP\",\"เป็นสมาชิกอยู่แล้ว\\?\",\"We use cookies\",\"Cookie Settings\",\n"," \"Homeหน้าหลัก\", \"Home หน้าหลัก\", \"ข่าวสารล่าสุด\", \"ปัญหา การใช้งาน\", \"ปัญหาการใช้งาน\" \"ผู้เขียน\" ,\"หัวข้อ:\" ,\"\\*\\* พร้อมส่ง \\*\\*\"]\n"," \n"," return re.sub(\"|\".join(to_replace_keywords),\"\",text)\n","\n","def clean_text(text):\n","\n"," n=len(text)\n"," \n"," if check_containing_bad_keywords(text) or check_ratio_bad_substring(text,n) or countthai(text)<50:\n"," # if check_containing_bad_keywords(text) or countthai(text)<0.5:\n"," return \"\"\n"," \n"," text= remove_bad_substring(text)\n","\n"," # not sure if we should normalize\n"," #text = normalize(text)\n","\n"," return text\n"]},{"cell_type":"code","execution_count":9,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":40127,"status":"ok","timestamp":1682709956858,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"1KJxyqLF74Cs","outputId":"3e02e81a-9e86-4a47-ec16-2b803ac7f3be"},"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 20001/20001 [00:39<00:00, 501.15it/s]\n"]}],"source":["tqdm.pandas()\n","df[\"clean_text\"] = df[\"text\"].progress_apply(clean_text)"]},{"cell_type":"code","execution_count":10,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":495,"referenced_widgets":["8c6839949fe04d8aa463d9a97cddb73b","aa512388f3cb4a5ebe2e35cbbdb70b68","6db17f7a06e64817afb04ed1c0817492","96314acbe5ce458bbdd5f1bf21801d28","2ee36385b29347899a2f88150e5d78b4","3574e5f11bf14d62bc86d2e7f8095b05","3bf134d1624d4fca83d96019fcaeda3f","33c163162cd24eaa89530a28631fdcd9","e57746c4819a449c8fd5a2f9e1ba5abe","f202681f72b24b33910ac56cb07026e9","97bf717b2c63474fbf53514f6424b7e5","47324bc77b634968bc9a49671a3d196c","1bed6bd481e847fb856b5d4f7e15db07","a01753f0cbbc4f87b3a265b5f5184d04","7b2d4c164a214d77abfbcf1fd2bf815b","e0d5c10f0e12404695797e8d9860ff82","9f13d200c53041bd8fbef57ffb84262c","2cf8862d5cd341af825cc80b49574969","91dbe27ade5e408999a26299e07de95f","13da5b95612a47ad860ff6cb94ad5d9b","6af10fcb6bd944ab91e59a4060b6768d","fd8050b81efc47b1a20ed5a9845d937a","a23d05e46db64d44bfdc29aab4a75f5f","d1e651436bf748b8aab29d0d742b643d","36a7fd1837d44f659569636a3be40e03","f0445520cd6246d08535feeec8c0d264","104c9b13cafd4788b56258603c7061ec","04e6f41bc3874818b6cb9377b8e852c9","b27ad09c1e744b88b271deea0146f3e4","0edae4e60a644550b936d66b008e6333","7e8232d2bbf144169a0f4c89714b49ab","c316b602dd744fdf84a65593f26bcbe9","f46932975e5d4749b0149833caa13941","c4b3af5130884d52ad8114fc4a32e0ee","93a91428e3c047ea87ed1c6f265c7491","5b6eeea6741e479698a08769df9e718e","023e40ef705e4cf8b7f171b39bc93407","640ef878c8ea46cb9f737e5c0a53c3d5","2bd94cc559fb489cb5cd9eb28a2557b8","daccbbb82f5b4a219b5d4d814212793d","ce6982b1095d4349950562883f1e7662","96872e5518ef4b0d9d863013215670a9","f952b24be07144d1bcd0a5433dce9f4f","1cc7408c5b9c4fec85b64caaa83c2e5c"]},"executionInfo":{"elapsed":8806,"status":"ok","timestamp":1682709965654,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"jBgtBHQqeD6V","outputId":"88c0f6ad-c217-4e90-f08d-4958038999df"},"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: transformers in /usr/local/lib/python3.10/dist-packages (4.28.1)\n","Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n","Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.24.3)\n","Requirement already satisfied: huggingface-hub<1.0,>=0.11.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.14.1)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n","Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n","Requirement already satisfied: tokenizers!=0.11.3,<0.14,>=0.11.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.13.3)\n","Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (2023.4.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n"]},{"output_type":"display_data","data":{"text/plain":["Downloading (…)okenizer_config.json: 0%| | 0.00/376 [00:001]"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":295452,"status":"ok","timestamp":1680896638162,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"wsGJGJLUytKH","outputId":"b98d3ff5-d8a7-4655-c2f5-da838f85132f"},"outputs":[{"name":"stderr","output_type":"stream","text":["100%|██████████| 20001/20001 [04:41<00:00, 70.96it/s]\n"]}],"source":["tokenized_doc = df[\"text\"].progress_apply(preprocess_text)\n","\n","\n","dictionary_path = \"/content/drive/MyDrive/Openthaigpt/lda_dict_oscar2021\"\n","check_file = os.path.isfile(dictionary_path)\n","\n","if not check_file:\n"," dictionary = corpora.Dictionary(tokenized_doc)\n"," dictionary.save(dictionary_path)\n","else :\n"," dictionary=corpora.Dictionary.load(\"filename\")\n","\n","\n","corpus = [dictionary.doc2bow(doc) for doc in tokenized_doc]\n","\n","num_topics = 30\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"ZUog67zjpEAo"},"outputs":[],"source":["lda_model = LdaModel(corpus=corpus, id2word=dictionary, num_topics=num_topics , passes=20, iterations=100,random_state=1)\n"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":29,"status":"ok","timestamp":1680897445152,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"5yaccnLoK9DR","outputId":"f8beb530-f057-48ba-f3c2-93f76f50e686"},"outputs":[{"name":"stdout","output_type":"stream","text":["(4, '0.222*\" \" + 0.042*\" \" + 0.028*\" \" + 0.019*\"สพป\" + 0.017*\"อ่าน\" + 0.017*\"โปรแกรม\" + 0.015*\"ประกาศ\" + 0.012*\"ประจำ\" + 0.012*\"สอบ\" + 0.012*\"กพ\"')\n","(14, '0.026*\"พระ\" + 0.013*\"ท่าน\" + 0.012*\"วัด\" + 0.010*\"ทรง\" + 0.006*\"ผู้\" + 0.006*\"ธรรม\" + 0.005*\"พระองค์\" + 0.005*\"เมือง\" + 0.005*\"สร้าง\" + 0.004*\"ป่า\"')\n","(16, '0.010*\"ลูก\" + 0.009*\"สวย\" + 0.008*\"เอา\" + 0.008*\"น้อง\" + 0.008*\"ตัว\" + 0.007*\"พี่\" + 0.007*\"นะคะ\" + 0.007*\"เค้า\" + 0.006*\"บอก\" + 0.006*\"ดู\"')\n","(22, '0.073*\"ร้าน\" + 0.031*\"อาหาร\" + 0.025*\"เมนู\" + 0.020*\"อร่อย\" + 0.013*\"กิน\" + 0.012*\"เนื้อ\" + 0.012*\"ปลา\" + 0.011*\"รส\" + 0.010*\"ข้าว\" + 0.010*\"หอม\"')\n","(24, '0.047*\" \" + 0.028*\"บ้าน\" + 0.020*\"ขาย\" + 0.015*\"ห้อง\" + 0.015*\"พื้นที่\" + 0.014*\"โครงการ\" + 0.012*\"ที่ดิน\" + 0.010*\"ถนน\" + 0.010*\"ชั้น\" + 0.010*\"คอนโด\"')\n","(17, '0.118*\"บริษัท\" + 0.106*\"จำกัด\" + 0.019*\"เอส\" + 0.015*\"พร็อพเพอร์ตี้\" + 0.015*\" \" + 0.014*\"เต\" + 0.012*\"ดี\" + 0.011*\"อร\" + 0.010*\"เวล\" + 0.010*\"พี\"')\n","(9, '0.087*\"เล่น\" + 0.059*\"เกม\" + 0.029*\"ออนไลน์\" + 0.019*\"เดิมพัน\" + 0.018*\"ผู้\" + 0.017*\" \" + 0.015*\"เกมส์\" + 0.014*\"สล็อต\" + 0.013*\"การพนัน\" + 0.013*\"สามารถ\"')\n","(10, '0.030*\" \" + 0.025*\"รถ\" + 0.015*\"รถยนต์\" + 0.014*\"เครื่อง\" + 0.012*\"อุปกรณ์\" + 0.011*\"แบตเตอรี่\" + 0.010*\"ราคา\" + 0.010*\"สี\" + 0.009*\"รุ่น\" + 0.008*\"ระบบ\"')\n","(19, '0.043*\" \" + 0.012*\"ปร\" + 0.012*\"พศ\" + 0.012*\"ระลึกถึง\" + 0.010*\"ไทย\" + 0.007*\"นาย\" + 0.007*\"โรงเรียน\" + 0.007*\"วันที่\" + 0.007*\"โครงการ\" + 0.006*\"การศึกษา\"')\n","(1, '0.053*\" \" + 0.011*\"เพลง\" + 0.009*\"the\" + 0.008*\"ไทย\" + 0.007*\"งาน\" + 0.006*\"ใหม่\" + 0.005*\"of\" + 0.005*\"ภาพ\" + 0.004*\"in\" + 0.004*\"ปี\"')\n","(23, '0.016*\"ทำให้\" + 0.015*\"สามารถ\" + 0.014*\"ดี\" + 0.014*\"ใช้\" + 0.013*\"ที่จะ\" + 0.011*\"เรื่อง\" + 0.011*\"สิ่ง\" + 0.008*\"ดู\" + 0.008*\"เลือก\" + 0.007*\"อาจจะ\"')\n","(12, '0.015*\"ละคร\" + 0.013*\"ฉัน\" + 0.010*\"รัก\" + 0.008*\"เรื่อง\" + 0.005*\"จน\" + 0.005*\"ชีวิต\" + 0.004*\"ผู้\" + 0.004*\"เกิด\" + 0.004*\"ข่าว\" + 0.004*\"นาย\"')\n","(26, '0.013*\"สามารถ\" + 0.012*\"ใช้\" + 0.012*\"สำหรับ\" + 0.011*\"ข้อมูล\" + 0.009*\" \" + 0.009*\"บริษัท\" + 0.008*\"ได้รับ\" + 0.008*\"ธุรกิจ\" + 0.007*\"สร้าง\" + 0.006*\"เกี่ยวกับ\"')\n","(21, '0.122*\"หนัง\" + 0.097*\"ดู\" + 0.034*\"ออนไลน์\" + 0.034*\"ไทย\" + 0.025*\"ซี\" + 0.025*\"ใหม่\" + 0.023*\"ย์\" + 0.018*\"รี่\" + 0.017*\"ฟรี\" + 0.016*\"ซับ\"')\n","(6, '0.031*\"เดินทาง\" + 0.031*\"เกาะ\" + 0.027*\"โรงแรม\" + 0.027*\"เที่ยว\" + 0.025*\"ญี่ปุ่น\" + 0.019*\"ที่พัก\" + 0.017*\"ชม\" + 0.016*\"ประเทศ\" + 0.014*\"เมือง\" + 0.014*\"สถานที่\"')\n","(28, '0.044*\" \" + 0.028*\"บาท\" + 0.024*\"ขอเดชะ\" + 0.024*\"ความอาลัย\" + 0.021*\"ผู้บริหาร\" + 0.017*\"เงิน\" + 0.016*\"ราคา\" + 0.015*\"สินค้า\" + 0.014*\"ซื้อ\" + 0.012*\"ล้าน\"')\n","(5, '0.053*\" \" + 0.014*\"ทีม\" + 0.013*\"ปี\" + 0.008*\"พวกเขา\" + 0.007*\"เกม\" + 0.006*\"การแข่งขัน\" + 0.006*\"ฉัน\" + 0.005*\"เล่น\" + 0.005*\"กีฬา\" + 0.005*\"ผู้\"')\n","(2, '0.046*\"พิมพ์\" + 0.042*\"ป้าย\" + 0.037*\"กระดาษ\" + 0.023*\"ถัง\" + 0.020*\"บอร์ด\" + 0.017*\"โค้ด\" + 0.013*\"โลโก้\" + 0.013*\"บำบัด\" + 0.013*\"อะ\" + 0.013*\"สติ๊กเกอร์\"')\n","(29, '0.049*\"เย็ด\" + 0.041*\"หี\" + 0.031*\"คลิป\" + 0.025*\"หนังโป๊\" + 0.025*\"หนัง\" + 0.022*\"ควย\" + 0.021*\"สาว\" + 0.015*\"ไทย\" + 0.014*\"ดู\" + 0.014*\"xxx\"')\n","(3, '0.085*\"พระ\" + 0.078*\"เกล้า\" + 0.044*\"บาท\" + 0.043*\"สมเด็จ\" + 0.042*\"มิ\" + 0.042*\"โรงพยาบาล\" + 0.042*\"รา\" + 0.041*\"มหา\" + 0.040*\"ถวาย\" + 0.040*\"แพ\"')\n"]}],"source":["for topic in lda_model.print_topics():\n"," print(topic)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":916},"executionInfo":{"elapsed":51975,"status":"ok","timestamp":1680897497122,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"1PmQhQT9KXmN","outputId":"0ed489b6-daf4-4de2-8206-116cdd087712"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.9/dist-packages/pyLDAvis/_prepare.py:243: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only.\n"," default_term_info = default_term_info.sort_values(\n"]},{"data":{"text/html":["\n","\n","\n","\n","
\n",""],"text/plain":[""]},"execution_count":14,"metadata":{},"output_type":"execute_result"}],"source":["import pyLDAvis.gensim_models as gensimvis\n","import pyLDAvis\n","\n","# Visualize the topics\n","vis = gensimvis.prepare(lda_model, corpus, dictionary)\n","pyLDAvis.display(vis)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":30818,"status":"ok","timestamp":1680897527926,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"SyBQjjmnRZWp","outputId":"3df78eeb-dfca-448d-ce1f-8d2f0b37f5e7"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n","100%|██████████| 20001/20001 [00:31<00:00, 626.75it/s]\n"]}],"source":["docs_topic = []\n","\n","for i in tqdm(range(len(df))):\n","\n"," topics = lda_model.get_document_topics(corpus[i])\n","\n"," top_topic = max(topics, key=lambda x: x[1])\n"," docs_topic.append(top_topic[0])"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":41,"status":"ok","timestamp":1680160932188,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"ZelYyzD0SJp5","outputId":"233fd167-4fac-4c93-ca7d-288e8bbf1feb"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}],"source":["df[\"docs_topic\"] = docs_topic"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":35,"status":"ok","timestamp":1680160932188,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"Qz9rPLMzTIAX","outputId":"e82a9864-cbfa-4dcb-81c8-e801c3639a8f"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"data":{"text/plain":["array([28, 29, 14, 0, 24, 27, 25, 12, 18, 6, 5, 4, 21, 23, 19, 17, 1,\n"," 16, 7, 20, 15, 9, 3, 11, 13, 10, 22, 26, 2, 8])"]},"execution_count":20,"metadata":{},"output_type":"execute_result"}],"source":["df[\"docs_topic\"].unique()"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"aPbA-hgeSg5D"},"outputs":[],"source":["df[df[\"text\"].str.contains(\"อวัยวะเพศ\")]"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"gGYOjapqUuti"},"outputs":[],"source":["# df[df[\"docs_topic\"]==14][\"text\"][5231]"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"pWj0ev7dSoZx"},"outputs":[],"source":["df[df[\"docs_topic\"]==17].sample(20)"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"Yy4mG_G_Sffz"},"outputs":[],"source":["df[df[\"docs_topic\"]==1].iloc[4][\"text\"]"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"VtZPbegAxLUF"},"outputs":[],"source":["df[(df[\"text\"].str.contains(\"เย็ด\")) & ~(df[\"text\"].str.contains(pattern))]"]},{"cell_type":"markdown","metadata":{"id":"t36-mHxBWYMI"},"source":["# Token Count"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":6879,"status":"ok","timestamp":1680163266725,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"i0Zr0BO3Wbe4","outputId":"b514abe3-7644-40a6-c752-379aa3782b13"},"outputs":[{"name":"stderr","output_type":"stream","text":["/usr/local/lib/python3.9/dist-packages/transformers/convert_slow_tokenizer.py:446: UserWarning: The sentencepiece tokenizer that you are converting to a fast tokenizer uses the byte fallback option which is not implemented in the fast tokenizers. In practice this means that the fast version of the tokenizer can produce unknown tokens whereas the sentencepiece version would have converted these unknown tokens into a sequence of byte tokens matching the original piece of text.\n"," warnings.warn(\n"]}],"source":["from transformers import AutoTokenizer \n","t5_tokenizer = AutoTokenizer.from_pretrained(\"google/mt5-base\")"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":870,"status":"ok","timestamp":1680163393667,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"3D5LfH3biOdM","outputId":"2151f716-7f17-4158-ebb3-3b36258ad078"},"outputs":[{"data":{"text/plain":["[[259, 18604, 138504, 67641, 148184, 165860, 6200, 1],\n"," [259, 5095, 99650, 4571, 1]]"]},"execution_count":4,"metadata":{},"output_type":"execute_result"}],"source":["t5_tokenizer([\"หิวข้าวจังเงย\",\"งือๆ\"])[\"input_ids\"]"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"tKBLCBNEiHQa"},"outputs":[],"source":["from tqdm import tqdm\n","oscar19=[]\n","token_count=0\n","i=0\n","for data in tqdm(iter(dataset)):\n"," if i%10000==1:\n"," token_count += sum([len(tokenized) for tokenized in t5_tokenizer(oscar19)[\"input_ids\"]])\n"," oscar19=[]\n","\n"," oscar19.append(data[\"text\"])\n"," i+=1\n","print(token_count)\n","print(token_count/i)"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":953,"status":"ok","timestamp":1680178359178,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"},"user_tz":-420},"id":"Y0YSYtr0bxwy","outputId":"e767dde1-25d7-4c98-e839-454a280d025b"},"outputs":[{"data":{"text/plain":["3749826"]},"execution_count":12,"metadata":{},"output_type":"execute_result"}],"source":["# token เฉลี่ย 478.4516566902038\n","# row 1794110462"]}],"metadata":{"colab":{"provenance":[],"mount_file_id":"1gtVLNj-4fVGtEBCuYKf9bm-vyMF38Plk","authorship_tag":"ABX9TyODriDC4GH7tpHDHTFjCE/6"},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"921a1fcb60934765bd82f4824d72ea1c":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_9e266fdfcda14fe6863b4715f93d4f91","IPY_MODEL_ffe2bbcfbe0f4c489d9bd4839b0b0fbe","IPY_MODEL_71e2d79b04f24f1db635b2b6c3897036"],"layout":"IPY_MODEL_64907717ab634a489f096a4c0f6d39ae"}},"9e266fdfcda14fe6863b4715f93d4f91":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6b19004e27a04910acdab7ce92a2cc7a","placeholder":"​","style":"IPY_MODEL_34f55ac544384048a325c4068e3a3137","value":"Downloading builder script: 100%"}},"ffe2bbcfbe0f4c489d9bd4839b0b0fbe":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_9c333fa1b0fc4bdf845894bdafaf9e1c","max":19572,"min":0,"orientation":"horizontal","style":"IPY_MODEL_7e5f70dfdac043129330f3ec7d80a815","value":19572}},"71e2d79b04f24f1db635b2b6c3897036":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2b03a59b6e0d4ae09039b53029b5b601","placeholder":"​","style":"IPY_MODEL_643b05bfedb5433c8fdfca11e83583e4","value":" 19.6k/19.6k [00:00<00:00, 501kB/s]"}},"64907717ab634a489f096a4c0f6d39ae":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6b19004e27a04910acdab7ce92a2cc7a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"34f55ac544384048a325c4068e3a3137":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"9c333fa1b0fc4bdf845894bdafaf9e1c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7e5f70dfdac043129330f3ec7d80a815":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"2b03a59b6e0d4ae09039b53029b5b601":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"643b05bfedb5433c8fdfca11e83583e4":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"1ac24ce8b4904896a0e1eb4c103a7cb1":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_a151f392e9bf44dea1f4d1cce38cded2","IPY_MODEL_9f23568575d1436b9fa1d01ec5f68158","IPY_MODEL_a42e5e0698204ed88cd8a245384bf81a"],"layout":"IPY_MODEL_27cefb4ff9ae485e83085f6ca3f5a593"}},"a151f392e9bf44dea1f4d1cce38cded2":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_1d1c87f179fa45f3bce191e700962b94","placeholder":"​","style":"IPY_MODEL_d353d448f2b04b32baeb5937be6376b7","value":"Downloading readme: 100%"}},"9f23568575d1436b9fa1d01ec5f68158":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_3859ce1501434371853bfcdcc9c34a83","max":247434,"min":0,"orientation":"horizontal","style":"IPY_MODEL_3d56f2f75d16483c8ad34dad2266732b","value":247434}},"a42e5e0698204ed88cd8a245384bf81a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_0b748b77a6c542d2af6e564fe55a50a7","placeholder":"​","style":"IPY_MODEL_eaf50b2bedac40b78de2551709f95815","value":" 247k/247k [00:00<00:00, 3.66MB/s]"}},"27cefb4ff9ae485e83085f6ca3f5a593":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1d1c87f179fa45f3bce191e700962b94":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d353d448f2b04b32baeb5937be6376b7":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3859ce1501434371853bfcdcc9c34a83":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3d56f2f75d16483c8ad34dad2266732b":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"0b748b77a6c542d2af6e564fe55a50a7":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"eaf50b2bedac40b78de2551709f95815":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8c6839949fe04d8aa463d9a97cddb73b":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_aa512388f3cb4a5ebe2e35cbbdb70b68","IPY_MODEL_6db17f7a06e64817afb04ed1c0817492","IPY_MODEL_96314acbe5ce458bbdd5f1bf21801d28"],"layout":"IPY_MODEL_2ee36385b29347899a2f88150e5d78b4"}},"aa512388f3cb4a5ebe2e35cbbdb70b68":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_3574e5f11bf14d62bc86d2e7f8095b05","placeholder":"​","style":"IPY_MODEL_3bf134d1624d4fca83d96019fcaeda3f","value":"Downloading (…)okenizer_config.json: 100%"}},"6db17f7a06e64817afb04ed1c0817492":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_33c163162cd24eaa89530a28631fdcd9","max":376,"min":0,"orientation":"horizontal","style":"IPY_MODEL_e57746c4819a449c8fd5a2f9e1ba5abe","value":376}},"96314acbe5ce458bbdd5f1bf21801d28":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_f202681f72b24b33910ac56cb07026e9","placeholder":"​","style":"IPY_MODEL_97bf717b2c63474fbf53514f6424b7e5","value":" 376/376 [00:00<00:00, 19.4kB/s]"}},"2ee36385b29347899a2f88150e5d78b4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3574e5f11bf14d62bc86d2e7f8095b05":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3bf134d1624d4fca83d96019fcaeda3f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"33c163162cd24eaa89530a28631fdcd9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e57746c4819a449c8fd5a2f9e1ba5abe":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"f202681f72b24b33910ac56cb07026e9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"97bf717b2c63474fbf53514f6424b7e5":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"47324bc77b634968bc9a49671a3d196c":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_1bed6bd481e847fb856b5d4f7e15db07","IPY_MODEL_a01753f0cbbc4f87b3a265b5f5184d04","IPY_MODEL_7b2d4c164a214d77abfbcf1fd2bf815b"],"layout":"IPY_MODEL_e0d5c10f0e12404695797e8d9860ff82"}},"1bed6bd481e847fb856b5d4f7e15db07":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9f13d200c53041bd8fbef57ffb84262c","placeholder":"​","style":"IPY_MODEL_2cf8862d5cd341af825cc80b49574969","value":"Downloading (…)lve/main/config.json: 100%"}},"a01753f0cbbc4f87b3a265b5f5184d04":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_91dbe27ade5e408999a26299e07de95f","max":702,"min":0,"orientation":"horizontal","style":"IPY_MODEL_13da5b95612a47ad860ff6cb94ad5d9b","value":702}},"7b2d4c164a214d77abfbcf1fd2bf815b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6af10fcb6bd944ab91e59a4060b6768d","placeholder":"​","style":"IPY_MODEL_fd8050b81efc47b1a20ed5a9845d937a","value":" 702/702 [00:00<00:00, 36.8kB/s]"}},"e0d5c10f0e12404695797e8d9860ff82":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9f13d200c53041bd8fbef57ffb84262c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2cf8862d5cd341af825cc80b49574969":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"91dbe27ade5e408999a26299e07de95f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"13da5b95612a47ad860ff6cb94ad5d9b":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"6af10fcb6bd944ab91e59a4060b6768d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fd8050b81efc47b1a20ed5a9845d937a":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"a23d05e46db64d44bfdc29aab4a75f5f":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_d1e651436bf748b8aab29d0d742b643d","IPY_MODEL_36a7fd1837d44f659569636a3be40e03","IPY_MODEL_f0445520cd6246d08535feeec8c0d264"],"layout":"IPY_MODEL_104c9b13cafd4788b56258603c7061ec"}},"d1e651436bf748b8aab29d0d742b643d":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_04e6f41bc3874818b6cb9377b8e852c9","placeholder":"​","style":"IPY_MODEL_b27ad09c1e744b88b271deea0146f3e4","value":"Downloading (…)ve/main/spiece.model: 100%"}},"36a7fd1837d44f659569636a3be40e03":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_0edae4e60a644550b936d66b008e6333","max":4309802,"min":0,"orientation":"horizontal","style":"IPY_MODEL_7e8232d2bbf144169a0f4c89714b49ab","value":4309802}},"f0445520cd6246d08535feeec8c0d264":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c316b602dd744fdf84a65593f26bcbe9","placeholder":"​","style":"IPY_MODEL_f46932975e5d4749b0149833caa13941","value":" 4.31M/4.31M [00:00<00:00, 31.1MB/s]"}},"104c9b13cafd4788b56258603c7061ec":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"04e6f41bc3874818b6cb9377b8e852c9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b27ad09c1e744b88b271deea0146f3e4":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"0edae4e60a644550b936d66b008e6333":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7e8232d2bbf144169a0f4c89714b49ab":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c316b602dd744fdf84a65593f26bcbe9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f46932975e5d4749b0149833caa13941":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c4b3af5130884d52ad8114fc4a32e0ee":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_93a91428e3c047ea87ed1c6f265c7491","IPY_MODEL_5b6eeea6741e479698a08769df9e718e","IPY_MODEL_023e40ef705e4cf8b7f171b39bc93407"],"layout":"IPY_MODEL_640ef878c8ea46cb9f737e5c0a53c3d5"}},"93a91428e3c047ea87ed1c6f265c7491":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2bd94cc559fb489cb5cd9eb28a2557b8","placeholder":"​","style":"IPY_MODEL_daccbbb82f5b4a219b5d4d814212793d","value":"Downloading (…)cial_tokens_map.json: 100%"}},"5b6eeea6741e479698a08769df9e718e":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_ce6982b1095d4349950562883f1e7662","max":65,"min":0,"orientation":"horizontal","style":"IPY_MODEL_96872e5518ef4b0d9d863013215670a9","value":65}},"023e40ef705e4cf8b7f171b39bc93407":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_f952b24be07144d1bcd0a5433dce9f4f","placeholder":"​","style":"IPY_MODEL_1cc7408c5b9c4fec85b64caaa83c2e5c","value":" 65.0/65.0 [00:00<00:00, 3.25kB/s]"}},"640ef878c8ea46cb9f737e5c0a53c3d5":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2bd94cc559fb489cb5cd9eb28a2557b8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"daccbbb82f5b4a219b5d4d814212793d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ce6982b1095d4349950562883f1e7662":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"96872e5518ef4b0d9d863013215670a9":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"f952b24be07144d1bcd0a5433dce9f4f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1cc7408c5b9c4fec85b64caaa83c2e5c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"nbformat":4,"nbformat_minor":0} \ No newline at end of file diff --git a/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2022.ipynb b/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2022.ipynb new file mode 100644 index 0000000..61022e6 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2022.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"mount_file_id":"1G1pAP_-Xq-uwMs_cEFKNXODlCHYkyZZS","authorship_tag":"ABX9TyMkaIOTciiVMBCY9dMveA/x"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"737d39fc70a3421db3ca264dc4c83bf8":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_07cf48f8e4614bb9995ea363803c3bea","IPY_MODEL_a1cc5505aa384bc5bd11df46f830413c","IPY_MODEL_d45a0e64719242d9b405d59e211055b1"],"layout":"IPY_MODEL_98e7e6ed108b44dbaeeec4cfb0ed18ad"}},"07cf48f8e4614bb9995ea363803c3bea":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_429657515ff541519fba79e3997d93e3","placeholder":"​","style":"IPY_MODEL_81ea2529106d42049f4c081c66cf2d57","value":"Downloading builder script: 100%"}},"a1cc5505aa384bc5bd11df46f830413c":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_8a75679716ea475aafd747c1a2ce249d","max":19906,"min":0,"orientation":"horizontal","style":"IPY_MODEL_234e9fa84394431e9b9ce1f3e23d414e","value":19906}},"d45a0e64719242d9b405d59e211055b1":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ad326e36de6044ceb0911b811acf0239","placeholder":"​","style":"IPY_MODEL_268ee27db805493e98e19fe16bf5e4e4","value":" 19.9k/19.9k [00:00<00:00, 590kB/s]"}},"98e7e6ed108b44dbaeeec4cfb0ed18ad":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"429657515ff541519fba79e3997d93e3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"81ea2529106d42049f4c081c66cf2d57":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8a75679716ea475aafd747c1a2ce249d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"234e9fa84394431e9b9ce1f3e23d414e":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"ad326e36de6044ceb0911b811acf0239":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"268ee27db805493e98e19fe16bf5e4e4":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"443bbb456ac84e78b445d5f8559ed784":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_fe66b0cd3f1c4846bc8f305c30977872","IPY_MODEL_b79f32c8d7464b7c963d898509e8d6b3","IPY_MODEL_e05f88346296461a9106ce9d56c2247b"],"layout":"IPY_MODEL_88824d9115e642b480ae3ec2092829e2"}},"fe66b0cd3f1c4846bc8f305c30977872":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_d045d390953249f9a251d0d7f3096ec8","placeholder":"​","style":"IPY_MODEL_3e9a47e12c9242e0b301859ce6fd6775","value":"Downloading readme: 100%"}},"b79f32c8d7464b7c963d898509e8d6b3":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_2aa92e15e3a24967881c2a2e1071b9c0","max":31334,"min":0,"orientation":"horizontal","style":"IPY_MODEL_7154e26486e94ff3a01ca088ebffd97c","value":31334}},"e05f88346296461a9106ce9d56c2247b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_97bc815ce40547168baff3e09d1927f0","placeholder":"​","style":"IPY_MODEL_b5b28fbfdca94f2380d45e4118a62247","value":" 31.3k/31.3k [00:00<00:00, 1.29MB/s]"}},"88824d9115e642b480ae3ec2092829e2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d045d390953249f9a251d0d7f3096ec8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3e9a47e12c9242e0b301859ce6fd6775":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2aa92e15e3a24967881c2a2e1071b9c0":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7154e26486e94ff3a01ca088ebffd97c":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"97bc815ce40547168baff3e09d1927f0":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b5b28fbfdca94f2380d45e4118a62247":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"a7a09501532e4550ba0abb6526f137c8":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_dc104931ddb3426cb91e1272b5b91940","IPY_MODEL_5b1ea8b3d5ec4395a77ad932efd9ab46","IPY_MODEL_6f2ad721ac4a425cb983ded79233f447"],"layout":"IPY_MODEL_ee04beda4b0642d2b2224d9d973ddc58"}},"dc104931ddb3426cb91e1272b5b91940":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_593dcee8614a4ac5b10831676442e1b6","placeholder":"​","style":"IPY_MODEL_4adf65e040cf434c98318ecdb4a62802","value":"Downloading (…)okenizer_config.json: 100%"}},"5b1ea8b3d5ec4395a77ad932efd9ab46":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_dd927a1a29ad4c6986776eb3071e9311","max":376,"min":0,"orientation":"horizontal","style":"IPY_MODEL_712d826c098941e59e97950ab7f94f26","value":376}},"6f2ad721ac4a425cb983ded79233f447":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9453f03f656440b6b198914accb37b40","placeholder":"​","style":"IPY_MODEL_49d5f89aab58451797750a0a3eea7216","value":" 376/376 [00:00<00:00, 18.9kB/s]"}},"ee04beda4b0642d2b2224d9d973ddc58":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"593dcee8614a4ac5b10831676442e1b6":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4adf65e040cf434c98318ecdb4a62802":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"dd927a1a29ad4c6986776eb3071e9311":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"712d826c098941e59e97950ab7f94f26":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"9453f03f656440b6b198914accb37b40":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"49d5f89aab58451797750a0a3eea7216":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8374d9bfe2cc4286b48e3f5d746c593a":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_885be7c854b44efca0366d339dea3ec7","IPY_MODEL_65b6becb7b1f41cfa846b481a5eccc0a","IPY_MODEL_83d3c09461e8488dbbd73abff8004b6b"],"layout":"IPY_MODEL_bceb570e601f43e2ac58707b3a9fe900"}},"885be7c854b44efca0366d339dea3ec7":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e587a2b01fb3408ba2c044b20d261652","placeholder":"​","style":"IPY_MODEL_152e728075e14124ae076ab14c313b5d","value":"Downloading (…)lve/main/config.json: 100%"}},"65b6becb7b1f41cfa846b481a5eccc0a":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_037c8520f67c4e74b21bd6a03bae9991","max":702,"min":0,"orientation":"horizontal","style":"IPY_MODEL_a2d6bcfb13ef45638e5dbd9c0d3d1af3","value":702}},"83d3c09461e8488dbbd73abff8004b6b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b7820d205781416ba23d77bbca9f28c3","placeholder":"​","style":"IPY_MODEL_61034b19c6c9472a81c06cff2875d39a","value":" 702/702 [00:00<00:00, 37.4kB/s]"}},"bceb570e601f43e2ac58707b3a9fe900":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e587a2b01fb3408ba2c044b20d261652":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"152e728075e14124ae076ab14c313b5d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"037c8520f67c4e74b21bd6a03bae9991":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a2d6bcfb13ef45638e5dbd9c0d3d1af3":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"b7820d205781416ba23d77bbca9f28c3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"61034b19c6c9472a81c06cff2875d39a":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"d054a6f3753a4ee2b742f0e404b08525":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_595ed19f391746158146d6e38d2784b8","IPY_MODEL_b2b55b435267480d935b0127723946c5","IPY_MODEL_56ceb4e26edc4fe3b829ec5107a99fb8"],"layout":"IPY_MODEL_060729bf73c94ac2be4bc8554f7ef477"}},"595ed19f391746158146d6e38d2784b8":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_67e2f0dd18864a55a4ad4daafe25c00d","placeholder":"​","style":"IPY_MODEL_489d770e7c2744ecaa86c888a845a56c","value":"Downloading (…)ve/main/spiece.model: 100%"}},"b2b55b435267480d935b0127723946c5":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_5dc8ebc134ab4e64ba4c7e35e1a7195e","max":4309802,"min":0,"orientation":"horizontal","style":"IPY_MODEL_af6f2bd9abe14cfb9b06a7015b0f62aa","value":4309802}},"56ceb4e26edc4fe3b829ec5107a99fb8":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_25799e1f5a864ff49e251ef94bc8f2a7","placeholder":"​","style":"IPY_MODEL_8034d47f3cb649e784a222441c96c5ef","value":" 4.31M/4.31M [00:00<00:00, 13.7MB/s]"}},"060729bf73c94ac2be4bc8554f7ef477":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"67e2f0dd18864a55a4ad4daafe25c00d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"489d770e7c2744ecaa86c888a845a56c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"5dc8ebc134ab4e64ba4c7e35e1a7195e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"af6f2bd9abe14cfb9b06a7015b0f62aa":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"25799e1f5a864ff49e251ef94bc8f2a7":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8034d47f3cb649e784a222441c96c5ef":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"da4f7a4acdb94b1b82894764917d3eb0":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_9991971eeb8e479399b2051558f1a03e","IPY_MODEL_8112bf4eedf3407dab92e9b25304e0f2","IPY_MODEL_2e59d5b939014e83ae77d90f2ac298e8"],"layout":"IPY_MODEL_b348607e7c104c17af7ccf59102ffd22"}},"9991971eeb8e479399b2051558f1a03e":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_52c7dbd263cf4108b29536ee5f136fdf","placeholder":"​","style":"IPY_MODEL_4fc8c5510f304e3cb3ceb9a18f3a1c2c","value":"Downloading (…)cial_tokens_map.json: 100%"}},"8112bf4eedf3407dab92e9b25304e0f2":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_279d8a6b97a44a8b824c959408ddf694","max":65,"min":0,"orientation":"horizontal","style":"IPY_MODEL_19ad5fe9ddfb42ab8f213c8e986c4a1b","value":65}},"2e59d5b939014e83ae77d90f2ac298e8":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_747f8e1dde1b4bbe8085cec5aaf2659d","placeholder":"​","style":"IPY_MODEL_a404e7343cd34f8f9fef9c6126ab1045","value":" 65.0/65.0 [00:00<00:00, 3.56kB/s]"}},"b348607e7c104c17af7ccf59102ffd22":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"52c7dbd263cf4108b29536ee5f136fdf":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4fc8c5510f304e3cb3ceb9a18f3a1c2c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"279d8a6b97a44a8b824c959408ddf694":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"19ad5fe9ddfb42ab8f213c8e986c4a1b":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"747f8e1dde1b4bbe8085cec5aaf2659d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a404e7343cd34f8f9fef9c6126ab1045":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"cells":[{"cell_type":"code","execution_count":1,"metadata":{"id":"Fs-SsXoIw2Kx","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1682709979893,"user_tz":-420,"elapsed":87107,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"e1ded1df-0e5f-46fc-e605-d907e19610d9"},"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting datasets\n"," Downloading datasets-2.12.0-py3-none-any.whl (474 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m474.6/474.6 kB\u001b[0m \u001b[31m7.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets) (1.5.3)\n","Requirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (2.27.1)\n","Collecting aiohttp\n"," Downloading aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m25.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from datasets) (23.1)\n","Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (1.22.4)\n","Collecting multiprocess\n"," Downloading multiprocess-0.70.14-py310-none-any.whl (134 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.3/134.3 kB\u001b[0m \u001b[31m12.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: fsspec[http]>=2021.11.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (2023.4.0)\n","Requirement already satisfied: pyarrow>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (9.0.0)\n","Collecting huggingface-hub<1.0.0,>=0.11.0\n"," Downloading huggingface_hub-0.14.1-py3-none-any.whl (224 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.5/224.5 kB\u001b[0m \u001b[31m9.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: tqdm>=4.62.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (4.65.0)\n","Collecting xxhash\n"," Downloading xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m212.5/212.5 kB\u001b[0m \u001b[31m9.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting dill<0.3.7,>=0.3.0\n"," Downloading dill-0.3.6-py3-none-any.whl (110 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.5/110.5 kB\u001b[0m \u001b[31m9.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (6.0)\n","Collecting responses<0.19\n"," Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n","Requirement already satisfied: charset-normalizer<4.0,>=2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (2.0.12)\n","Collecting frozenlist>=1.1.1\n"," Downloading frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (149 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m149.6/149.6 kB\u001b[0m \u001b[31m15.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting multidict<7.0,>=4.5\n"," Downloading multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.5/114.5 kB\u001b[0m \u001b[31m14.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (23.1.0)\n","Collecting aiosignal>=1.1.2\n"," Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n","Collecting async-timeout<5.0,>=4.0.0a3\n"," Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n","Collecting yarl<2.0,>=1.0\n"," Downloading yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (268 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m268.8/268.8 kB\u001b[0m \u001b[31m10.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (4.5.0)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (3.12.0)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (1.26.15)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (3.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (2022.12.7)\n","Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2.8.2)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2022.7.1)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas->datasets) (1.16.0)\n","Installing collected packages: xxhash, multidict, frozenlist, dill, async-timeout, yarl, responses, multiprocess, huggingface-hub, aiosignal, aiohttp, datasets\n","Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 datasets-2.12.0 dill-0.3.6 frozenlist-1.3.3 huggingface-hub-0.14.1 multidict-6.0.4 multiprocess-0.70.14 responses-0.18.0 xxhash-3.2.0 yarl-1.9.2\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting transformers\n"," Downloading transformers-4.28.1-py3-none-any.whl (7.0 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.0/7.0 MB\u001b[0m \u001b[31m42.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.22.4)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n","Requirement already satisfied: huggingface-hub<1.0,>=0.11.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.14.1)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n","Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n","Collecting tokenizers!=0.11.3,<0.14,>=0.11.1\n"," Downloading tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.8/7.8 MB\u001b[0m \u001b[31m66.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n","Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (2023.4.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)\n","Installing collected packages: tokenizers, transformers\n","Successfully installed tokenizers-0.13.3 transformers-4.28.1\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (4.3.1)\n","Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim) (6.3.0)\n","Requirement already satisfied: numpy>=1.18.5 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.22.4)\n","Requirement already satisfied: scipy>=1.7.0 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.10.1)\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting pythainlp\n"," Downloading pythainlp-4.0.0-py3-none-any.whl (13.4 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.4/13.4 MB\u001b[0m \u001b[31m73.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: requests>=2.22.0 in /usr/local/lib/python3.10/dist-packages (from pythainlp) (2.27.1)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (3.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2022.12.7)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (1.26.15)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2.0.12)\n","Installing collected packages: pythainlp\n","Successfully installed pythainlp-4.0.0\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting pyLDAvis\n"," Downloading pyLDAvis-3.4.1-py3-none-any.whl (2.6 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m27.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (67.7.2)\n","Collecting pandas>=2.0.0\n"," Downloading pandas-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m28.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (4.3.1)\n","Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (3.1.2)\n","Requirement already satisfied: numexpr in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (2.8.4)\n","Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.10.1)\n","Collecting numpy>=1.24.2\n"," Downloading numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m17.3/17.3 MB\u001b[0m \u001b[31m44.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting funcy\n"," Downloading funcy-2.0-py2.py3-none-any.whl (30 kB)\n","Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.2.0)\n","Requirement already satisfied: scikit-learn>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.2.2)\n","Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2.8.2)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2022.7.1)\n","Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2023.3)\n","Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0.0->pyLDAvis) (3.1.0)\n","Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim->pyLDAvis) (6.3.0)\n","Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->pyLDAvis) (2.1.2)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas>=2.0.0->pyLDAvis) (1.16.0)\n","Installing collected packages: funcy, numpy, pandas, pyLDAvis\n"," Attempting uninstall: numpy\n"," Found existing installation: numpy 1.22.4\n"," Uninstalling numpy-1.22.4:\n"," Successfully uninstalled numpy-1.22.4\n"," Attempting uninstall: pandas\n"," Found existing installation: pandas 1.5.3\n"," Uninstalling pandas-1.5.3:\n"," Successfully uninstalled pandas-1.5.3\n","\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n","tensorflow 2.12.0 requires numpy<1.24,>=1.22, but you have numpy 1.24.3 which is incompatible.\n","numba 0.56.4 requires numpy<1.24,>=1.18, but you have numpy 1.24.3 which is incompatible.\n","google-colab 1.0.0 requires pandas~=1.5.3, but you have pandas 2.0.1 which is incompatible.\u001b[0m\u001b[31m\n","\u001b[0mSuccessfully installed funcy-2.0 numpy-1.24.3 pandas-2.0.1 pyLDAvis-3.4.1\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting sentencepiece\n"," Downloading sentencepiece-0.1.98-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m19.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: sentencepiece\n","Successfully installed sentencepiece-0.1.98\n"]}],"source":["!pip install datasets\n","!pip install transformers\n","!pip install gensim\n","!pip install pythainlp\n","!pip install pyLDAvis\n","!pip install sentencepiece"]},{"cell_type":"code","source":["!huggingface-cli login\n","# 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"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7YkUkFRK_qq2","executionInfo":{"status":"ok","timestamp":1682709990560,"user_tz":-420,"elapsed":10673,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"2e2af949-83a8-43c5-842b-142130eb89b4"},"execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["\n"," _| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|\n"," _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n"," _|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|\n"," _| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n"," _| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|\n"," \n"," To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .\n","Token: \n","Add token as git credential? (Y/n) n\n","Token is valid.\n","Your token has been saved to /root/.cache/huggingface/token\n","Login successful\n"]}]},{"cell_type":"code","source":["from datasets import load_dataset \n","\n","dataset= load_dataset(\"oscar-corpus/OSCAR-2201\",use_auth_token=True,language=\"th\",split='train',streaming=True)"],"metadata":{"id":"M5E5aa3UxbXR","executionInfo":{"status":"ok","timestamp":1682710000408,"user_tz":-420,"elapsed":9850,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/","height":81,"referenced_widgets":["737d39fc70a3421db3ca264dc4c83bf8","07cf48f8e4614bb9995ea363803c3bea","a1cc5505aa384bc5bd11df46f830413c","d45a0e64719242d9b405d59e211055b1","98e7e6ed108b44dbaeeec4cfb0ed18ad","429657515ff541519fba79e3997d93e3","81ea2529106d42049f4c081c66cf2d57","8a75679716ea475aafd747c1a2ce249d","234e9fa84394431e9b9ce1f3e23d414e","ad326e36de6044ceb0911b811acf0239","268ee27db805493e98e19fe16bf5e4e4","443bbb456ac84e78b445d5f8559ed784","fe66b0cd3f1c4846bc8f305c30977872","b79f32c8d7464b7c963d898509e8d6b3","e05f88346296461a9106ce9d56c2247b","88824d9115e642b480ae3ec2092829e2","d045d390953249f9a251d0d7f3096ec8","3e9a47e12c9242e0b301859ce6fd6775","2aa92e15e3a24967881c2a2e1071b9c0","7154e26486e94ff3a01ca088ebffd97c","97bc815ce40547168baff3e09d1927f0","b5b28fbfdca94f2380d45e4118a62247"]},"outputId":"86b983e7-6a45-4b70-d4bc-06d1a30aa444"},"execution_count":3,"outputs":[{"output_type":"display_data","data":{"text/plain":["Downloading builder script: 0%| | 0.00/19.9k [00:0050000:\n"," break\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"duafs9DpuDhi","executionInfo":{"status":"ok","timestamp":1682710086657,"user_tz":-420,"elapsed":86254,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"cbee13ea-f339-4202-8afc-80fbc85cf009"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stderr","text":["50000it [01:26, 580.75it/s]\n"]}]},{"cell_type":"code","source":["import pandas as pd \n","df = pd.DataFrame(oscar22)"],"metadata":{"id":"OX2k-fb2xC80","executionInfo":{"status":"ok","timestamp":1682710086657,"user_tz":-420,"elapsed":5,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}}},"execution_count":5,"outputs":[]},{"cell_type":"code","source":["!pip install transformers \n","from transformers import AutoTokenizer\n","\n","t5_tokenizer = AutoTokenizer.from_pretrained(\"google/mt5-base\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":495,"referenced_widgets":["a7a09501532e4550ba0abb6526f137c8","dc104931ddb3426cb91e1272b5b91940","5b1ea8b3d5ec4395a77ad932efd9ab46","6f2ad721ac4a425cb983ded79233f447","ee04beda4b0642d2b2224d9d973ddc58","593dcee8614a4ac5b10831676442e1b6","4adf65e040cf434c98318ecdb4a62802","dd927a1a29ad4c6986776eb3071e9311","712d826c098941e59e97950ab7f94f26","9453f03f656440b6b198914accb37b40","49d5f89aab58451797750a0a3eea7216","8374d9bfe2cc4286b48e3f5d746c593a","885be7c854b44efca0366d339dea3ec7","65b6becb7b1f41cfa846b481a5eccc0a","83d3c09461e8488dbbd73abff8004b6b","bceb570e601f43e2ac58707b3a9fe900","e587a2b01fb3408ba2c044b20d261652","152e728075e14124ae076ab14c313b5d","037c8520f67c4e74b21bd6a03bae9991","a2d6bcfb13ef45638e5dbd9c0d3d1af3","b7820d205781416ba23d77bbca9f28c3","61034b19c6c9472a81c06cff2875d39a","d054a6f3753a4ee2b742f0e404b08525","595ed19f391746158146d6e38d2784b8","b2b55b435267480d935b0127723946c5","56ceb4e26edc4fe3b829ec5107a99fb8","060729bf73c94ac2be4bc8554f7ef477","67e2f0dd18864a55a4ad4daafe25c00d","489d770e7c2744ecaa86c888a845a56c","5dc8ebc134ab4e64ba4c7e35e1a7195e","af6f2bd9abe14cfb9b06a7015b0f62aa","25799e1f5a864ff49e251ef94bc8f2a7","8034d47f3cb649e784a222441c96c5ef","da4f7a4acdb94b1b82894764917d3eb0","9991971eeb8e479399b2051558f1a03e","8112bf4eedf3407dab92e9b25304e0f2","2e59d5b939014e83ae77d90f2ac298e8","b348607e7c104c17af7ccf59102ffd22","52c7dbd263cf4108b29536ee5f136fdf","4fc8c5510f304e3cb3ceb9a18f3a1c2c","279d8a6b97a44a8b824c959408ddf694","19ad5fe9ddfb42ab8f213c8e986c4a1b","747f8e1dde1b4bbe8085cec5aaf2659d","a404e7343cd34f8f9fef9c6126ab1045"]},"id":"xXUl_ZMXVgfb","executionInfo":{"status":"ok","timestamp":1682710095564,"user_tz":-420,"elapsed":8910,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"134b3aae-abac-4b00-a694-d161b192885b"},"execution_count":6,"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: transformers in /usr/local/lib/python3.10/dist-packages (4.28.1)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n","Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n","Requirement already satisfied: huggingface-hub<1.0,>=0.11.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.14.1)\n","Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n","Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.24.3)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n","Requirement already satisfied: tokenizers!=0.11.3,<0.14,>=0.11.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.13.3)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n","Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (2023.4.0)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n"]},{"output_type":"display_data","data":{"text/plain":["Downloading (…)okenizer_config.json: 0%| | 0.00/376 [00:00 0.015:\n"," return \"\"\n","\n"," if len(re.findall(\"|\".join(special_to_count),text))/n > 0.075:\n"," return \"\"\n","\n"," if len(re.findall(\" \",text))/n > 0.13:\n"," return \"\"\n","\n"," if len(re.findall(\",\",text))/n > 0.05:\n"," return \"\"\n","\n","def remove_bad_substring(text):\n"," to_replace_keywords = [\"Posted on\",\"Posted by\",\"Posted by:\",\"Posted By:\",\"สมาชิกหมายเลข [0-9,]+\",\"อ่าน [0-9,]+ ครั้ง\",\"เปิดดู [0-9,]+ ครั้ง\",\"ดู [0-9,]+ ครั้ง\",\"คะแนนสะสม: [0-9,]+ แต้ม\",\"ความคิดเห็น: [0-9,]+\",\n"," \"[0-9,]+ บุคคลทั่วไป กำลังดูบอร์ดนี้\",\"หน้าที่แล้ว ต่อไป\",\"ความคิดเห็นที่ [0-9,]+\",\"[0-9,]+ สมาชิก และ [0-9,]+ บุคคลทั่วไป\",\"กำลังดูหัวข้อนี้\",\"เข้าสู่ระบบด้วยชื่อผู้ใช้\",\n"," \"แสดงกระทู้จาก:\",\"กระทู้: [0-9,]+\",\"เว็บไซต์เรามีการใช้คุกกี้และเก็บข้อมูลผู้ใช้งาน โปรดศึกษาและยอมรับ นโยบายคุ้มครองข้อมูลส่วนบุคคล ก่อนใช้งาน\",\n"," \"Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use\\.\",\n"," \"Previous\\t\\nNext\\nLeave a Reply Cancel reply\\nYou must be logged in to post a comment.\\nSearch for:\\nFeatured Post\\n\",\n"," \"Click to read more\\nYou must be logged in to view or write comments\\.\",\"[0-9,]+ Views\",\"Skip to content\",\"Last Modified Posts\",\"Last Updated:\",\n"," \"\\(อ่าน [0-9,]+ ครั้ง\\)\",\"Recent Comments\",\"«.*?»\",\"< --แสดงทั้งหมด-- >\",\"นโยบายความเป็นส่วนตัว\",\"เงื่อนไขการใช้เว็บไซต์\",\"ตั้งค่าคุกกี้\",\"ท่านยอมรับให้เว็บไซต์นี้จัดเก็บคุกกี้เพื่อประสบการณ์การใช้งานเว็บไซต์ที่ดียิ่งขึ้น\",\n"," \"รวมถึงช่วยให้ท่านมีโอกาสได้รับข้อเสนอหรือเนื้อหาที่ตรงตามความสนใจของท่าน\",\"ท่านสามารถดู Privacy Notice ของเว็บไซต์เรา ได้ที่นี่\",\"You may be trying to access this site from a secured browser on the server. Please enable scripts and reload this page.\",\n"," \"เผยแพร่: \\d\\d [ก-๙]+ \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Last updated: \\d\\d [ก-๙]+\\.[ก-๙]+\\. \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\.\",\n"," \"Search for:\",\"Save my name, email, and website in this browser for the next time I comment\",\"Your email address will not be published. Required fields are marked\",\n"," \"Leave a Reply Cancel reply\",\"((?:หน้าหลัก|เข้าสู่ระบบ|หน้าแรก) \\|(?: .+(?:(?: \\|)|$))+)\",\"กลับหน้าแรก\",\"ติดต่อเรา\",\"Contact Us\",\"#\\w+\",\"ติดต่อผู้ดูแลเว็บไซต์\",\n"," \"หากท่านพบว่ามีข้อมูลใดๆที่ละเมิดทรัพย์สินทางปัญญาปรากฏอยู่ในเว็บไซต์โปรดแจ้งให้ทราบ\",\"No related posts\",\"Posted in\",\"((?:Tags:|Tagged|Tag) (?:.{1,40}(?:,|\\n|$))+)\",\"ตอบ:\",\"Sort by:\",\n"," \"All rights reserved\",\"ความยาวอย่างน้อย\",\"ระบบได้ดำเนินการส่ง OTP\",\"เป็นสมาชิกอยู่แล้ว\\?\",\"We use cookies\",\"Cookie Settings\",\n"," \"Homeหน้าหลัก\", \"Home หน้าหลัก\", \"ข่าวสารล่าสุด\", \"ปัญหา การใช้งาน\", \"ปัญหาการใช้งาน\" \"ผู้เขียน\" ,\"หัวข้อ:\" ,\"\\*\\* พร้อมส่ง \\*\\*\"]\n"," \n"," return re.sub(\"|\".join(to_replace_keywords),\"\",text)\n","\n","def clean_text(text):\n","\n"," n=len(text)\n"," \n"," if check_containing_bad_keywords(text) or check_ratio_bad_substring(text,n) or countthai(text)<50:\n"," # if check_containing_bad_keywords(text) or countthai(text)<0.5:\n"," return \"\"\n"," \n"," text= remove_bad_substring(text)\n","\n"," # not sure if we should normalize\n"," #text = normalize(text)\n","\n"," return text\n"],"metadata":{"id":"4w_qgPToxVla","executionInfo":{"status":"ok","timestamp":1682710103988,"user_tz":-420,"elapsed":8428,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}}},"execution_count":7,"outputs":[]},{"cell_type":"code","source":["tqdm.pandas()\n","df[\"clean_text\"] = df[\"text\"].progress_apply(clean_text)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"EW42irQ4q3Y-","executionInfo":{"status":"ok","timestamp":1682710292067,"user_tz":-420,"elapsed":188108,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"fcba2d85-e783-4897-f950-87947a898f56"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 50001/50001 [03:08<00:00, 265.46it/s]\n"]}]},{"cell_type":"code","source":["def len_tokenized(text):\n"," return len(t5_tokenizer(text)[\"input_ids\"])"],"metadata":{"id":"mz1_2G69ZU_c","executionInfo":{"status":"ok","timestamp":1682710292067,"user_tz":-420,"elapsed":3,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}}},"execution_count":9,"outputs":[]},{"cell_type":"code","source":["from tqdm import tqdm \n","tqdm.pandas()\n","df[\"len_t5\"]=df[\"text\"].progress_apply(len_tokenized)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ZemCgf42Zmp1","executionInfo":{"status":"ok","timestamp":1682711478468,"user_tz":-420,"elapsed":1186403,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"954673fc-6ff3-4d0e-f846-26038b4e12b5"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 50001/50001 [19:46<00:00, 42.16it/s] \n"]}]},{"cell_type":"code","source":["new_df = df[df[\"clean_text\"]!=\"\"].drop_duplicates(subset=\"clean_text\")\n","new_df[\"len_t5\"]=new_df[\"clean_text\"].progress_apply(len_tokenized)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"zHkiStxPTtYN","executionInfo":{"status":"ok","timestamp":1682712063379,"user_tz":-420,"elapsed":584918,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"219469f4-df9c-4f7e-8197-fed6f9d8a67b"},"execution_count":11,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 28113/28113 [09:44<00:00, 48.09it/s]\n"]}]},{"cell_type":"code","source":["df[\"len_t5\"].sum(),new_df[\"len_t5\"].sum(),(df[\"len_t5\"].sum()-new_df[\"len_t5\"].sum())/df[\"len_t5\"].sum()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tUuJul3IjnXO","executionInfo":{"status":"ok","timestamp":1682712063379,"user_tz":-420,"elapsed":7,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"5a146868-ec8d-4765-b262-95cd67787be5"},"execution_count":12,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(67183909, 36701967, 0.45370896772320884)"]},"metadata":{},"execution_count":12}]},{"cell_type":"code","source":["29283/50000"],"metadata":{"id":"AZsgqp7_T11b","executionInfo":{"status":"ok","timestamp":1682541872732,"user_tz":-420,"elapsed":2,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"7fb77549-778c-4bcc-dd85-88138f0d304b","colab":{"base_uri":"https://localhost:8080/"}},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.58566"]},"metadata":{},"execution_count":99}]},{"cell_type":"code","source":["new_df"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":467},"id":"il2euLuuTQup","executionInfo":{"status":"ok","timestamp":1682541813068,"user_tz":-420,"elapsed":915,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"1218f15f-7a15-4ba4-e622-509f3afff7f4"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id text \n","0 0 ในโรงงานอุตสาหกรรมทุกแห่งมักจะมีเจ้าหน้าที่หรื... \\\n","1 1 ถ้าให้เลือกระหว่างเกมสองเกม Joker123 กับ Rov ค... \n","2 2 สื่อทีวีและวิทยุที่ไร้ธรรมาภิบาลมีวิธีเอาเปรีย... \n","6 6 สะดุดรัก ท่านหญิงหนีโลก ตอน รักแรกชั่วนิรันดร!... \n","8 8 เงินเยียวยาประกันสังคมมาตรา 33, 39 และ 40 รอบเ... \n","... ... ... \n","49996 49996 อุปกรณ์สำหรับรักษาความปลอดภัย (รปภ.)- ถุงมือไน... \n","49997 49997 ถุงมือยางสีส้ม ยี่ห้อ ตุ๊กตา- ถุงมือยางสีส้ม r... \n","49998 49998 ตามธรรมเนียมไทย เมื่อนักกีฬาทีมชาติไทยได้สร้าง... \n","49999 49999 Seoul Travel, South Korea Travel / Cheonggyech... \n","50000 50000 Published May 6, 2020 at 1771 × 1174 in ความหน... \n","\n"," meta \n","0 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmetaclean_textpred
00ในโรงงานอุตสาหกรรมทุกแห่งมักจะมีเจ้าหน้าที่หรื...{'warc_headers': {'warc-record-id': '<urn:uuid...ในโรงงานอุตสาหกรรมทุกแห่งมักจะมีเจ้าหน้าที่หรื...[False]
11ถ้าให้เลือกระหว่างเกมสองเกม Joker123 กับ Rov ค...{'warc_headers': {'warc-record-id': '<urn:uuid...ถ้าให้เลือกระหว่างเกมสองเกม Joker123 กับ Rov ค...[False]
22สื่อทีวีและวิทยุที่ไร้ธรรมาภิบาลมีวิธีเอาเปรีย...{'warc_headers': {'warc-record-id': '<urn:uuid...สื่อทีวีและวิทยุที่ไร้ธรรมาภิบาลมีวิธีเอาเปรีย...[False]
66สะดุดรัก ท่านหญิงหนีโลก ตอน รักแรกชั่วนิรันดร!...{'warc_headers': {'warc-record-id': '<urn:uuid...สะดุดรัก ท่านหญิงหนีโลก ตอน รักแรกชั่วนิรันดร!...[False]
88เงินเยียวยาประกันสังคมมาตรา 33, 39 และ 40 รอบเ...{'warc_headers': {'warc-record-id': '<urn:uuid...เงินเยียวยาประกันสังคมมาตรา 33, 39 และ 40 รอบเ...[False]
..................
4999649996อุปกรณ์สำหรับรักษาความปลอดภัย (รปภ.)- ถุงมือไน...{'warc_headers': {'warc-record-id': '<urn:uuid...อุปกรณ์สำหรับรักษาความปลอดภัย (รปภ.)- ถุงมือไน...[False]
4999749997ถุงมือยางสีส้ม ยี่ห้อ ตุ๊กตา- ถุงมือยางสีส้ม r...{'warc_headers': {'warc-record-id': '<urn:uuid...ถุงมือยางสีส้ม ยี่ห้อ ตุ๊กตา- ถุงมือยางสีส้ม r...[False]
4999849998ตามธรรมเนียมไทย เมื่อนักกีฬาทีมชาติไทยได้สร้าง...{'warc_headers': {'warc-record-id': '<urn:uuid...ตามธรรมเนียมไทย เมื่อนักกีฬาทีมชาติไทยได้สร้าง...[False]
4999949999Seoul Travel, South Korea Travel / Cheonggyech...{'warc_headers': {'warc-record-id': '<urn:uuid...Seoul Travel, South Korea Travel / Cheonggyech...[False]
5000050000Published May 6, 2020 at 1771 × 1174 in ความหน...{'warc_headers': {'warc-record-id': '<urn:uuid...Published May 6, 2020 at 1771 × 1174 in ความหน...[False]
\n","

34668 rows × 5 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":97}]},{"cell_type":"code","source":["cls_df = df[[\"text\",\"clean_text\"]]\n","cls_df[\"labels\"] = cls_df[\"clean_text\"]==\"\"\n","cls_df = pd.concat([cls_df[cls_df[\"labels\"]==False].sample(5000,random_state=0),\n"," cls_df[cls_df[\"labels\"]==True].sample(5000,random_state=0)])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Yd3Cmds44_c1","executionInfo":{"status":"ok","timestamp":1682539723193,"user_tz":-420,"elapsed":16,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"06823f4a-daa7-4e37-8203-5e864e4634da"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":[":2: SettingWithCopyWarning: \n","A value is trying to be set on a copy of a slice from a DataFrame.\n","Try using .loc[row_indexer,col_indexer] = value instead\n","\n","See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n"," cls_df[\"labels\"] = cls_df[\"clean_text\"]==\"\"\n"]}]},{"cell_type":"code","source":["cls_df[\"labels\"].value_counts()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"59VjgYem5OiS","executionInfo":{"status":"ok","timestamp":1682537667863,"user_tz":-420,"elapsed":379,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"327fbe57-8749-437c-a279-64afb2cefd3a"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["labels\n","False 5000\n","True 5000\n","Name: count, dtype: int64"]},"metadata":{},"execution_count":10}]},{"cell_type":"code","source":["from pythainlp.tokenize import word_tokenize\n","cls_df[\"tokenized_text\"] = cls_df[\"clean_text\"].progress_apply(lambda x: \" \".join(word_tokenize(x)))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"sVK15VJb6CqU","executionInfo":{"status":"ok","timestamp":1682539816021,"user_tz":-420,"elapsed":92840,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"21fd0258-fd26-4fef-86bb-2721bfab0207"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 10000/10000 [01:32<00:00, 107.60it/s]\n"]}]},{"cell_type":"code","source":["from sklearn.model_selection import train_test_split\n","\n","X_train, X_test, y_train, y_test = train_test_split(cls_df[\"tokenized_text\"].tolist(), cls_df[\"labels\"].tolist(), stratify = cls_df[\"labels\"].tolist(),test_size=0.2, random_state=42)\n","\n","from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\n","vectorizer = CountVectorizer()\n","vectorizer.fit(X_train)\n","\n","train_features = vectorizer.transform(X_train).toarray()\n","test_features = vectorizer.transform(X_test).toarray()\n","\n","from sklearn.linear_model import LogisticRegression\n","\n","lr= LogisticRegression()\n","\n","lr.fit(train_features,y_train)\n","\n","prediction = lr.predict(test_features)\n","\n","sum(prediction==y_test)/len(prediction)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"XLcdMFVI4nIA","executionInfo":{"status":"ok","timestamp":1682539849088,"user_tz":-420,"elapsed":33075,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"d9e1aef3-a63f-4e2c-dd6b-777bf0490269"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.9935"]},"metadata":{},"execution_count":56}]},{"cell_type":"code","source":["df"],"metadata":{"id":"dNjtoV8oE2g-"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def predict(row):\n"," if row[\"clean_text\"]==\"\":\n"," return True\n"," tokenized_text = \" \".join(word_tokenize(row[\"text\"]))\n"," feat = vectorizer.transform([tokenized_text]).toarray()\n"," ans = lr.predict(feat)\n"," return ans"],"metadata":{"id":"TiVxcih-Esx5"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[\"pred\"]= df.progress_apply(predict,axis=1)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"rSHIGwXIFLTi","executionInfo":{"status":"ok","timestamp":1682540848486,"user_tz":-420,"elapsed":999409,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"6973bede-dbe4-4428-e6c0-6d12c45f3fcb"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 50001/50001 [16:39<00:00, 50.04it/s] \n"]}]},{"cell_type":"code","source":["df[\"pred\"] = df[\"pred\"].apply(lambda x: x[0] if type(x)==list else x)"],"metadata":{"id":"S_-zM58iEnzF"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[\"text\"][16047]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":35},"id":"RVuzYpF2J0hb","executionInfo":{"status":"ok","timestamp":1682541515907,"user_tz":-420,"elapsed":444,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"a69481e5-062f-4ca3-8713-4d64a6dddef0"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'บอร์ดนอกสถานที่บานเดี่ยว บอร์ดติดประกาศนอกสถานที่ | บอร์ดติดประกาศ บอร์ดติดประกาศตู้กระจก บอร์ดประชาสัมพันธ์'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":91}]},{"cell_type":"code","source":["df[(df[\"pred\"]==True) & (df[\"clean_text\"]!=\"\")].sample(20)"],"metadata":{"id":"EjsICVWGJquV"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":[],"metadata":{"id":"XpBx8k-q4PIz"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["new_df"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":991},"id":"5w3loKEm4XPY","executionInfo":{"status":"ok","timestamp":1682534660496,"user_tz":-420,"elapsed":3,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"bb76288b-91f5-4121-c515-6772aa205ae8"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id text \n","0 0 ในโรงงานอุตสาหกรรมทุกแห่งมักจะมีเจ้าหน้าที่หรื... \\\n","1 1 ถ้าให้เลือกระหว่างเกมสองเกม Joker123 กับ Rov ค... \n","2 2 สื่อทีวีและวิทยุที่ไร้ธรรมาภิบาลมีวิธีเอาเปรีย... \n","6 6 สะดุดรัก ท่านหญิงหนีโลก ตอน รักแรกชั่วนิรันดร!... \n","8 8 เงินเยียวยาประกันสังคมมาตรา 33, 39 และ 40 รอบเ... \n","... ... ... \n","49996 49996 อุปกรณ์สำหรับรักษาความปลอดภัย (รปภ.)- ถุงมือไน... \n","49997 49997 ถุงมือยางสีส้ม ยี่ห้อ ตุ๊กตา- ถุงมือยางสีส้ม r... \n","49998 49998 ตามธรรมเนียมไทย เมื่อนักกีฬาทีมชาติไทยได้สร้าง... \n","49999 49999 Seoul Travel, South Korea Travel / Cheonggyech... \n","50000 50000 Published May 6, 2020 at 1771 × 1174 in ความหน... \n","\n"," meta month_count \n","0 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmetamonth_countspecial_countcommar_countlen_textmonth_ratiospecial_ratiocommar_ratiospace_countspace_ratioclean_text
00ในโรงงานอุตสาหกรรมทุกแห่งมักจะมีเจ้าหน้าที่หรื...{'warc_headers': {'warc-record-id': '<urn:uuid...04060430.0000000.0006620.0000002030.033593ในโรงงานอุตสาหกรรมทุกแห่งมักจะมีเจ้าหน้าที่หรื...
11ถ้าให้เลือกระหว่างเกมสองเกม Joker123 กับ Rov ค...{'warc_headers': {'warc-record-id': '<urn:uuid...00013750.0000000.0000000.000000510.037091ถ้าให้เลือกระหว่างเกมสองเกม Joker123 กับ Rov ค...
22สื่อทีวีและวิทยุที่ไร้ธรรมาภิบาลมีวิธีเอาเปรีย...{'warc_headers': {'warc-record-id': '<urn:uuid...20458550.0003420.0000000.0006832070.035354สื่อทีวีและวิทยุที่ไร้ธรรมาภิบาลมีวิธีเอาเปรีย...
66สะดุดรัก ท่านหญิงหนีโลก ตอน รักแรกชั่วนิรันดร!...{'warc_headers': {'warc-record-id': '<urn:uuid...0002180.0000000.0000000.000000120.055046สะดุดรัก ท่านหญิงหนีโลก ตอน รักแรกชั่วนิรันดร!...
88เงินเยียวยาประกันสังคมมาตรา 33, 39 และ 40 รอบเ...{'warc_headers': {'warc-record-id': '<urn:uuid...58423450.0021320.0034120.0017061530.065245เงินเยียวยาประกันสังคมมาตรา 33, 39 และ 40 รอบเ...
..........................................
4999649996อุปกรณ์สำหรับรักษาความปลอดภัย (รปภ.)- ถุงมือไน...{'warc_headers': {'warc-record-id': '<urn:uuid...0232357610.0000000.0039920.0039924440.077070อุปกรณ์สำหรับรักษาความปลอดภัย (รปภ.)- ถุงมือไน...
4999749997ถุงมือยางสีส้ม ยี่ห้อ ตุ๊กตา- ถุงมือยางสีส้ม r...{'warc_headers': {'warc-record-id': '<urn:uuid...0162249940.0000000.0032040.0044053780.075691ถุงมือยางสีส้ม ยี่ห้อ ตุ๊กตา- ถุงมือยางสีส้ม r...
4999849998ตามธรรมเนียมไทย เมื่อนักกีฬาทีมชาติไทยได้สร้าง...{'warc_headers': {'warc-record-id': '<urn:uuid...410106280.0003760.0000940.0000004390.041306ตามธรรมเนียมไทย เมื่อนักกีฬาทีมชาติไทยได้สร้าง...
4999949999Seoul Travel, South Korea Travel / Cheonggyech...{'warc_headers': {'warc-record-id': '<urn:uuid...5174057220.0008740.0029710.0069915750.100489Seoul Travel, South Korea Travel / Cheonggyech...
5000050000Published May 6, 2020 at 1771 × 1174 in ความหน...{'warc_headers': {'warc-record-id': '<urn:uuid...0013710.0000000.0000000.002695210.056604Published May 6, 2020 at 1771 × 1174 in ความหน...
\n","

34812 rows × 13 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":236}]},{"cell_type":"code","source":["to_count = [\"มกราคม\",\"กุมภาพันธ์\",\"มีนาคม\",\"เมษายน\",\"พฤษภาคม\",\"มิถุนายน\",\"กรกฎาคม\",\"สิงหาคม\",\"กันยายน\",\"ตุลาคม\",\"พฤศจิกายน\",\"ธันวาคม\",\n"," \"ม\\.ค\\.\",\"ก\\.พ\\.\",\"มี\\.ค\\.\",\"เม\\.ย\\.\",\"พ\\.ค\\.\",\"มิ\\.ย\\.\",\"ก\\.ค\\.\",\"ส\\.ค\\.\",\"ก\\.ย\\.\",\"ต\\.ค\\.\",\"พ\\.ย\\.\",\"ธ\\.ค\\.\"]\n","\n","df[\"month_count\"]=df[\"text\"].apply(lambda x : len(re.findall(\"|\".join(to_count),x)))\n","to_count = [\"\\{\",\"\\+\",\"\\}\",\"/\",\":\"]\n","df[\"special_count\"]=df[\"text\"].apply(lambda x : len(re.findall(\"|\".join(to_count),x)))\n","to_count = [\",\"]\n","df[\"commar_count\"]=df[\"text\"].apply(lambda x : len(re.findall(\"|\".join(to_count),x)))\n"," #[\"{\",\"+\",\"}\",\"/\",\":\"]"],"metadata":{"id":"XkxWWze-phyR"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[\"text\"][8518]"],"metadata":{"id":"ftP4dvbDr027"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[\"len_text\"] = df[\"text\"].apply(len)"],"metadata":{"id":"JWFBrI_Us3g2"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[\"space_count\"]=df[\"text\"].apply(lambda x : len(re.findall(\" \",x)))\n","df[\"space_ratio\"] = df[\"space_count\"]/df[\"len_text\"]"],"metadata":{"id":"uPHqLczrwdAM"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[\"month_ratio\"] = df[\"month_count\"]/df[\"len_text\"]\n","df[\"special_ratio\"] = df[\"special_count\"]/df[\"len_text\"]\n","df[\"commar_ratio\"] = df[\"commar_count\"]/df[\"len_text\"]"],"metadata":{"id":"8TKnBzdms7jN"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[\"commar_ratio\"].describe()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"YVdVgVN1tIgK","executionInfo":{"status":"ok","timestamp":1682533258013,"user_tz":-420,"elapsed":7,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"30108b4f-e51b-45d3-bcb3-05eea06947cf"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["count 50001.000000\n","mean 0.002256\n","std 0.006109\n","min 0.000000\n","25% 0.000000\n","50% 0.000265\n","75% 0.001988\n","max 0.102819\n","Name: commar_ratio, dtype: float64"]},"metadata":{},"execution_count":229}]},{"cell_type":"code","source":["df[df[\"commar_ratio\"]>0.05].sample(20)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"cKLsPkPAva0Q","executionInfo":{"status":"ok","timestamp":1682533237816,"user_tz":-420,"elapsed":9,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"78e82256-598e-4b68-dbdc-1c43fb5089dd"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id text \n","48965 48965 123Betting, 123casino, 123mic, 123Ultimate, 12... \\\n","23132 23132 fresh vegetables in a box , food, organic, gar... \n","12969 12969 Posted in บาคาร่า | Tagged lsm99, lsmบาคาร่า, ... \n","9091 9091 กรัมม็อกโซน,ราวด์อัพ,พาราควอต,ไกรโฟเซต,ไกลโฟเซ... \n","26556 26556 พระเครื่อง ,ศูนย์พระเครื่อง ,ตลาดพระ ,ขายพระ ,... \n","3172 3172 ที่พักอัมพวา,ที่พักแม่กลอง,บ้านสวนทรายทอง,เที่... \n","24803 24803 Tribal seamless pattern , aztec, pattern, trib... \n","47903 47903 การเสพติดเกม, ความรุนแรง, ฆ่าลูก, ฆ่าลูกชาย, ต... \n","3194 3194 เว็บดูหนังที่มีหนังมากกว่า 30,000 เรื่อง อาทิเ... \n","8888 8888 อุปกรณ์ตกแต่งมือถือ , สำเพ็ง , อุปกรณ์แต่งเคสม... \n","40612 40612  GuProCheat โปรPUBG LITE, โปรSpecial Force2 ... \n","13856 13856 Tag: เรียนออสเตรเลีย,ศึกษาออสเตรเลีย,เรียนต่ออ... \n","45741 45741 เว็บ คาสิโนออนไลน์ DreamGaming casino ให้บริกา... \n","9952 9952 ทุกหมวดหมู่ ผลรวมเท่ากับ 7ผลรวมเท่ากับ 8ผลรวมเ... \n","11136 11136 ทะเบียนทั้งหมด ทะเบียนป้ายกราฟฟิคที่ถูกที่สุดใ... \n","16704 16704 ทำนายดวง,ดูดวงความรัก,ดูดวงการงาน,ดูดวงการเงิน... \n","39130 39130 Ayutthaya , Phra Nakhon Si Ayutthaya , Chaiwat... \n","1482 1482 ระดับราคาแบบบ้าน 2,000,000 - 3,000,000 3,000,0... \n","27455 27455 อิฐมอญ, อิฐมอญก้อนใหญ่, ผนังอิฐมอญ, จำหน่ายอิฐ... \n","8505 8505 Posted in บทความ\\t| Tagged ชา ขาว, ชา อู่ หลง,... \n","\n"," meta month_count \n","48965 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmetamonth_countspecial_countcommar_countlen_textmonth_ratiospecial_ratiocommar_ratiospace_countspace_ratio
4896548965123Betting, 123casino, 123mic, 123Ultimate, 12...{'warc_headers': {'warc-record-id': '<urn:uuid...12101540.0064940.0129870.064935160.103896
2313223132fresh vegetables in a box , food, organic, gar...{'warc_headers': {'warc-record-id': '<urn:uuid...0019526840.0000000.0000000.0726532480.092399
1296912969Posted in บาคาร่า | Tagged lsm99, lsmบาคาร่า, ...{'warc_headers': {'warc-record-id': '<urn:uuid...0061130.0000000.0000000.053097140.123894
90919091กรัมม็อกโซน,ราวด์อัพ,พาราควอต,ไกรโฟเซต,ไกลโฟเซ...{'warc_headers': {'warc-record-id': '<urn:uuid...019100397550.0000000.0019480.102819660.006766
2655626556พระเครื่อง ,ศูนย์พระเครื่อง ,ตลาดพระ ,ขายพระ ,...{'warc_headers': {'warc-record-id': '<urn:uuid...0081260.0000000.0000000.063492120.095238
31723172ที่พักอัมพวา,ที่พักแม่กลอง,บ้านสวนทรายทอง,เที่...{'warc_headers': {'warc-record-id': '<urn:uuid...00183560.0000000.0000000.05056250.014045
2480324803Tribal seamless pattern , aztec, pattern, trib...{'warc_headers': {'warc-record-id': '<urn:uuid...0022231240.0000000.0000000.0710632710.086748
4790347903การเสพติดเกม, ความรุนแรง, ฆ่าลูก, ฆ่าลูกชาย, ต...{'warc_headers': {'warc-record-id': '<urn:uuid...00242640.0000000.0000000.090909240.090909
31943194เว็บดูหนังที่มีหนังมากกว่า 30,000 เรื่อง อาทิเ...{'warc_headers': {'warc-record-id': '<urn:uuid...0061120.0000000.0000000.05357190.080357
88888888อุปกรณ์ตกแต่งมือถือ , สำเพ็ง , อุปกรณ์แต่งเคสม...{'warc_headers': {'warc-record-id': '<urn:uuid...00263920.0000000.0000000.066327470.119898
4061240612 GuProCheat โปรPUBG LITE, โปรSpecial Force2 ...{'warc_headers': {'warc-record-id': '<urn:uuid...0147414610.0000000.0095820.0506501750.119781
1385613856Tag: เรียนออสเตรเลีย,ศึกษาออสเตรเลีย,เรียนต่ออ...{'warc_headers': {'warc-record-id': '<urn:uuid...018014010.0000000.0007140.05710280.005710
4574145741เว็บ คาสิโนออนไลน์ DreamGaming casino ให้บริกา...{'warc_headers': {'warc-record-id': '<urn:uuid...4111256241940.0016950.0000410.05191425770.106514
99529952ทุกหมวดหมู่ ผลรวมเท่ากับ 7ผลรวมเท่ากับ 8ผลรวมเ...{'warc_headers': {'warc-record-id': '<urn:uuid...031389197310.0000000.0001520.07039720010.101414
1113611136ทะเบียนทั้งหมด ทะเบียนป้ายกราฟฟิคที่ถูกที่สุดใ...{'warc_headers': {'warc-record-id': '<urn:uuid...00336390.0000000.0000000.051643650.101721
1670416704ทำนายดวง,ดูดวงความรัก,ดูดวงการงาน,ดูดวงการเงิน...{'warc_headers': {'warc-record-id': '<urn:uuid...00344090.0000000.0000000.08313000.000000
3913039130Ayutthaya , Phra Nakhon Si Ayutthaya , Chaiwat...{'warc_headers': {'warc-record-id': '<urn:uuid...0019629950.0000000.0000000.0654422610.087145
14821482ระดับราคาแบบบ้าน 2,000,000 - 3,000,000 3,000,0...{'warc_headers': {'warc-record-id': '<urn:uuid...00263850.0000000.0000000.067532440.114286
2745527455อิฐมอญ, อิฐมอญก้อนใหญ่, ผนังอิฐมอญ, จำหน่ายอิฐ...{'warc_headers': {'warc-record-id': '<urn:uuid...00152110.0000000.0000000.071090150.071090
85058505Posted in บทความ\\t| Tagged ชา ขาว, ชา อู่ หลง,...{'warc_headers': {'warc-record-id': '<urn:uuid...0081090.0000000.0000000.073394180.165138
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":228}]},{"cell_type":"code","source":["df[df[\"special_ratio\"]>0.075]"],"metadata":{"id":"PI4NztpbudjE"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[df[\"month_ratio\"]>0.015]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":762},"id":"XUPFapelpwC6","executionInfo":{"status":"ok","timestamp":1682532015154,"user_tz":-420,"elapsed":10,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"0e3eb948-5fb9-4d9b-aafc-1d412599846a"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id text \n","717 717 คลังบทความ เลือกเดือน พฤศจิกายน 2021 ตุลาคม 20... \\\n","1038 1038 ขณะที่หลายคนกำลังรอการเปิดตัวของ Galaxy Note ร... \n","1881 1881 หน้าแรก › ฟอรั่ม › Notebook BIOS › Dirty Porn ... \n","1960 1960 สำหรับเป็นข้อมูลอ้างอิง ในวันที่ 8 กรกฎาคม วัน... \n","2144 2144 อดีตผู้บัญชาการทหารเรือ 10 คน ทั้ง พลเรือเอก ธ... \n","... ... ... \n","48853 48853 มกราคม กุมภาพันธ์ มีนาคม เมษายน พฤษภาคม มิถุนา... \n","48920 48920 29 มีนาคม 2564 14 มิถุนายน 2021 สำนักงานศึกษาธ... \n","49401 49401 ค้นดูประวัติ ตั้งแต่ปี (และก่อนหน้า): ตั้งแต่เ... \n","49897 49897 เต๋อ บน แชร์เก็บไว้ดู! ตารางเวลาถ่ายภาพทางช้าง... \n","49947 49947 ?หวย งวด 1 พ ย 61| ตรวจ ผล สลาก 1 มีนาคม 64| ต... \n","\n"," meta month_count \n","717 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmetamonth_countspecial_countcommar_countlen_textmonth_ratiospecial_ratiocommar_ratio
717717คลังบทความ เลือกเดือน พฤศจิกายน 2021 ตุลาคม 20...{'warc_headers': {'warc-record-id': '<urn:uuid...18002590.0694980.0000000.000000
10381038ขณะที่หลายคนกำลังรอการเปิดตัวของ Galaxy Note ร...{'warc_headers': {'warc-record-id': '<urn:uuid...1011224940.0404970.0004010.000802
18811881หน้าแรก › ฟอรั่ม › Notebook BIOS › Dirty Porn ...{'warc_headers': {'warc-record-id': '<urn:uuid...264311420.0227670.0035030.002627
19601960สำหรับเป็นข้อมูลอ้างอิง ในวันที่ 8 กรกฎาคม วัน...{'warc_headers': {'warc-record-id': '<urn:uuid...35519538214170.0165760.0091050.001774
21442144อดีตผู้บัญชาการทหารเรือ 10 คน ทั้ง พลเรือเอก ธ...{'warc_headers': {'warc-record-id': '<urn:uuid...411016950.0241890.0005900.000000
.................................
4885348853มกราคม กุมภาพันธ์ มีนาคม เมษายน พฤษภาคม มิถุนา...{'warc_headers': {'warc-record-id': '<urn:uuid...12001370.0875910.0000000.000000
489204892029 มีนาคม 2564 14 มิถุนายน 2021 สำนักงานศึกษาธ...{'warc_headers': {'warc-record-id': '<urn:uuid...2011050.0190480.0000000.009524
4940149401ค้นดูประวัติ ตั้งแต่ปี (และก่อนหน้า): ตั้งแต่เ...{'warc_headers': {'warc-record-id': '<urn:uuid...131267290.0178330.0164610.008230
4989749897เต๋อ บน แชร์เก็บไว้ดู! ตารางเวลาถ่ายภาพทางช้าง...{'warc_headers': {'warc-record-id': '<urn:uuid...201010200.0196080.0009800.000000
4994749947?หวย งวด 1 พ ย 61| ตรวจ ผล สลาก 1 มีนาคม 64| ต...{'warc_headers': {'warc-record-id': '<urn:uuid...11006530.0168450.0000000.000000
\n","

198 rows × 10 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":178}]},{"cell_type":"code","source":["import re\n","re.findall(\"หน้าหลัก \\|[ .+\\| ]+\",\"หน้าหลัก | สร้างรีวิวใหม่ | ค้นหารีวิว | สมัครสมาชิก | เกี่ยวกับเรา | ติดต่อเรา |\")\n","re.findall(\"((?:Tags:|Tagged|Tag) (?:.{1,40}(?:,|\\n|$))+)\",\"Tags: MD-0177, ขย่มควย, ขี้เงี่ยน, ขี้เย็ด, ดูดนม, ดูหี, น่าเย็ด, บ้ากาม, ร่านควย, ร้องเสียว, หนังโป๊จีน, หนังโป๊น่าดู, หนังโป๊ฟรี, หนังโป๊เต็มเรื่อง, อมควย, เย็ด, เย็ดจีน, เย็ดนางพยาบาล, เย็ดหี, เสียวหี\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ORkaSpYQNjow","executionInfo":{"status":"ok","timestamp":1682530066954,"user_tz":-420,"elapsed":5,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"20756260-b1a5-4e28-ad14-99741dfacbf3"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["['Tags: MD-0177, ขย่มควย, ขี้เงี่ยน, ขี้เย็ด, ดูดนม, ดูหี, น่าเย็ด, บ้ากาม, ร่านควย, ร้องเสียว, หนังโป๊จีน, หนังโป๊น่าดู, หนังโป๊ฟรี, หนังโป๊เต็มเรื่อง, อมควย, เย็ด, เย็ดจีน, เย็ดนางพยาบาล, เย็ดหี, เสียวหี']"]},"metadata":{},"execution_count":137}]},{"cell_type":"code","source":["[.*\\|]+"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"xZihFiQdQ-FI","executionInfo":{"status":"ok","timestamp":1682507560255,"user_tz":-420,"elapsed":504,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"4b5bc512-82fa-45ca-906b-dcd5d4848675"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.3"]},"metadata":{},"execution_count":198}]},{"cell_type":"code","source":["df[(df[\"text\"].str.contains(\"Tags:\"))]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":423},"id":"kkhbUwen24RA","executionInfo":{"status":"ok","timestamp":1682529923336,"user_tz":-420,"elapsed":750,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"6c84306b-56f7-45dc-ba27-b9c12cc70aeb"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id text \n","0 0 ในโรงงานอุตสาหกรรมทุกแห่งมักจะมีเจ้าหน้าที่หรื... \\\n","134 134 นั่นเป็นความสามารถพิเศษ ที่ไม่ใช่ทุกคนที่มีจิต... \n","144 144 รับแปลใบปริญญา ใบรับรองการศึกษา และแปลเอกสารรา... \n","149 149 เว็บไซต์แหล่งรวมเกมสล็อตออนไลน์ที่กำลังมาแรงใน... \n","206 206 '); // var el = document.getElementById('ifram... \n","... ... ... \n","49894 49894 หนังโป๊ฟรี MD-0177 นางพยาบาลตัวดีร่านรูหอย xxx... \n","49896 49896 World of สล็อต Warcraft นั้นเต็มไปด้วยผู้เล่นใ... \n","49917 49917 คณะกรรมการนโยบายการเงิน (กนง.) มีมติเป็นเอกฉัน... \n","49976 49976 porn น้องสาวฝรั่งน้องเสียวเมาไม่รู้เรื่องหลังจ... \n","49987 49987 เมื่ออาทิตย์ที่แล้ว RE.V-> ได้มีโอกาสไปงาน Len... \n","\n"," meta \n","0 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmeta
00ในโรงงานอุตสาหกรรมทุกแห่งมักจะมีเจ้าหน้าที่หรื...{'warc_headers': {'warc-record-id': '<urn:uuid...
134134นั่นเป็นความสามารถพิเศษ ที่ไม่ใช่ทุกคนที่มีจิต...{'warc_headers': {'warc-record-id': '<urn:uuid...
144144รับแปลใบปริญญา ใบรับรองการศึกษา และแปลเอกสารรา...{'warc_headers': {'warc-record-id': '<urn:uuid...
149149เว็บไซต์แหล่งรวมเกมสล็อตออนไลน์ที่กำลังมาแรงใน...{'warc_headers': {'warc-record-id': '<urn:uuid...
206206'); // var el = document.getElementById('ifram...{'warc_headers': {'warc-record-id': '<urn:uuid...
............
4989449894หนังโป๊ฟรี MD-0177 นางพยาบาลตัวดีร่านรูหอย xxx...{'warc_headers': {'warc-record-id': '<urn:uuid...
4989649896World of สล็อต Warcraft นั้นเต็มไปด้วยผู้เล่นใ...{'warc_headers': {'warc-record-id': '<urn:uuid...
4991749917คณะกรรมการนโยบายการเงิน (กนง.) มีมติเป็นเอกฉัน...{'warc_headers': {'warc-record-id': '<urn:uuid...
4997649976porn น้องสาวฝรั่งน้องเสียวเมาไม่รู้เรื่องหลังจ...{'warc_headers': {'warc-record-id': '<urn:uuid...
4998749987เมื่ออาทิตย์ที่แล้ว RE.V-> ได้มีโอกาสไปงาน Len...{'warc_headers': {'warc-record-id': '<urn:uuid...
\n","

1161 rows × 3 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":132}]},{"cell_type":"code","source":["df[\"text\"][49894]\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":122},"id":"dYpkRe6VTx77","executionInfo":{"status":"ok","timestamp":1682529970544,"user_tz":-420,"elapsed":367,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"099a7bf2-33d5-4341-a6d4-3d175822e751"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'หนังโป๊ฟรี MD-0177 นางพยาบาลตัวดีร่านรูหอย xxx แต่งชุดน่าเย็ดมาให้ท่าแฟนหนุ่ม โดนไซร้คอดูดนมจนเงี่ยน เย็ดมั่วๆคั่วกันทุกท่า | เว็บโป๊ ดูหนังโป๊ หนังXXX PORN-TH.com\\nSkip to content\\nLogin Sign Up\\nHome\\nไทย\\nหนังโป๊ซับไทย\\nหนังAVญี่ปุ่น\\nหนังโป๊ฝรั่ง\\nคลิปแอบถ่าย\\nคลิปหลุด\\nข่มขืน\\nนักเรียน-นักศึกษา\\nการ์ตูนโป๊ เฮนไท โดจิน\\nเลสเบี้ยน\\nPORN\\nPornstar\\nหนังโป๊ฟรี MD-0177 นางพยาบาลตัวดีร่านรูหอย xxx แต่งชุดน่าเย็ดมาให้ท่าแฟนหนุ่ม โดนไซร้คอดูดนมจนเงี่ยน เย็ดมั่วๆคั่วกันทุกท่า\\nLike\\nAbout\\nShare\\nviews\\n0%\\n0 0\\nFrom: คุณหญิงใหญ่\\nCategory: หนังโป๊จีน\\nTags: MD-0177, ขย่มควย, ขี้เงี่ยน, ขี้เย็ด, ดูดนม, ดูหี, น่าเย็ด, บ้ากาม, ร่านควย, ร้องเสียว, หนังโป๊จีน, หนังโป๊น่าดู, หนังโป๊ฟรี, หนังโป๊เต็มเรื่อง, อมควย, เย็ด, เย็ดจีน, เย็ดนางพยาบาล, เย็ดหี, เสียวหี\\nAdded on: November 24, 2021\\nคลิปแคมฟรอค 18+ Yi Yang นางแบบจีนทรงโตมาโชว์เรือนร่างอันสุดยั่วควย ยิ่งมุมเสยเหมือนตอนโดนเย็ดยิ่งทำให้หนุ่มๆเคลิ้ม\\n8529 views 100%\\nดูหนังจีนเรทอาร์ “Ghost Story 1990” ฉากเสียวแอบเย็ดกันในโรงไม้ สุดยอดความเสียวที่เลื่องลือ ดูแล้วไม่เห็นหีชัดแต่รับรองว่าเงี่ยน\\n19414 views 87%\\nแจกหนังโป๊จีน MDX-0130 คัดนางเอกหน้าสวยหุ่นดี xxxเซ็กซี่ทุกจุด โดนควยอ้วนๆเย็ดเข้าไปเต็มเหนี่ยว งานนี้เสียวหีร้องแทบขาดใจ\\n855 views 0%\\nเลสเบี้ยนจีนxxx สาวจีนเงี่ยนหี เรียนหนังสือแล้วมันเครียด เลยนัดแฟนสาวมาตกเบ็ดซักหน่อย ไซร้คอกันเอาซะน้ำเงี่ยนแตก\\n11582 views 85%\\nหนังโป้xจีน คู่รักไปเที่ยวมัลดีฟ เล่นน้ำอยู่แล้วเงี่ยน เลยจับเมียเย็ดในน้ำซะเลย แถมตั้งกล้องไลฟ์สดเย็ดโชว์เสียวๆให้ดูอีก\\n25292 views 86%\\nหลุดจากผับดังในจีน xxx เปิดปาร์ตี้มั่วหญิง แต่ละคนนนางแบบคุ้นหน้าทั้งนั้น รับงานเอนแถมมั่วเซ็กส์ด้วย\\n6318 views 82%\\nMDX-0083 หนังโป๊ดัง นางเอกเอเชียหน้าตาน่ารัก คุยเสียวกับชายโสดจนเค้ามีอารมณ์ ถอดกางเกงมาควยใหญ่ชี้หน้า เจอควยใหญ่เย็ดหีซอยถี่จนน้ำแตกกระจาย 18+\\n939 views\\nโป๊จีนหายาก xxxporn7 น้องหมวยจากกรุงปักกิ่ง นอนเย็ดดิลโด้ควยปลอม กระเด้งสู้ของเล่นผู้ใหญ่ เซ็กส์ทอยรุ่นใหม่สั่นแตดแรงๆ น้ำหีพุ่งเลยค่ะเสียวขนาดนี้\\n3994 views 89%\\nLeave a Reply Cancel reply\\nYour email address will not be published. Required fields are marked *\\nComment *\\nName *\\nEmail *\\nWebsite\\nSave my name, email, and website in this browser for the next time I comment\\nPorn-th.com | เว็บดูหนังโป๊ฟรีที่ยอดนิยมที่สุดในขณะ มาแรงที่สุด เพราะเราเป็นมืออาชีพทางด้านการดูหนังXXX เรามีทีมงานอัพเดทหนังโป๊ คลิปโป๊ในแต่ละวันมากกว่า 100 คนในแต่เรื่องมีหลากหลายแนวจากทั่วทุกมุมโลก ไม่ว่าจะเป็น หนังเอวี หนังโป๊ฝรั่ง หนังโป๊ไทย หนังโป๊ลาว หนังโป๊พม่า หนังโป๊เกย์ คลิปโป๊ คลิปหลุด คลิปแอบถ่าย หี และอีกมากมาย ที่สำคัญทุกหนังทุกคลิปทุกเรื่อง สามารถรับชมได้อย่างแน่นอน 100% ดูง่าย โหลดไว ไม่มีสะดุด ทันใจท่านผู้ชมอย่างแน่นอน และยังสามารถดาวน์โหลดหนังโป๊เก็บไว้ดูในภายหลังได้ เรามั่นใจว่าหนัง18+ คลิปเสียวๆ ในทุกๆเรื่องจะสามารถสร้างประโยชน์ให้กับท่านผู้ชมในด้านการเย็ดกัน(เรื่องบนเตียง)ให้เติมเต็มและมีความสุข หากท่านผู้ชมมีข้อเสนอแนะหรืออยากแสดงความคิดเห็นสามารถคอมเมนต์มาที่อีเมลล์หรือคอมเมนต์ในใต้วีดีโอในแต่ละเรื่องได้เลย\\nDMCA\\nInformation\\nติดต่อโฆษณา / Advertise\\n© Porn-th.com, 2020\\nRegistration is disabled.\\nLogin to หนังโป๊ หนังxออนไลน์ หนังAV หนังโป๊ไทย คลิปโป๊ คลิปหลุด คลิปแอบถ่าย คลิปลักหลับ แนวข่มขืน ดูฟรีไม่เสียเงิน 100% Porn-TH\\nUsername\\nPassword\\nLogin\\nLost Password?\\nReset Password\\nEnter the username or e-mail you used in your profile. A password reset link will be sent to you by email.'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":134}]},{"cell_type":"code","source":["#\n","df[\"text\"][2302]\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":191},"id":"Mn4RGiR7OW0l","executionInfo":{"status":"ok","timestamp":1682525054843,"user_tz":-420,"elapsed":800,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"9cde0651-2eec-41c8-b2f7-e9cac1172a7d"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce id ligula aliquam, malesuada ex ac, auctor nibh. Nunc tincidunt lectus finibus dolor porttitor, nec rutrum dui mattis. Sed a accumsan orci. Sed eleifend sollicitudin nisl, eget tempor odio aliquam quis. Praesent rutrum aliquam tellus at congue. Nam id nisi posuere, auctor dolor in, malesuada massa. Nullam porta dolor vel quam consequat luctus.\\t\\nREAD MORE\\nสิงหาคม 24, 2017\\n0\\n0\\nเมียนมาร์ พระธาตุอินทร์แขวน , Myanmar\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce id ligula aliquam, malesuada ex ac, auctor nibh. Nunc tincidunt lectus finibus dolor porttitor, nec rutrum dui mattis. Sed a accumsan orci. Sed eleifend sollicitudin nisl, eget tempor odio aliquam quis. Praesent rutrum aliquam tellus at congue. Nam id nisi posuere, auctor dolor in, malesuada massa. Nullam porta dolor vel quam consequat luctus.\\t\\nREAD MORE\\nสิงหาคม 8, 2017\\n0\\n0\\nเกี่ยวกับเรา\\nบริษัท Buntharik Smile จำกัด\\nให้บริการรูปแบบของ Tour&Train บริการนำเที่ยว ฝึกสอนโยคะ เรียนรู้ภาษา English และ ให้ความรู้ด้านการลงทุน ทองคำ รวมถึงการวิเคราะห์จากปัจจัยพื้นฐาน และ เชิง Technical โดยผู้เชี่ยวชาญชั้นนำ ในแต่ละด้าน\\nด้านบริการ การท่องเที่ยว ที่คอยอำนวยความสะดวก ตลอดการเดินทาง ให้ท่านได้รับประสบการณ์ การท่องเที่ยวอย่างเต็มที่ หรือ บริการให้คำปรึกษาด้าน VISA ทั่วโลก พร้อมบริการท่องเที่ยวรูปแบบใหม่เลือกสถานที่ท่องเที่ยวได้ตามความต้องการ ให้ความ Private กับการท่องเที่ยวของท่านได้มากกว่า'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":52}]},{"cell_type":"code","source":["len(\"นโยบายการรักษาความมั่นคงปลอดภัยเว็บไซต์\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"y3L-ciZBRY5k","executionInfo":{"status":"ok","timestamp":1682524447122,"user_tz":-420,"elapsed":5,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"62ce8cf8-1256-4ef7-cc64-728477fdba01"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["39"]},"metadata":{},"execution_count":33}]},{"cell_type":"code","source":["# \n","#⭐️ 🔺\n","df[\"text\"][1048]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":851},"id":"9Bzs6ZGtyhbb","executionInfo":{"status":"ok","timestamp":1682508098985,"user_tz":-420,"elapsed":590,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"58a31c16-836b-4bd0-a42e-e1cae3fb0573"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["'ก จการการทำเหม องล กไนต ในประเทศไทย เร มต นม มาต งแต ป พ.ศ.2460 ในสม ยร ชกาลท 6 เม อพลเอกพระเจ าบรมวงศ เธอกรมพระกำแพงเพชรอ ครโยธ น\\n[email protected]\\nรายการอุปกรณ์การทำเหมืองในออสเตรเลีย\\nการทำเหม องแร แร ธาต ท ม ในออสเตรเล ย เช น ราคา Bitcoin เร ยลไทม ( ท มา MiTrade ) ในป 2017 เพ ยงป เด ยวน นราคาของบ ทคอยน (bitcoin price) ได ปร บต วส งข นจากระด บต ำกว า 1 000 ดอลลาร ใน ...\\n[email protected]\\nการทำเหมืองในออสเตรเลีย ประวัติศาสตร์ ทองพุ่งและ ...\\nการทำเหม องในออสเตรเล ยเป นอ ตสาหกรรมหล กท สำค ญมายาวนานและม ส วนสน บสน นเศรษฐก จของออสเตรเล ยโดยการให รายได จากการส งออกการจ ายค าภาคหลวงและการ ...\\n[email protected]\\nเหมืองหินผลิตในออสเตรเลีย\\nสถานการณ เหม องแร ในประเทศไทย)patchareeya pukkham ป 2553 กล มเคร อข ายอน ร กษ ภ ห นเหล กไฟ และชาวบ านห วยม วง หม 4 10 13 ต.นาด นดำอ.เม อง ออกมาต อต านการทำเหม องแร ท กชน ดใน\\n[email protected]\\nยุทธการกันเหมืองแตก! ทำอย่างไรเมื่อค่าดิฟสูง ขุด ...\\n· ในภาพด านบน ค อ การนำข อม ลท เราใส มาคำนวณแล ว โดยจะบ งบอกว า Algorithm ไหน เหม องของเราทำ Hashrate ได เท าไร ด วยราคาป จจ บ นของเหร ยญท ใช Algorithm น นๆแล ว จะได เง นว น ...\\n[email protected]\\nอุปกรณ์การทำเหมืองส่วนเกิน\\nอ ปกรณ การทำเหม องแร ด บ กในอ นโดน เซ ยบดเพ อขาย Welcome to Phuket Data การทำเหม องแร ในจ งหว ดภ เก ต. 10 ม.ค. 2008 การทำเหม องแร ในประเทศไทยม ก นมานานน บแต โบราณกาลแล วแต ...\\n[email protected]\\nเกี๊ยว เครื่องจักรและอุปกรณ์\\nเก ยว เคร องจ กรและอ ปกรณ เก ยว เคร องจ กร ANKOของ เก ยวซ าเคร องร น HLT-960 ถ กประด ษฐ ข นคร งแรกในป 1988 เป ดใช งานการผล ตจำนวนมากแทนการผล ตด วยตนเอง อย างไรก ตาม ...\\n[email protected]\\nเทคโนโลยีแอมป์เหมืองแร่ในออสเตรเลีย\\nจากรายงานของ บ ส อ อกฟอร ด อ โคโนม กส เร องการทำเหม องแร ในประเทศออสเตรเล ยต งแต ป พ.ศ. 2560 ถ ง 2575 พบว าการสำรวจ การผล ต 10 Technologies To Watch ป น ม อะไรบ าง จากการพ จารณ ...\\n[email protected]\\nหมวดหมู่:เหมืองแร่ในออสเตรเลีย\\nหน าในหมวดหม \"เหม องแร ในออสเตรเล ย\" ม บทความ 1 หน าในหมวดหม น จากท งหมด 1 หน า รายการท ปรากฏด านล างอาจไม รวมการแก ไขล าส ด หน าน แก ไขล าส ดเม อว นท 14 ม นา ...\\n[email protected]\\nเครื่องดูดควันห้องครัว: …\\nต วกรองคาร บอนและไขม นในบางร นม การต ดต งในเวลาเด ยวก น.ในอ ปกรณ ค ณสามารถมองเห นได ท นท จาระบ จ บและหล งพวกเขาส เหล ยม ด งน นหน งอ ปกรณ ทำการฟอกอากาศ ...\\n[email protected]\\nหลักการใหญ่ๆของการทำเหมือง\\n-ใช การเจาะระเบ ด (Drilling and Blasting) เช นในกรณ การทำเหม องแร ในห นแข ง (Hard Rock Mining) หร อทางแร เป นต น - ใช ว ธ การต างๆเพ อเข าไปข ดแร หร อการเจาะระเบ ดแหล งแร ใต ด นได แก\\n[email protected]\\nอุปกรณ์การทำเหมืองส่วนเกินยูทาห์\\nการต ดแต งพ นธ กรรม (GMOs) | เดล น วส การบ นไทยรอล น 14 ก.ย.น ศาลน ดฟ งคำส งในคำร องขอฟ นฟ ก จการ ช หากให การบ นไทยจ ดทำแผนคาดใช เวลาอ ก 3 เด อนส ง ...\\n[email protected]\\nเครื่องบดการทำเหมืองในออสเตรเลียในออสเตรเลีย\\nเคร องบดการทำเหม องในออสเตรเล ยในออสเตรเล ย ย ำไม อ อนข อ \"ค งส เกต\" ล าส ด ได อน ญาตอาชญาบ ตรพ เศษสำรวจแร ทองคำให อ คราแล ว 400,000 ไร โดยไม คำน งถ งผล ...\\n[email protected]\\nขายอุปกรณ์ทำเหมืองถ่านหินในออสเตรเลีย\\nEGCO เล งขายธ รก จถ านห นในอ นโดน เซ ย เม อต นป ท แล ว egco ได ขายห นท ถ ออย ท งหมด 18.72% ในบมจ.จ ดการและพ ฒนาทร พยากรน ำภาคตะว นออก (eastw) ค ดเป นม ลค า 5.23 พ นล าน ...\\n[email protected]\\nเหมืองแร่เเละเหมืองหิน\\nเหมืองแร่เเละเหมืองหิน. การทำเหมืองเพิ่มความเค้นบนอุปกรณ์มากกว่าอุตสาหกรรมอื่นหรือไม่? เป็นที่แน่นอนว่า อุปกรณ์ทำการ ...\\n[email protected]\\nอุปกรณ์การทำเหมืองหินแกรนิตที่ทันสมัย\\nอ ปกรณ การทำเหม องแร ห นอ อนในประเทศออสเตรเล ย แร แบไรท และเคร องบดเบนโทไนท ห นป น, ห นอ อน, เฟลด สปาร, แก วผล ก, โดโลไมต, ทรายด นเหน ยวบดเคร องในการทำ\\n[email protected]\\nซ่อมอุปกรณ์ทำเหมืองในออสเตรเลีย\\nประเทศออสเตรเล ยว ก พ เด ย ออสเตรเล ยประกาศใช บทกฎหมายเวสต ม นสเตอร ค.ศ. 1931 ในป ค.ศ. 1942 โดยม ผลบ งค บใช ย อนไปต งแต 3 ก นยายน ค.ศ. 1939 ซ งเป นการย ต การขนส ง ระบบ ...\\n[email protected]\\nบทบาทของอุตสาหกรรมเหมืองแร่ต่อระบบเศรษฐกิจ\\nในป จจ บ นม ผ ประกอบก จการเหม องแร ประมาณ 6,000 ราย ม การจ างงานประมาณ 2.5 ล านคนท ว\\n[email protected]\\nอุปกรณ์สำหรับการทำเหมืองยิปซั่ม\\nอ ปกรณ บดขนาดเล กท ใช ในการทำเหม องทอง อุปกรณ์ทำเหมือง และสายพาน. ... ยิปซั่ม เป็นสารหน่วงการแข็งตัวของปูนซิเมนต์ ใช้เติมบดผสมลงในปูนเม็ด. ...\\n[email protected]\\nผู้จำหน่ายอุปกรณ์ทำเหมือง, …\\nย นด ต อนร บส Jupiter mining บร ษ ท ของเราม งเน นไปท การส งเสร มอ ปกรณ และเทคโนโลย ข นส ง ผล ตภ ณฑ หล กของเราประกอบด วยคอล มน flotation, xanthate, MIBC, Dithiophosphate และ P204 เป นต นเราจะให ...\\n[email protected]\\nอุปกรณ์การทำเหมืองส่วนเกินในประเทศฟิลิปปินส์\\n· ปรอทในการทำเหม องแร ทองคำและเหต ใดจ งเป นป ญหา 2020 คอล มน Market Move หล งจากเจลล างม อแอลกอฮอล ได กลายเป นส นค าท ม ความต องการเป นอย างมากในช วงน จากสถานการ ...\\n[email protected]\\nการเพิ่มประสิทธิภาพการใช้น้ำ\\nในการจัดการบริหารและแบ่งน้ำนั้นต้องดำเนินตาม \"ข้อตกลงเหมืองฝาย\" ที่สมาชิกทุกคนได้ร่วมกันกำหนดขึ้นเป็นสัญญาประชาคมที่ ...\\n[email protected]\\nบริษัทอุปกรณ์การทำเหมืองใน\\nโดยในป จจ บ นม การพ ฒนาทางเทคโนโลย ก าวหน าอย างส ง เร มม การทำเหม องแร สำหร บการถล งแร ธาต ต าง ๆ มาใช ประโยชน ใน ...\\n[email protected]\\nอุปกรณ์การทำเหมืองยิปซั่มในเยเมนบดเพื่อขาย\\nมาทำความร จ กก บว สด ประเภท ย ปซ ม ก นเถอะ!! เหม องแร ย ปซ มจะม ล กษณะเป นเหม องเป ดไม เหม อนก บเหม องห นต างๆท อย ใต ด น การทำเหม องแร ย ปซ มจะต องเป ดหน าด น ...\\n[email protected]\\nการทำเหมืองแบบปิด | PETRONAS Lubricants …\\nอุตสาหกรรมการทำเหมืองแบบปิดสมัยใหม่ทั่วโลกเผชิญกับความท้าทายครั้งสำคัญอย่างที่ไม่เคยมีมาก่อน การทำงานในสถานที่ตั้ง ...\\n[email protected]\\nใช้และอุปกรณ์การทำเหมืองส่วนเกินขาย\\nมาทำความร จ กก บว สด ประเภท ย ปซ ม ก นเถอะ - อ นๆ ต วอย าง ในการจ ดซ อ ขนส ง และจ ดเก บส นค าสำหร บร านขายผล ตภ ณฑ ก ฬาของเรา จะม ค าใช จ ายของส นค าช ดก ฬา ...\\n[email protected]\\nอุปกรณ์ในการทำความสะอาดบ้าน วิธีใช้งาน และการเก็บ ...\\nAbout Press Copyright Contact us Creators Advertise Developers Terms Privacy Policy & Safety How works Test new features\\n[email protected]\\nการทำเหมืองแร่ในออสเตรเลีย การทำธุรกรรมที่ง่าย ...\\nการทำเหม องแร ในออสเตรเล ย ท Alibaba มอบส งท ไม เพ ยง แต ทำให ธ รกรรมของค ณปลอดภ ย แต ย งปลอดภ ยอ กด วย เร ยกด ไซต เพ อค นหา การทำเหม องแร ในออสเตรเล ย เพ มเต ...\\n[email protected]\\nการเติบโตของเหมืองในต่างประเทศและการลงทุนที่ต้อง ...\\n· การเต บโตของเหม องในต างประเทศและการ ลงท นท ต องพ จารณา บร ษ ทข ดเหม องย กษ ใหญ ในย โรปลงท นต ดต งเคร องข ดเพ มเพราะเช อในม ...\\n[email protected]\\nอุปกรณ์การทำเหมืองโรงสีผง\\nอ ปกรณ การทำเหม องโรงส ผง ขายโรงส ผงขนาดเล กขายโรงส ข าวสองห น ห น24ของตระก ลไชยพาน ช ใช ไฟบ านธรรมดา ใช ได ระบบด ราคาถ ก พร อมใช งาน สนใจโทร ค ณนะ บ วต ID ...\\n[email protected]\\nสินค้าโภคภัณฑ์: ทอง 2021\\nการดำเน นการเหม องแร ทองคำม ข นในท กทว ปยกเว นแอนตาร กต กา ทองส วนใหญ ของโลกถ กข ดข นมาในย คสม ยใหม หล งสงคราม ในทศวรรษท ผ านมาประเทศอ น ๆ ได กลายเป ...\\n[email protected]\\nอุปกรณ์การทำเหมืองออสเตรเลียออสเตรเลีย\\n12 ว นท าทาย กลางทะเลทราย ท ออสเตรเล ย autoinfo .th เราเด นทางไปท เม องโบรเคน ฮ ลล (broken hill) ซ งเป นเขตศ นย กลางในการทำเหม องแร ท ใหญ ท ส ดแห งหน งของโลก เพราะม แร หลาย\\n[email protected]\\nเหมืองทองออสเตรเลีย การทำธุรกรรมที่ง่ายขึ้น\\nเหม องทองออสเตรเล ย ท Alibaba มอบส งท ไม เพ ยง แต ทำให ธ รกรรมของค ณปลอดภ ย แต ย งปลอดภ ยอ กด วย เร ยกด ไซต เพ อค นหา เหม องทองออสเตรเล ย เพ มเต มท เหมาะสมท ส ...\\n[email protected]\\nAeroklas …\\n· คร งแรกท เข ามาทำงานก บ TJM เราได ประกาศนโยบายว า \"จะพล กฟ นก จการ TJM ให กล บมาเป นเบอร 1 ในประเทศออสเตรเล ยอ กคร ง\" การดำเน นงานท ผ านมาเราได ปร บโครงสร ...\\n[email protected]\\nการบำรุงรักษาและการซ่อมแซมอุปกรณ์ทำเหมือง ...\\nการทำความสะอาดในเช งพาณ ชย (US, English) การซ อมบำร งและการซ อมแซมเร อเด นทะเล บำร งร กษาและซ อมแซมยานพาหนะทางทะเล ร บราคา'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":213}]},{"cell_type":"code","source":[],"metadata":{"id":"USz21T-YR2gF"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["#ดู หนัง ออนไลน์\n","df[(df[\"text\"].str.contains(\"comments\")) & (~df[\"text\"].str.contains(pattern))].sample(20)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":676},"id":"fUrxfAIrx4Td","executionInfo":{"status":"ok","timestamp":1682502706302,"user_tz":-420,"elapsed":12748,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b937b009-4b4c-412e-c025-9b1ef87ce1cf"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id text \n","36323 36323 หากคุณเป็นคนหนึ่งที่ต้องการจะมีหุ่นที่เฟิร์ม ม... \\\n","27551 27551 Posted byCampzzz March 22, 2021 March 21, 2021... \n","2401 2401 10 เรื่อง ที่คนรวย จะใช้เวลาทั้งวัน กับสิ่งเหล... \n","36729 36729 รูปalokฟีฟาย FreeFrie แจกมอดฟีฟายล่าสุด!! สอนล... \n","22995 22995 เรียกได้ว่าคู่นี้เป็นคู่​รัก​ที่รั​กกันมา​ยาวน... \n","38296 38296 [ฝรั่ง] [1080p Super HQ] Midway (2019) : อเมริ... \n","48569 48569 ก่อนหน้านี้ เคยมีรายงานจาก Reuters ว่า Project... \n","37446 37446 ไมโครซอฟท์เปิดตัวไลบรารี WinUI (Windows UI) คร... \n","23154 23154 Bloggang.com : สมาชิกหมายเลข 1495151 - ผลหวยฮา... \n","35872 35872 โครงการคลองไทยเป็นโครงการขนาดใหญ่มีผลต่อเศรษฐก... \n","14762 14762 โจทย์นี้คุณฟ้าใสวันใหม่บอกว่าเป็นโจทย์ง่ายๆ เล... \n","30610 30610 น้องน้ำมนต์อายุ 11 เดือน คุณแม่อยากสอนให้ลูกเป... \n","17877 17877 Ford ประกาศ ความพร้อม และเตรียมการประกอบ รถยนต... \n","28789 28789 Kpop ข่าวบันเทิงเกาหลี ดาราไอดอล และศิลปินเกาห... \n","9033 9033 STOU Library catalog › Results of search for '... \n","7187 7187 รถจักรยานยนต์ honda scoopy i - ข้อมูลรถจักรยาน... \n","34449 34449 เที่ยว Mazatlan (เมืองมาซาตลัน)โรงแรม Mazatlan... \n","40947 40947 [Review] Nioh : Bloodshed’s End Reviewed byKai... \n","22083 22083 เรื่องราวของคนสิ้นหวังในชีวิต ติดหนี้ ติดการพน... \n","17002 17002 อะคริลิค ทำไมถึงได้รับความนิยม ใช้ประโยชน์ได้ม... \n","\n"," meta \n","36323 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmeta
3632336323หากคุณเป็นคนหนึ่งที่ต้องการจะมีหุ่นที่เฟิร์ม ม...{'warc_headers': {'warc-record-id': '<urn:uuid...
2755127551Posted byCampzzz March 22, 2021 March 21, 2021...{'warc_headers': {'warc-record-id': '<urn:uuid...
2401240110 เรื่อง ที่คนรวย จะใช้เวลาทั้งวัน กับสิ่งเหล...{'warc_headers': {'warc-record-id': '<urn:uuid...
3672936729รูปalokฟีฟาย FreeFrie แจกมอดฟีฟายล่าสุด!! สอนล...{'warc_headers': {'warc-record-id': '<urn:uuid...
2299522995เรียกได้ว่าคู่นี้เป็นคู่​รัก​ที่รั​กกันมา​ยาวน...{'warc_headers': {'warc-record-id': '<urn:uuid...
3829638296[ฝรั่ง] [1080p Super HQ] Midway (2019) : อเมริ...{'warc_headers': {'warc-record-id': '<urn:uuid...
4856948569ก่อนหน้านี้ เคยมีรายงานจาก Reuters ว่า Project...{'warc_headers': {'warc-record-id': '<urn:uuid...
3744637446ไมโครซอฟท์เปิดตัวไลบรารี WinUI (Windows UI) คร...{'warc_headers': {'warc-record-id': '<urn:uuid...
2315423154Bloggang.com : สมาชิกหมายเลข 1495151 - ผลหวยฮา...{'warc_headers': {'warc-record-id': '<urn:uuid...
3587235872โครงการคลองไทยเป็นโครงการขนาดใหญ่มีผลต่อเศรษฐก...{'warc_headers': {'warc-record-id': '<urn:uuid...
1476214762โจทย์นี้คุณฟ้าใสวันใหม่บอกว่าเป็นโจทย์ง่ายๆ เล...{'warc_headers': {'warc-record-id': '<urn:uuid...
3061030610น้องน้ำมนต์อายุ 11 เดือน คุณแม่อยากสอนให้ลูกเป...{'warc_headers': {'warc-record-id': '<urn:uuid...
1787717877Ford ประกาศ ความพร้อม และเตรียมการประกอบ รถยนต...{'warc_headers': {'warc-record-id': '<urn:uuid...
2878928789Kpop ข่าวบันเทิงเกาหลี ดาราไอดอล และศิลปินเกาห...{'warc_headers': {'warc-record-id': '<urn:uuid...
90339033STOU Library catalog › Results of search for '...{'warc_headers': {'warc-record-id': '<urn:uuid...
71877187รถจักรยานยนต์ honda scoopy i - ข้อมูลรถจักรยาน...{'warc_headers': {'warc-record-id': '<urn:uuid...
3444934449เที่ยว Mazatlan (เมืองมาซาตลัน)โรงแรม Mazatlan...{'warc_headers': {'warc-record-id': '<urn:uuid...
4094740947[Review] Nioh : Bloodshed’s End Reviewed byKai...{'warc_headers': {'warc-record-id': '<urn:uuid...
2208322083เรื่องราวของคนสิ้นหวังในชีวิต ติดหนี้ ติดการพน...{'warc_headers': {'warc-record-id': '<urn:uuid...
1700217002อะคริลิค ทำไมถึงได้รับความนิยม ใช้ประโยชน์ได้ม...{'warc_headers': {'warc-record-id': '<urn:uuid...
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":94}]},{"cell_type":"code","source":["df[df[\"text\"].str.contains(pattern)]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":423},"id":"1KJxyqLF74Cs","executionInfo":{"status":"ok","timestamp":1680892647204,"user_tz":-420,"elapsed":4809,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"d94241c7-99de-4255-a85f-cf109cd57301"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":[" id text \\\n","4 4 หนังโป้ฝรั่งมาใหม่ สาวอเมริกาเซ็กส์จัด Aria Le... \n","5 5 ประสบการณ์ตรง เล่นหวยดังออนไลน์ได้ง่ายๆ สลากกิ... \n","7 7 While not technically cheating, which is again... \n","15 15 แทงบอลวันนี้ การแทงพนันฟุตบอล ปรับเปลี่ยนไปตาม... \n","23 23 หนังโป๊ดังๆ หนังโป๊ฮิต หนังโป๊ใหม่ XXX PORN รว... \n","... ... ... \n","49976 49976 porn น้องสาวฝรั่งน้องเสียวเมาไม่รู้เรื่องหลังจ... \n","49979 49979 ยินดีต้อนรับสู่ป่า Slot Monkey Mayhem สถานที่ท... \n","49980 49980 แนะนำ Joker555Vip ที่ทางเรานำเสนอ เกมออนไลน์ได... \n","49984 49984 กราบสวัสดีพี่ ๆน้อง ๆ กันอีกครั้งนะครับกลับมาว... \n","49992 49992 เมื่อประมาณปี 2555 ผมได้รับประสบกามที่ดีมากจาก... \n","\n"," meta \n","4 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmeta
44หนังโป้ฝรั่งมาใหม่ สาวอเมริกาเซ็กส์จัด Aria Le...{'warc_headers': {'warc-record-id': '<urn:uuid...
55ประสบการณ์ตรง เล่นหวยดังออนไลน์ได้ง่ายๆ สลากกิ...{'warc_headers': {'warc-record-id': '<urn:uuid...
77While not technically cheating, which is again...{'warc_headers': {'warc-record-id': '<urn:uuid...
1515แทงบอลวันนี้ การแทงพนันฟุตบอล ปรับเปลี่ยนไปตาม...{'warc_headers': {'warc-record-id': '<urn:uuid...
2323หนังโป๊ดังๆ หนังโป๊ฮิต หนังโป๊ใหม่ XXX PORN รว...{'warc_headers': {'warc-record-id': '<urn:uuid...
............
4997649976porn น้องสาวฝรั่งน้องเสียวเมาไม่รู้เรื่องหลังจ...{'warc_headers': {'warc-record-id': '<urn:uuid...
4997949979ยินดีต้อนรับสู่ป่า Slot Monkey Mayhem สถานที่ท...{'warc_headers': {'warc-record-id': '<urn:uuid...
4998049980แนะนำ Joker555Vip ที่ทางเรานำเสนอ เกมออนไลน์ได...{'warc_headers': {'warc-record-id': '<urn:uuid...
4998449984กราบสวัสดีพี่ ๆน้อง ๆ กันอีกครั้งนะครับกลับมาว...{'warc_headers': {'warc-record-id': '<urn:uuid...
4999249992เมื่อประมาณปี 2555 ผมได้รับประสบกามที่ดีมากจาก...{'warc_headers': {'warc-record-id': '<urn:uuid...
\n","

10011 rows × 3 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":12}]},{"cell_type":"markdown","source":["# LDA"],"metadata":{"id":"A9iR9mWSJTQb"}},{"cell_type":"code","source":["f=open(\"/content/drive/MyDrive/Openthaigpt/stopwords.txt\",\"r\")\n","\n","stopwords = [line.strip() for line in f.readlines()]\n","\n","f.close()"],"metadata":{"id":"8HBYaPGbMTKq"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import gensim\n","from gensim import corpora\n","from gensim.models import LdaModel\n","from pythainlp.tokenize import word_tokenize\n","import re\n","import os\n","tqdm.pandas()\n","\n","def preprocess_text(text):\n"," text = text.lower()\n"," text = text.replace(\"\\n\",\"\")\n"," text = text.replace(\"\\t\",\"\")\n"," text = re.sub(\"[^a-zA-Zก-๙๐-๙ ]\",\"\",text)\n"," tokenized_text = word_tokenize(text)\n"," return [w for w in tokenized_text if w not in stopwords and len(w)>1]"],"metadata":{"id":"k6N4am2seTlh"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["tokenized_doc = df[\"text\"].progress_apply(preprocess_text)\n","\n","\n","dictionary_path = \"/content/drive/MyDrive/Openthaigpt/lda_dict_oscar2022\"\n","check_file = os.path.isfile(dictionary_path)\n","\n","if not check_file:\n"," dictionary = corpora.Dictionary(tokenized_doc)\n"," dictionary.save(dictionary_path)\n","else :\n"," dictionary=corpora.Dictionary.load(\"filename\")\n","\n","\n","corpus = [dictionary.doc2bow(doc) for doc in tokenized_doc]\n","\n","num_topics = 30\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"wsGJGJLUytKH","executionInfo":{"status":"ok","timestamp":1680894378333,"user_tz":-420,"elapsed":1547934,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"863fdc4f-d066-46a1-e3f1-4aa93ef439b6"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 50001/50001 [24:43<00:00, 33.71it/s]\n"]}]},{"cell_type":"code","source":["lda_model = LdaModel(corpus=corpus, id2word=dictionary, num_topics=num_topics , passes=20, iterations=100,random_state=1)\n"],"metadata":{"id":"ZUog67zjpEAo"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["for topic in lda_model.print_topics():\n"," print(topic)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"5yaccnLoK9DR","executionInfo":{"status":"ok","timestamp":1680897773786,"user_tz":-420,"elapsed":27,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"88768bff-547b-4f7f-ba8e-cdc2c8a624b1"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["(6, '0.045*\"ตอนที่\" + 0.036*\"พระ\" + 0.025*\"วัด\" + 0.015*\" \" + 0.013*\"ท่าน\" + 0.010*\"ทรง\" + 0.007*\"ธรรม\" + 0.006*\"ปี\" + 0.005*\"มหา\" + 0.005*\"สมเด็จ\"')\n","(9, '0.047*\"เย็ด\" + 0.041*\"หี\" + 0.031*\"หนังโป๊\" + 0.029*\"คลิป\" + 0.020*\"หนัง\" + 0.019*\"ควย\" + 0.018*\"สาว\" + 0.014*\"xxx\" + 0.013*\"ไทย\" + 0.012*\"หลุด\"')\n","(25, '0.174*\" \" + 0.016*\"กระทู้\" + 0.015*\"สนุก\" + 0.014*\"เกมส์\" + 0.012*\"แนะนำ\" + 0.011*\"แจ้ง\" + 0.009*\"no\" + 0.009*\" \" + 0.008*\"ตรี\" + 0.008*\"ติชม\"')\n","(3, '0.040*\" \" + 0.021*\"การศึกษา\" + 0.013*\"ครู\" + 0.013*\"โรงเรียน\" + 0.013*\"มหาวิทยาลัย\" + 0.011*\"งาน\" + 0.011*\"เรียน\" + 0.010*\"นักเรียน\" + 0.009*\"หลักสูตร\" + 0.009*\"เทคโนโลยี\"')\n","(5, '0.081*\"ประเทศ\" + 0.035*\"ภาษา\" + 0.021*\"เยอรมัน\" + 0.016*\"ญี่ปุ่น\" + 0.015*\"เยอรมนี\" + 0.015*\"จีน\" + 0.014*\"เช็ก\" + 0.014*\"วีซ่า\" + 0.012*\"อังกฤษ\" + 0.010*\"กรีก\"')\n","(19, '0.048*\" \" + 0.010*\"ปี\" + 0.010*\"ธุรกิจ\" + 0.008*\"บริษัท\" + 0.007*\"ใหม่\" + 0.007*\"ไทย\" + 0.006*\"ล้าน\" + 0.006*\"ราคา\" + 0.005*\"ลูกค้า\" + 0.005*\"สินค้า\"')\n","(0, '0.436*\" \" + 0.010*\"ราคา\" + 0.010*\"ทะเบียนรถ\" + 0.010*\"ดี\" + 0.008*\"เครื่อง\" + 0.007*\"ยี่ห้อ\" + 0.005*\"โปรแกรม\" + 0.005*\"รุ่น\" + 0.005*\"name\" + 0.005*\"สำหรับ\"')\n","(1, '0.015*\"สามารถ\" + 0.012*\"สำหรับ\" + 0.011*\"ที่จะ\" + 0.010*\"ใช้\" + 0.010*\"สิ่ง\" + 0.009*\"ทำให้\" + 0.009*\"ฉัน\" + 0.009*\"ผู้\" + 0.009*\"ได้รับ\" + 0.008*\"พวกเขา\"')\n","(21, '0.293*\" \" + 0.143*\" \" + 0.033*\" \" + 0.018*\"var\" + 0.011*\"if\" + 0.010*\"ข่าว\" + 0.009*\"วันที่\" + 0.009*\" \" + 0.008*\"พย\" + 0.007*\"ธันวาคม\"')\n","(23, '0.028*\"โรงแรม\" + 0.026*\" \" + 0.023*\"ทัวร์\" + 0.023*\"เดินทาง\" + 0.016*\"เมือง\" + 0.015*\"เที่ยว\" + 0.012*\"ใกล้\" + 0.012*\"เกาะ\" + 0.010*\"ที่พัก\" + 0.010*\"สถานที่\"')\n","(12, '0.043*\"ละคร\" + 0.033*\"ซี\" + 0.032*\"รายการ\" + 0.030*\"ย์\" + 0.028*\"รี่\" + 0.025*\"รัก\" + 0.009*\" \" + 0.008*\"เพลง\" + 0.005*\"หัวใจ\" + 0.005*\"the\"')\n","(4, '0.083*\"หวย\" + 0.060*\" \" + 0.033*\"เงิน\" + 0.027*\"บาท\" + 0.023*\"หุ้น\" + 0.022*\"เลข\" + 0.017*\"ซื้อ\" + 0.015*\"จ่าย\" + 0.013*\"ตัว\" + 0.012*\"เลขเด็ด\"')\n","(13, '0.026*\"รถ\" + 0.026*\"สี\" + 0.014*\"ใช้\" + 0.013*\"บ้าน\" + 0.010*\"ขนาด\" + 0.010*\"เลือก\" + 0.009*\"ผ้า\" + 0.009*\"สามารถ\" + 0.009*\"ประตู\" + 0.008*\"ราคา\"')\n","(26, '0.058*\" \" + 0.019*\"เกม\" + 0.013*\"ทีม\" + 0.009*\"เล่น\" + 0.009*\"ปี\" + 0.005*\"อร\" + 0.005*\"ผู้\" + 0.004*\"ร์\" + 0.004*\"การแข่งขัน\" + 0.004*\"ตัว\"')\n","(24, '0.024*\" \" + 0.011*\"สุขภาพ\" + 0.009*\"ใช้\" + 0.009*\"ช่วย\" + 0.008*\"โควิด\" + 0.008*\"ยา\" + 0.008*\"โรค\" + 0.007*\"อาการ\" + 0.007*\"อาหาร\" + 0.006*\"ผิว\"')\n","(14, '0.107*\" \" + 0.052*\"ฟรี\" + 0.048*\"สล็อต\" + 0.041*\"ฝาก\" + 0.037*\"เครดิต\" + 0.030*\"slot\" + 0.030*\"คา\" + 0.027*\"joker\" + 0.023*\"บา\" + 0.023*\"ร่า\"')\n","(8, '0.038*\"ออนไลน์\" + 0.036*\"เล่น\" + 0.026*\"เกม\" + 0.025*\"เว็บ\" + 0.022*\"คาสิโน\" + 0.019*\"เดิมพัน\" + 0.016*\"สามารถ\" + 0.014*\" \" + 0.014*\"แทง\" + 0.013*\"พนัน\"')\n","(2, '0.182*\"บอล\" + 0.032*\"สด\" + 0.030*\" \" + 0.028*\"ดู\" + 0.027*\"ลีก\" + 0.026*\"ฟุตบอล\" + 0.021*\"ทีเด็ด\" + 0.021*\"วิเคราะห์\" + 0.016*\"ราคา\" + 0.015*\"ตาราง\"')\n","(27, '0.064*\"บริษัท\" + 0.056*\"จำกัด\" + 0.036*\" \" + 0.029*\"บ้าน\" + 0.016*\"ขาย\" + 0.013*\"คอนโด\" + 0.009*\"เอส\" + 0.008*\"โครงการ\" + 0.007*\"ดี\" + 0.007*\"พัทยา\"')\n","(20, '0.135*\"หนัง\" + 0.076*\"ดู\" + 0.033*\"ออนไลน์\" + 0.031*\"ไทย\" + 0.026*\"ใหม่\" + 0.018*\" \" + 0.018*\"เรื่อง\" + 0.015*\"ฟรี\" + 0.012*\"hd\" + 0.010*\"ชม\"')\n"]}]},{"cell_type":"code","source":["import pyLDAvis.gensim_models as gensimvis\n","import pyLDAvis\n","\n","# Visualize the topics\n","vis = gensimvis.prepare(lda_model, corpus, dictionary)\n","pyLDAvis.display(vis)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":916},"id":"1PmQhQT9KXmN","executionInfo":{"status":"ok","timestamp":1680897948332,"user_tz":-420,"elapsed":174551,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"178d2c17-8a61-43f5-ba86-e0c270963039"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/pyLDAvis/_prepare.py:243: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only.\n"," default_term_info = default_term_info.sort_values(\n"]},{"output_type":"execute_result","data":{"text/plain":[""],"text/html":["\n","\n","\n","\n","
\n",""]},"metadata":{},"execution_count":21}]},{"cell_type":"code","source":["stopwords[-1]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":90},"id":"F0ph70yncbXZ","executionInfo":{"status":"ok","timestamp":1680161754575,"user_tz":-420,"elapsed":10,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"049f977e-c305-4b2f-cd57-e34135258e30"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":["'เท่าไร'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":29}]},{"cell_type":"code","source":["docs_topic = []\n","\n","for i in tqdm(range(len(df))):\n","\n"," topics = lda_model.get_document_topics(corpus[i])\n","\n"," top_topic = max(topics, key=lambda x: x[1])\n"," docs_topic.append(top_topic[0])"],"metadata":{"id":"SyBQjjmnRZWp","executionInfo":{"status":"ok","timestamp":1680160932187,"user_tz":-420,"elapsed":13304,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"894e54df-f763-403a-84b3-6362b1886f13"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n","100%|██████████| 10001/10001 [00:14<00:00, 701.56it/s]\n"]}]},{"cell_type":"code","source":["df[\"docs_topic\"] = docs_topic"],"metadata":{"id":"ZelYyzD0SJp5","executionInfo":{"status":"ok","timestamp":1680160932188,"user_tz":-420,"elapsed":41,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"233fd167-4fac-4c93-ca7d-288e8bbf1feb"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}]},{"cell_type":"code","source":["df[\"docs_topic\"].unique()"],"metadata":{"id":"Qz9rPLMzTIAX","executionInfo":{"status":"ok","timestamp":1680160932188,"user_tz":-420,"elapsed":35,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"e82a9864-cbfa-4dcb-81c8-e801c3639a8f"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":["array([28, 29, 14, 0, 24, 27, 25, 12, 18, 6, 5, 4, 21, 23, 19, 17, 1,\n"," 16, 7, 20, 15, 9, 3, 11, 13, 10, 22, 26, 2, 8])"]},"metadata":{},"execution_count":20}]},{"cell_type":"code","source":["df[df[\"text\"].str.contains(\"อวัยวะเพศ\")]"],"metadata":{"id":"aPbA-hgeSg5D"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# df[df[\"docs_topic\"]==14][\"text\"][5231]"],"metadata":{"id":"gGYOjapqUuti"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[df[\"docs_topic\"]==17].sample(20)"],"metadata":{"id":"pWj0ev7dSoZx"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[df[\"docs_topic\"]==1].iloc[4][\"text\"]"],"metadata":{"id":"Yy4mG_G_Sffz"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["df[(df[\"text\"].str.contains(\"เย็ด\")) & ~(df[\"text\"].str.contains(pattern))]"],"metadata":{"id":"VtZPbegAxLUF"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# Token Count"],"metadata":{"id":"t36-mHxBWYMI"}},{"cell_type":"code","source":["from transformers import AutoTokenizer \n","t5_tokenizer = AutoTokenizer.from_pretrained(\"google/mt5-base\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"i0Zr0BO3Wbe4","executionInfo":{"status":"ok","timestamp":1680163266725,"user_tz":-420,"elapsed":6879,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b514abe3-7644-40a6-c752-379aa3782b13"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/transformers/convert_slow_tokenizer.py:446: UserWarning: The sentencepiece tokenizer that you are converting to a fast tokenizer uses the byte fallback option which is not implemented in the fast tokenizers. In practice this means that the fast version of the tokenizer can produce unknown tokens whereas the sentencepiece version would have converted these unknown tokens into a sequence of byte tokens matching the original piece of text.\n"," warnings.warn(\n"]}]},{"cell_type":"code","source":["t5_tokenizer([\"หิวข้าวจังเงย\",\"งือๆ\"])[\"input_ids\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"3D5LfH3biOdM","executionInfo":{"status":"ok","timestamp":1680163393667,"user_tz":-420,"elapsed":870,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"2151f716-7f17-4158-ebb3-3b36258ad078"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[[259, 18604, 138504, 67641, 148184, 165860, 6200, 1],\n"," [259, 5095, 99650, 4571, 1]]"]},"metadata":{},"execution_count":4}]},{"cell_type":"code","source":["from tqdm import tqdm\n","oscar19=[]\n","token_count=0\n","i=0\n","for data in tqdm(iter(dataset)):\n"," if i%10000==1:\n"," token_count += sum([len(tokenized) for tokenized in t5_tokenizer(oscar19)[\"input_ids\"]])\n"," oscar19=[]\n","\n"," oscar19.append(data[\"text\"])\n"," i+=1\n","print(token_count)\n","print(token_count/i)"],"metadata":{"id":"tKBLCBNEiHQa"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# token เฉลี่ย 478.4516566902038\n","# row 1794110462"],"metadata":{"id":"Y0YSYtr0bxwy","executionInfo":{"status":"ok","timestamp":1680178359178,"user_tz":-420,"elapsed":953,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"e767dde1-25d7-4c98-e839-454a280d025b","colab":{"base_uri":"https://localhost:8080/"}},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["3749826"]},"metadata":{},"execution_count":12}]}]} \ No newline at end of file diff --git a/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2023.ipynb b/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2023.ipynb new file mode 100644 index 0000000..c4b20ab --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/oscar/notebook/OSCAR2023.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"mount_file_id":"16IexGnh-wFticZ78PVg9htbXeB_EJ725","authorship_tag":"ABX9TyMr2j000KPyQamGtr0eQqJS"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"3f626cb4922249aeba4021c875d1734e":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_ee91bb3176ec4a6085e855b00b4dac4c","IPY_MODEL_db00d004ed32496d861a0ecb0e8b8d40","IPY_MODEL_66069d1ec18c42bd92e71d9a69c9677a"],"layout":"IPY_MODEL_7674f31544864e63a6bc4b592249c04d"}},"ee91bb3176ec4a6085e855b00b4dac4c":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_7a650cc1bcf841ddb57f19eec183a460","placeholder":"​","style":"IPY_MODEL_fb731c9ac53440f1afd3790cb56d36ee","value":"Downloading (…)okenizer_config.json: 100%"}},"db00d004ed32496d861a0ecb0e8b8d40":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_f2592ae026d849b3b82f86a0bc231b5d","max":376,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ca12be2b8ba5452dba77e26e8b1949a6","value":376}},"66069d1ec18c42bd92e71d9a69c9677a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_cab20ea43f8b4025ad21988fee2c836d","placeholder":"​","style":"IPY_MODEL_6cf636ed6d5640f99e16d80f1516ec52","value":" 376/376 [00:00<00:00, 11.9kB/s]"}},"7674f31544864e63a6bc4b592249c04d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7a650cc1bcf841ddb57f19eec183a460":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fb731c9ac53440f1afd3790cb56d36ee":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f2592ae026d849b3b82f86a0bc231b5d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ca12be2b8ba5452dba77e26e8b1949a6":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"cab20ea43f8b4025ad21988fee2c836d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6cf636ed6d5640f99e16d80f1516ec52":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"4d3a56e34a634fc3aaae717e177a8aaf":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_ef69334a669a41cf98b56967b320501e","IPY_MODEL_0f552552ae76476eb073aa21a1e9d2d5","IPY_MODEL_6c9be2ae05714b5788294077e685672d"],"layout":"IPY_MODEL_5d4c929b03044ef3924cb45578e09441"}},"ef69334a669a41cf98b56967b320501e":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_76c362a033384c049256f39532d1c462","placeholder":"​","style":"IPY_MODEL_af450da8a1e64c4ba8ed24c35e9e6b56","value":"Downloading (…)lve/main/config.json: 100%"}},"0f552552ae76476eb073aa21a1e9d2d5":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_78647a3e1f544182899e93ba41729f2a","max":702,"min":0,"orientation":"horizontal","style":"IPY_MODEL_42ebbecd93cb4c28b1b124528574eab9","value":702}},"6c9be2ae05714b5788294077e685672d":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_cbb4151ada7f40f7a9ac52bce1d90e82","placeholder":"​","style":"IPY_MODEL_5959a304279e48dc95526b667cd9785b","value":" 702/702 [00:00<00:00, 26.0kB/s]"}},"5d4c929b03044ef3924cb45578e09441":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"76c362a033384c049256f39532d1c462":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"af450da8a1e64c4ba8ed24c35e9e6b56":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"78647a3e1f544182899e93ba41729f2a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"42ebbecd93cb4c28b1b124528574eab9":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"cbb4151ada7f40f7a9ac52bce1d90e82":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5959a304279e48dc95526b667cd9785b":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"735703cd69254029b25f5db5847295b4":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_88616920fc3242de8941ed75200798b9","IPY_MODEL_937fddb414c64f3ea9a67c169a4ec186","IPY_MODEL_8a61cbd79fd744acb6cfefe4a73f30b6"],"layout":"IPY_MODEL_4ed80032f22743e0bcc8b31aa4d5659f"}},"88616920fc3242de8941ed75200798b9":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6dd6a6a6b4834183a2411f9d5b4670af","placeholder":"​","style":"IPY_MODEL_3fbd4f170fdf416fa29f72bb9acc2569","value":"Downloading (…)ve/main/spiece.model: 100%"}},"937fddb414c64f3ea9a67c169a4ec186":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_e5314e34ed75496dab56ccff3b31cfde","max":4309802,"min":0,"orientation":"horizontal","style":"IPY_MODEL_99850141d4824a04a9f436e53af2608c","value":4309802}},"8a61cbd79fd744acb6cfefe4a73f30b6":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_a5105f20616c49d8b70c7fbe52d4327a","placeholder":"​","style":"IPY_MODEL_e0d5bfdbe7e34c51bf91f6b6d9a4a5bf","value":" 4.31M/4.31M [00:00<00:00, 15.4MB/s]"}},"4ed80032f22743e0bcc8b31aa4d5659f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6dd6a6a6b4834183a2411f9d5b4670af":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3fbd4f170fdf416fa29f72bb9acc2569":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"e5314e34ed75496dab56ccff3b31cfde":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"99850141d4824a04a9f436e53af2608c":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"a5105f20616c49d8b70c7fbe52d4327a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e0d5bfdbe7e34c51bf91f6b6d9a4a5bf":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"a5ee3ba316f345f4ad0aa30eb61ee9b0":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_f3f9caef1bfe46dab167aa070313344a","IPY_MODEL_6a366fd60aed497db80684a1c5c277b8","IPY_MODEL_f46a301ce7af4056b437667568906608"],"layout":"IPY_MODEL_088709794ed448908137d429026c8e76"}},"f3f9caef1bfe46dab167aa070313344a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_8aa460fa88d0403a9b516f23629d328c","placeholder":"​","style":"IPY_MODEL_c317607ed6c74631b68b0c00bdfc5beb","value":"Downloading (…)cial_tokens_map.json: 100%"}},"6a366fd60aed497db80684a1c5c277b8":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_54ae26b703864fc68f64a6e642c734c0","max":65,"min":0,"orientation":"horizontal","style":"IPY_MODEL_487c6ff76a4e455b8709392fff926486","value":65}},"f46a301ce7af4056b437667568906608":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c228bcc401c74da5b091145073575246","placeholder":"​","style":"IPY_MODEL_40b02d60f3ae4eb08ad6953a22c3d095","value":" 65.0/65.0 [00:00<00:00, 2.65kB/s]"}},"088709794ed448908137d429026c8e76":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8aa460fa88d0403a9b516f23629d328c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c317607ed6c74631b68b0c00bdfc5beb":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"54ae26b703864fc68f64a6e642c734c0":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"487c6ff76a4e455b8709392fff926486":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c228bcc401c74da5b091145073575246":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"40b02d60f3ae4eb08ad6953a22c3d095":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2d0bc02118bd4d4dafd185a805631af5":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_d5d6639d6c8c448393ef2a41d867db6a","IPY_MODEL_67c212d756904833b13a27c42c07dc0a","IPY_MODEL_7826f11b4bb34b8990f735ef39314512"],"layout":"IPY_MODEL_597b5d7a3901437cb8221fb35aa8ab9d"}},"d5d6639d6c8c448393ef2a41d867db6a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b2b930617cce48849f98e32232d2bb82","placeholder":"​","style":"IPY_MODEL_de85811896e748d383a79c8cb69a9eec","value":"Downloading builder script: 100%"}},"67c212d756904833b13a27c42c07dc0a":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_239be0b57f3e46809eb800b6a7b789db","max":22336,"min":0,"orientation":"horizontal","style":"IPY_MODEL_b8f24a43208e4d68b75aab441e175183","value":22336}},"7826f11b4bb34b8990f735ef39314512":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6072427e42db4718b9ba58b054da56ea","placeholder":"​","style":"IPY_MODEL_8268c24f421e49d88d174f1842c2e6f2","value":" 22.3k/22.3k [00:00<00:00, 1.23MB/s]"}},"597b5d7a3901437cb8221fb35aa8ab9d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b2b930617cce48849f98e32232d2bb82":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"de85811896e748d383a79c8cb69a9eec":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"239be0b57f3e46809eb800b6a7b789db":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b8f24a43208e4d68b75aab441e175183":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"6072427e42db4718b9ba58b054da56ea":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8268c24f421e49d88d174f1842c2e6f2":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"1d103c8cd4f64679a5ca2c844c8bd8b9":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_1376fdecc0ac4c628ccbad192a0ef2f4","IPY_MODEL_ded15fd46a9b42c68c86e7b1e47aa836","IPY_MODEL_d7f51824d4b64cca8a9d1e573d53acc1"],"layout":"IPY_MODEL_fd6a47cb55114a19a84a3c8ba122aad5"}},"1376fdecc0ac4c628ccbad192a0ef2f4":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9fd926e634874dd380d24a07f6a76c19","placeholder":"​","style":"IPY_MODEL_2f8f2f0458fb4b7a84d53f086d53ef6f","value":"Downloading readme: 100%"}},"ded15fd46a9b42c68c86e7b1e47aa836":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_fa3772c5117042cda6cc9db9cc990486","max":37423,"min":0,"orientation":"horizontal","style":"IPY_MODEL_e200ad84ccdc437e92cd6185a6d25295","value":37423}},"d7f51824d4b64cca8a9d1e573d53acc1":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c91d9f193cac472a89c76a9ab68722d9","placeholder":"​","style":"IPY_MODEL_ae20951da57340429a1cd93264a89d98","value":" 37.4k/37.4k [00:00<00:00, 1.30MB/s]"}},"fd6a47cb55114a19a84a3c8ba122aad5":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9fd926e634874dd380d24a07f6a76c19":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2f8f2f0458fb4b7a84d53f086d53ef6f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"fa3772c5117042cda6cc9db9cc990486":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e200ad84ccdc437e92cd6185a6d25295":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c91d9f193cac472a89c76a9ab68722d9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ae20951da57340429a1cd93264a89d98":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"cells":[{"cell_type":"code","execution_count":1,"metadata":{"id":"Fs-SsXoIw2Kx","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1682843577226,"user_tz":-420,"elapsed":57830,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"f27ac9c3-5a60-43c1-e714-fe5d4a00a7d8"},"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting datasets\n"," Downloading datasets-2.12.0-py3-none-any.whl (474 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m474.6/474.6 kB\u001b[0m \u001b[31m23.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting responses<0.19\n"," Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n","Collecting xxhash\n"," Downloading xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m212.5/212.5 kB\u001b[0m \u001b[31m15.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting huggingface-hub<1.0.0,>=0.11.0\n"," Downloading huggingface_hub-0.14.1-py3-none-any.whl (224 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.5/224.5 kB\u001b[0m \u001b[31m29.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pyarrow>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (9.0.0)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (6.0)\n","Collecting dill<0.3.7,>=0.3.0\n"," Downloading dill-0.3.6-py3-none-any.whl (110 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.5/110.5 kB\u001b[0m \u001b[31m14.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (2.27.1)\n","Collecting multiprocess\n"," Downloading multiprocess-0.70.14-py310-none-any.whl (134 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.3/134.3 kB\u001b[0m \u001b[31m18.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from datasets) (23.1)\n","Requirement already satisfied: fsspec[http]>=2021.11.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (2023.4.0)\n","Requirement already satisfied: tqdm>=4.62.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (4.65.0)\n","Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets) (1.5.3)\n","Collecting aiohttp\n"," Downloading aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m61.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (1.22.4)\n","Collecting frozenlist>=1.1.1\n"," Downloading frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (149 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m149.6/149.6 kB\u001b[0m \u001b[31m18.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting async-timeout<5.0,>=4.0.0a3\n"," Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n","Collecting aiosignal>=1.1.2\n"," Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n","Collecting yarl<2.0,>=1.0\n"," Downloading yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (268 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m268.8/268.8 kB\u001b[0m \u001b[31m27.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting multidict<7.0,>=4.5\n"," Downloading multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.5/114.5 kB\u001b[0m \u001b[31m14.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (23.1.0)\n","Requirement already satisfied: charset-normalizer<4.0,>=2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (2.0.12)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (3.12.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (4.5.0)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (3.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (2022.12.7)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (1.26.15)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2022.7.1)\n","Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2.8.2)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas->datasets) (1.16.0)\n","Installing collected packages: xxhash, multidict, frozenlist, dill, async-timeout, yarl, responses, multiprocess, huggingface-hub, aiosignal, aiohttp, datasets\n","Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 datasets-2.12.0 dill-0.3.6 frozenlist-1.3.3 huggingface-hub-0.14.1 multidict-6.0.4 multiprocess-0.70.14 responses-0.18.0 xxhash-3.2.0 yarl-1.9.2\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting transformers\n"," Downloading transformers-4.28.1-py3-none-any.whl (7.0 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.0/7.0 MB\u001b[0m \u001b[31m101.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: huggingface-hub<1.0,>=0.11.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.14.1)\n","Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.22.4)\n","Collecting tokenizers!=0.11.3,<0.14,>=0.11.1\n"," Downloading tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.8/7.8 MB\u001b[0m \u001b[31m120.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n","Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n","Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n","Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (2023.4.0)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n","Installing collected packages: tokenizers, transformers\n","Successfully installed tokenizers-0.13.3 transformers-4.28.1\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (4.3.1)\n","Requirement already satisfied: numpy>=1.18.5 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.22.4)\n","Requirement already satisfied: scipy>=1.7.0 in /usr/local/lib/python3.10/dist-packages (from gensim) (1.10.1)\n","Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim) (6.3.0)\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting pythainlp\n"," Downloading pythainlp-4.0.0-py3-none-any.whl (13.4 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.4/13.4 MB\u001b[0m \u001b[31m74.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: requests>=2.22.0 in /usr/local/lib/python3.10/dist-packages (from pythainlp) (2.27.1)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (3.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2022.12.7)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (1.26.15)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2.0.12)\n","Installing collected packages: pythainlp\n","Successfully installed pythainlp-4.0.0\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting pyLDAvis\n"," Downloading pyLDAvis-3.4.1-py3-none-any.whl (2.6 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m71.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.2.0)\n","Collecting pandas>=2.0.0\n"," Downloading pandas-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.3/12.3 MB\u001b[0m \u001b[31m52.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: scikit-learn>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.2.2)\n","Collecting funcy\n"," Downloading funcy-2.0-py2.py3-none-any.whl (30 kB)\n","Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (1.10.1)\n","Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (67.7.2)\n","Requirement already satisfied: numexpr in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (2.8.4)\n","Requirement already satisfied: gensim in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (4.3.1)\n","Collecting numpy>=1.24.2\n"," Downloading numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m17.3/17.3 MB\u001b[0m \u001b[31m21.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from pyLDAvis) (3.1.2)\n","Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2023.3)\n","Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2.8.2)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=2.0.0->pyLDAvis) (2022.7.1)\n","Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0.0->pyLDAvis) (3.1.0)\n","Requirement already satisfied: smart-open>=1.8.1 in /usr/local/lib/python3.10/dist-packages (from gensim->pyLDAvis) (6.3.0)\n","Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->pyLDAvis) (2.1.2)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas>=2.0.0->pyLDAvis) (1.16.0)\n","Installing collected packages: funcy, numpy, pandas, pyLDAvis\n"," Attempting uninstall: numpy\n"," Found existing installation: numpy 1.22.4\n"," Uninstalling numpy-1.22.4:\n"," Successfully uninstalled numpy-1.22.4\n"," Attempting uninstall: pandas\n"," Found existing installation: pandas 1.5.3\n"," Uninstalling pandas-1.5.3:\n"," Successfully uninstalled pandas-1.5.3\n","\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n","tensorflow 2.12.0 requires numpy<1.24,>=1.22, but you have numpy 1.24.3 which is incompatible.\n","numba 0.56.4 requires numpy<1.24,>=1.18, but you have numpy 1.24.3 which is incompatible.\n","google-colab 1.0.0 requires pandas~=1.5.3, but you have pandas 2.0.1 which is incompatible.\u001b[0m\u001b[31m\n","\u001b[0mSuccessfully installed funcy-2.0 numpy-1.24.3 pandas-2.0.1 pyLDAvis-3.4.1\n","Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting sentencepiece\n"," Downloading sentencepiece-0.1.98-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m48.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: sentencepiece\n","Successfully installed sentencepiece-0.1.98\n"]}],"source":["!pip install datasets\n","!pip install transformers\n","!pip install gensim\n","!pip install pythainlp\n","!pip install pyLDAvis\n","!pip install sentencepiece"]},{"cell_type":"code","source":["!huggingface-cli login\n","# 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"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7YkUkFRK_qq2","executionInfo":{"status":"ok","timestamp":1682843589298,"user_tz":-420,"elapsed":12078,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"3d53f7cf-e565-4842-8434-c8aa95976278"},"execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["\n"," _| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|\n"," _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n"," _|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|\n"," _| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n"," _| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|\n"," \n"," To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .\n","Token: \n","Add token as git credential? (Y/n) n\n","Token is valid.\n","Your token has been saved to /root/.cache/huggingface/token\n","Login successful\n"]}]},{"cell_type":"code","source":["!pip install zstandard"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"TfFettXTCro3","executionInfo":{"status":"ok","timestamp":1682843599271,"user_tz":-420,"elapsed":6773,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"545f0725-f1ee-4931-e44a-6ddf007baa79"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting zstandard\n"," Downloading zstandard-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 MB\u001b[0m \u001b[31m82.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: zstandard\n","Successfully installed zstandard-0.21.0\n"]}]},{"cell_type":"code","source":["from datasets import load_dataset \n","\n","dataset= load_dataset(\"oscar-corpus/OSCAR-2301\",use_auth_token=True,language=\"th\",split='train',streaming=True)"],"metadata":{"id":"M5E5aa3UxbXR","executionInfo":{"status":"ok","timestamp":1682843608218,"user_tz":-420,"elapsed":8951,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/","height":81,"referenced_widgets":["2d0bc02118bd4d4dafd185a805631af5","d5d6639d6c8c448393ef2a41d867db6a","67c212d756904833b13a27c42c07dc0a","7826f11b4bb34b8990f735ef39314512","597b5d7a3901437cb8221fb35aa8ab9d","b2b930617cce48849f98e32232d2bb82","de85811896e748d383a79c8cb69a9eec","239be0b57f3e46809eb800b6a7b789db","b8f24a43208e4d68b75aab441e175183","6072427e42db4718b9ba58b054da56ea","8268c24f421e49d88d174f1842c2e6f2","1d103c8cd4f64679a5ca2c844c8bd8b9","1376fdecc0ac4c628ccbad192a0ef2f4","ded15fd46a9b42c68c86e7b1e47aa836","d7f51824d4b64cca8a9d1e573d53acc1","fd6a47cb55114a19a84a3c8ba122aad5","9fd926e634874dd380d24a07f6a76c19","2f8f2f0458fb4b7a84d53f086d53ef6f","fa3772c5117042cda6cc9db9cc990486","e200ad84ccdc437e92cd6185a6d25295","c91d9f193cac472a89c76a9ab68722d9","ae20951da57340429a1cd93264a89d98"]},"outputId":"de413971-05c3-4622-f14b-50d665013647"},"execution_count":4,"outputs":[{"output_type":"display_data","data":{"text/plain":["Downloading builder script: 0%| | 0.00/22.3k [00:0050000:\n"," break\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"duafs9DpuDhi","executionInfo":{"status":"ok","timestamp":1682843674867,"user_tz":-420,"elapsed":66655,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"75fa4ad8-4aeb-4d4f-836b-5319bed4b7ff"},"execution_count":5,"outputs":[{"output_type":"stream","name":"stderr","text":["50000it [01:06, 747.09it/s]\n"]}]},{"cell_type":"code","source":["import pandas as pd \n","df = pd.DataFrame(oscar22)"],"metadata":{"id":"OX2k-fb2xC80","executionInfo":{"status":"ok","timestamp":1682843674868,"user_tz":-420,"elapsed":5,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}}},"execution_count":6,"outputs":[]},{"cell_type":"code","source":["df[\"text\"].apply(len).describe()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"_PEiEGpHezIW","executionInfo":{"status":"ok","timestamp":1682612105128,"user_tz":-420,"elapsed":1426,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"6a5c791b-b84c-42ac-9988-d5d8f67a4717"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["count 50001.000000\n","mean 4964.246935\n","std 12322.922336\n","min 101.000000\n","25% 581.000000\n","50% 2412.000000\n","75% 5398.000000\n","max 332942.000000\n","Name: text, dtype: float64"]},"metadata":{},"execution_count":7}]},{"cell_type":"code","source":["!pip install pythainlp"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"RlGueQVfMVU8","executionInfo":{"status":"ok","timestamp":1682875460849,"user_tz":-420,"elapsed":10840,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"980d7f5d-8631-477c-db7e-ad7cfd5f4620"},"execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting pythainlp\n"," Downloading pythainlp-4.0.0-py3-none-any.whl (13.4 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.4/13.4 MB\u001b[0m \u001b[31m60.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: requests>=2.22.0 in /usr/local/lib/python3.10/dist-packages (from pythainlp) (2.27.1)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2022.12.7)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (1.26.15)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (3.4)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2.0.12)\n","Installing collected packages: pythainlp\n","Successfully installed pythainlp-4.0.0\n"]}]},{"cell_type":"code","source":["import re\n","from pythainlp.util import countthai\n","\n","def check_containing_bad_keywords(text):\n","\n"," porn_keywords =[\"คลิปหลุด\",\"กระเจี๊ยว\",\"คลิปโป๊\",\"หนังโป๊\",\"หนังโป้\",\"หนังโป็\",\"เรื่องเสียว\",\"ซอยหี\",\"ชักว่าว\",\"ท่าหมา\",\"ขย่มควย\",\"เล่นเสียว\",\"ควยใหญ่\",\"หนังเอ็กซ์\",\"แหกหี\"]\n"," gamble_keywords = [\"ufabet\",\"UFABET\",\"ล้มโต๊ะ\", \"เซียนสเต็ป\",\"บอลเต็ง\",\"แทงบอล\",\"คาสิโน\",\"บาคาร่า\",\"เว็บสล็อต\",\"เกมสล็อต\",\"สล็อตออนไลน์\",\"คาสิโนออนไลน์\",\n"," \"หวยมาเลย์\", \"หวยฮานอย\", \"น้ำเต้าปูปลา\", \"หวยออนไลน์\" , \"แทงหวย\" , \"หวยหุ้น\", \"ยิงปลาออนไลน์\" ,\"ได้เงินจริง\",\"บา คา ร่า\"]\n"," movie_keywords =[\"ดูหนังออนไลน์\",\"หนังออนไลน์\",\"เว็บดูหนัง\",\"หนังชนโรง\",\"หนังใหม่ชนโรง\",\"เสียงไทย\",\"เสียงญี่ปุ่น\",\"เสียงอังกฤษ\"]\n"," like_keywords = [\"ปั้มไลค์\",\"รับจ้างกดไลค์\",\"จ้างไลค์\",\"ปั๊มไลค์\",\"ปั่นไลค์\",\"เพิ่มไลค์\",\"ซื้อไลค์\"]\n"," code_keywords =[\"padding:\",\"display:\",\"S3=n8\",\"phpBB Debug\",\"getElementById\",\"innerHTML\",\"parseInt\",\"addEventListener\",\"console\\.log\",\"checkCookieForTarget\",\"setAttribute\",\"getItem\",\"if \\(\",\"else {\",\"JSON\\.stringify\",\"onclick\"]\n","\n"," ratchakarn_website_keywords = [\"คุณกำลังใช้งานแบบปิดการใช้ Javascript\",\"Longdo Dictionary\",\"นโยบายการคุ้มครองข้อมูลส่วนบุคคล\",\"เงื่อนไขการให้บริการเว็บไซต์\",\"นโยบายความปลอดภัย\",\"นโยบายเว็บไซต์และการปฏิเสธความรับผิด\",\"คุณอาจจะยังไม่ได้เข้าสู่ระบบหรือยังไม่ได้ลงทะเบียน\",\"คุณไม่ได้เข้าสู่ระบบหรือคุณไม่มีสิทธิ์เข้าหน้านี้\"]\n","\n"," porn_keywords += [\" \".join(list(kw)) for kw in porn_keywords]\n"," gamble_keywords += [\" \".join(list(kw)) for kw in gamble_keywords]\n"," movie_keywords += [\" \".join(list(kw)) for kw in movie_keywords]\n","\n"," bad_keywords = porn_keywords + gamble_keywords + movie_keywords + like_keywords + code_keywords + ratchakarn_website_keywords\n","\n"," sparse_bad_keywords = []\n","\n"," pattern = '|'.join(bad_keywords) \n"," return bool(re.search(pattern, text))\n","\n","def check_ratio_bad_substring(text,n):\n"," month_to_count = [\"มกราคม\",\"กุมภาพันธ์\",\"มีนาคม\",\"เมษายน\",\"พฤษภาคม\",\"มิถุนายน\",\"กรกฎาคม\",\"สิงหาคม\",\"กันยายน\",\"ตุลาคม\",\"พฤศจิกายน\",\"ธันวาคม\",\n"," \"ม\\.ค\\.\",\"ก\\.พ\\.\",\"มี\\.ค\\.\",\"เม\\.ย\\.\",\"พ\\.ค\\.\",\"มิ\\.ย\\.\",\"ก\\.ค\\.\",\"ส\\.ค\\.\",\"ก\\.ย\\.\",\"ต\\.ค\\.\",\"พ\\.ย\\.\",\"ธ\\.ค\\.\"]\n"," special_to_count = [\"\\{\",\"\\+\",\"\\}\",\"/\",\":\"]\n","\n"," if len(re.findall(\"|\".join(month_to_count),text))/n > 0.015:\n"," return \"\"\n","\n"," if len(re.findall(\"|\".join(special_to_count),text))/n > 0.075:\n"," return \"\"\n","\n"," if len(re.findall(\" \",text))/n > 0.13:\n"," return \"\"\n","\n"," if len(re.findall(\",\",text))/n > 0.05:\n"," return \"\"\n","\n","def remove_bad_substring(text):\n"," to_replace_keywords = [\"Posted on\",\"Posted by\",\"Posted by:\",\"Posted By:\",\"สมาชิกหมายเลข [0-9,]+\",\"อ่าน [0-9,]+ ครั้ง\",\"เปิดดู [0-9,]+ ครั้ง\",\"ดู [0-9,]+ ครั้ง\",\"คะแนนสะสม: [0-9,]+ แต้ม\",\"ความคิดเห็น: [0-9,]+\",\n"," \"[0-9,]+ บุคคลทั่วไป กำลังดูบอร์ดนี้\",\"หน้าที่แล้ว ต่อไป\",\"ความคิดเห็นที่ [0-9,]+\",\"[0-9,]+ สมาชิก และ [0-9,]+ บุคคลทั่วไป\",\"กำลังดูหัวข้อนี้\",\"เข้าสู่ระบบด้วยชื่อผู้ใช้\",\n"," \"แสดงกระทู้จาก:\",\"กระทู้: [0-9,]+\",\"เว็บไซต์เรามีการใช้คุกกี้และเก็บข้อมูลผู้ใช้งาน โปรดศึกษาและยอมรับ นโยบายคุ้มครองข้อมูลส่วนบุคคล ก่อนใช้งาน\",\n"," \"Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use\\.\",\n"," \"Previous\\t\\nNext\\nLeave a Reply Cancel reply\\nYou must be logged in to post a comment.\\nSearch for:\\nFeatured Post\\n\",\n"," \"Click to read more\\nYou must be logged in to view or write comments\\.\",\"[0-9,]+ Views\",\"Skip to content\",\"Last Modified Posts\",\"Last Updated:\",\n"," \"\\(อ่าน [0-9,]+ ครั้ง\\)\",\"Recent Comments\",\"«.*?»\",\"< --แสดงทั้งหมด-- >\",\"นโยบายความเป็นส่วนตัว\",\"เงื่อนไขการใช้เว็บไซต์\",\"ตั้งค่าคุกกี้\",\"ท่านยอมรับให้เว็บไซต์นี้จัดเก็บคุกกี้เพื่อประสบการณ์การใช้งานเว็บไซต์ที่ดียิ่งขึ้น\",\n"," \"รวมถึงช่วยให้ท่านมีโอกาสได้รับข้อเสนอหรือเนื้อหาที่ตรงตามความสนใจของท่าน\",\"ท่านสามารถดู Privacy Notice ของเว็บไซต์เรา ได้ที่นี่\",\"You may be trying to access this site from a secured browser on the server. Please enable scripts and reload this page.\",\n"," \"เผยแพร่: \\d\\d [ก-๙]+ \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Last updated: \\d\\d [ก-๙]+\\.[ก-๙]+\\. \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\.\",\n"," \"Search for:\",\"Save my name, email, and website in this browser for the next time I comment\",\"Your email address will not be published. Required fields are marked\",\n"," \"Leave a Reply Cancel reply\",\"((?:หน้าหลัก|เข้าสู่ระบบ|หน้าแรก) \\|(?: .+(?:(?: \\|)|$))+)\",\"กลับหน้าแรก\",\"ติดต่อเรา\",\"Contact Us\",\"#\\w+\",\"ติดต่อผู้ดูแลเว็บไซต์\",\n"," \"หากท่านพบว่ามีข้อมูลใดๆที่ละเมิดทรัพย์สินทางปัญญาปรากฏอยู่ในเว็บไซต์โปรดแจ้งให้ทราบ\",\"No related posts\",\"Posted in\",\"((?:Tags:|Tagged|Tag) (?:.{1,40}(?:,|\\n|$))+)\",\"ตอบ:\",\"Sort by:\",\n"," \"All rights reserved\",\"ความยาวอย่างน้อย\",\"ระบบได้ดำเนินการส่ง OTP\",\"เป็นสมาชิกอยู่แล้ว\\?\",\"We use cookies\",\"Cookie Settings\",\n"," \"Homeหน้าหลัก\", \"Home หน้าหลัก\", \"ข่าวสารล่าสุด\", \"ปัญหา การใช้งาน\", \"ปัญหาการใช้งาน\" \"ผู้เขียน\" ,\"หัวข้อ:\" ,\"\\*\\* พร้อมส่ง \\*\\*\"]\n"," \n"," return re.sub(\"|\".join(to_replace_keywords),\"\",text)\n","\n","def clean_text(text):\n","\n"," n=len(text)\n"," \n"," if check_containing_bad_keywords(text) or check_ratio_bad_substring(text,n) or countthai(text)<50:\n"," # if check_containing_bad_keywords(text) or countthai(text)<0.5:\n"," return \"\"\n"," \n"," text= remove_bad_substring(text)\n","\n"," # not sure if we should normalize\n"," #text = normalize(text)\n","\n"," return text\n"],"metadata":{"id":"4w_qgPToxVla","executionInfo":{"status":"ok","timestamp":1682875464939,"user_tz":-420,"elapsed":4092,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}}},"execution_count":3,"outputs":[]},{"cell_type":"code","source":["text = \"\"\"« อ่านบทกวีชิงซีไรต์…ไปพร้อมๆ กับกรรมการ: ภาค Longlist พ.ศ. ๒๕๖๒อ่านรวมเรื่องสั้นชิงรางวัลซีไรต์ . . . ไปพร้อมๆ กับกรรมการ พ.ศ. ๒๕๖๓ »\"\"\"\n","remove_bad_substring(text)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":35},"id":"yYAa49fOMD4f","executionInfo":{"status":"ok","timestamp":1682875592144,"user_tz":-420,"elapsed":10,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"ebd63460-4856-43fb-d0fa-38fd370c90ff"},"execution_count":6,"outputs":[{"output_type":"execute_result","data":{"text/plain":["''"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":6}]},{"cell_type":"code","source":["tqdm.pandas()\n","df[\"clean_text\"] = df[\"text\"].progress_apply(clean_text)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9dbZMc6_e38E","executionInfo":{"status":"ok","timestamp":1682843830318,"user_tz":-420,"elapsed":106298,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"5b431dc5-e12d-46cf-83c3-13c8d0470f0f"},"execution_count":8,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 50001/50001 [01:46<00:00, 470.94it/s]\n"]}]},{"cell_type":"code","source":["\"Mar 13, 2021 Admin\""],"metadata":{"id":"D_4A7GcJUbAz"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["c=0\n","for i in df[df[\"clean_text\"]!=\"\"].sample(20)[\"clean_text\"]:\n"," print(\"doc\",c)\n"," print(i)\n"," print()\n"," c+=1"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"iKCuLNmkT57m","executionInfo":{"status":"ok","timestamp":1682844228365,"user_tz":-420,"elapsed":17,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"94719147-3a04-42ba-ccbc-55d34a96532f"},"execution_count":15,"outputs":[{"output_type":"stream","name":"stdout","text":["doc 0\n","เกี่ยวกับเว็บไซต์นี้ |beste online kasino 400 bonus| พาร์ทเนอร์ |บริการโฆษณา |เงื่อนไขการใช้งาน |คู่มือการส่ง | นายหน้า | | คำแถลงทางกฎหมาย |แผนผังเว็บไซต์ | ประวัติศาสตร์\n","เนื้อหาของเว็บไซต์นี้ถูกเก็บรวบรวมบนแพลตฟอร์มอื่น ๆ ของอินเทอร์เน็ตหากคุณไม่พอใจโปรดในเวลา (ลบผู้ติดต่อไม่ถูกต้องขอขอบคุณสำหรับการสนับสนุนความคืบหน้าของฉันจะร่วมมือกับคุณ) และสัญญาว่าจะลบภายใน 24 ชั่วโมง\n","เว็บไซต์นี้(rw6.pctyvo.icu)ให้ข้อมูลเกี่ยวกับ(Free register peluang italia di piala dunia 2022)เนื้อหา\n","\n","doc 1\n","หลังจากได้แนะนำหนังสือกวีนิพนธ์ทั้ง ๑๐ เล่ม ซึ่งผ่านการคัดเลือกถึงรอบ Longlist การประกวดรางวัลวรรณกรรมสร้างสรรค์ยอดเยี่ยมแห่งอาเซียน หรือ ซีไรต์ ประจำปี พ.ศ. ๒๕๖๒ กันไปแล้ว ในคราวนี้ก็ถึงโอกาสได้แนะนำหนังสือกวีนิพนธ์อีก ๘ เล่มที่ผ่านเข้าสู่รอบสุดท้าย เพื่อให้คณะกรรมการตัดสินได้พิจารณาต่อไปว่าเล่มใดเหมาะสมและคู่ควรกับการประทับตรารางวัลซีไรต์มากที่สุด\n","และขอชี้แจงเช่นเดิมว่าการประกวดในรอบปี พ.ศ. ๒๕๖๒ นี้ ‘กัลปพฤกษ์’ ได้รับเชิญไปร่วมเป็นกรรมการรอบคัดเลือก เพื่อเฟ้นสรรงานกวีนิพนธ์ที่ส่งประกวดจำนวน ๖๖ เล่ม เข้าสู่รอบ Longlist และ Shortlist ด้วย ดังนั้นโดยมารยาทแล้วการเขียนถึงผลงานที่เข้ารอบ Shortlist รางวัลซีไรต์ในครั้งนี้ จะไม่ขอเขียนในลักษณะการวิจารณ์เต็มรูปแบบ แต่จะเขียนในเชิงรีวิว แนะนำหนังสือกวีนิพนธ์ที่ผ่านเข้ารอบแต่ละเล่มว่ามี เนื้อหา ลีลา และความโดดเด่น ในแง่ใดกันบ้าง โดยมีจุดประสงค์เพื่อชักชวนให้ผู้ที่สนใจ ได้ลองหามาอ่านและแสดงทรรศนะขนานไปกับคณะกรรมการ สร้างบรรยากาศการอ่านงานกวีนิพนธ์ให้คึกคักไม่แพ้บทประพันธ์ประเภทอื่น ๆ เช่น นวนิยาย หรือรวมเรื่องสั้นเลย\n","สำหรับหนังสือกวีนิพนธ์ที่ผ่านเข้าสู่รอบ Shortlist รางวัลซีไรต์ประจำปี พ.ศ. ๒๕๖๒ มีรายชื่อตามลำดับตัวอักษรดังนี้\n","๑. การสำเร็จความโง่ด้วยตนเอง โดย ธัชชัย ธัญญาวัลย\n","(สำนักพิมพ์อาร์ตี้เฮ้าส์ พิมพ์ครั้งที่สอง เพิ่มเติมเนื้อหา)\n","การสำเร็จความโง่ด้วยตนเอง เป็นงานกวีนิพนธ์ที่น่าจะสดแปลกแหวกแนวและล้ำสมัยที่สุดในบรรดากวีนิพนธ์ที่ผ่านเข้ารอบสุดท้ายมาในปีนี้ ประกอบไปด้วยบทกวีไร้ฉันทลักษณ์ ที่ ธัชชัย ธัญญาวัลย อธิบายความหมายของถ้อยคำต่าง ๆ เช่น ‘ความเป็นจริง’ ‘ศีลธรรม’ ‘ความผิดบาป’ ‘ความย้อนแย้ง’ ‘ความสำเร็จ’ ‘ความสมบูรณ์’ ‘ความเกรี้ยวกราด’ ‘ความผิดหวัง’ ในลักษณะของการถกปรัชญา เพื่อสะท้อนว่า นิยามเหล่านี้ ไม่เคยมีข้อตกลงที่ตายตัวหรือเที่ยงแท้ว่าควรจะแปลความหมายออกมาทางใด แต่ละคนก็อาจมีมุมมองต่อคำ ๆ เดียวกันที่แตกต่างหลากหลายได้ แถมในบางครั้งความหมายก็อาจย้อนแย้งกลับไปกลับมา สร้างภาวะแบบปฏิทรรศน์ หรือ paradox ที่ชวนให้รู้สึกว่า แท้แล้วสองสิ่งซึ่งเราเคยเข้าใจว่าเป็นคู่ขั้วตรงข้ามกัน อาจมีต้นกำเนิดมาจากสิ่งเดียวกันก็เป็นได้ เช่น ในบท “เมื่อกล่าวถึง ความเกลียดชัง”\n","ในเหง้าที่งอกหน่อแห่งความรัก\n","ออกมาเป็นลำต้น กิ่ง ใบ และ ดอก ผล\n","คือเหง้าเดียวกับที่งอกหน่อแห่งความเกลียดชัง\n","เมื่อความเกลียดชังได้เติบโตขึ้น\n","จนบางครั้งเบียดเบียนความรัก\n","เราก็จะเป็นผู้ที่มีความเกลียดชัง\n","ลำต้น กิ่ง ใบ และ ดอก ผล\n","ของความเกลียดชัง\n","ย่อมสะพรั่งพร้อมแสดงปาฏิหาริย์…\n","ลีลายุกยิกยียวนก่อกวนทุกขนบดั้งเดิมในแบบหลังสมัยใหม่หรือ post-modernism ของกวีนิพนธ์เล่มนี้ ได้สะท้อนมุมมองความคิดแบบคนร่วมสมัย ที่อาศัยคำกลอนอิสระมาเป็นเครื่องมือในการถ่ายทอด ผ่านวรรณศิลป์ภาษาที่พยายามสื่อประเด็นความคิดอย่างตรงไปตรงมา ไม่มุ่งเน้นการประดิดประดอย มีการใช้สัญลักษณ์หรือวิธีการบุคลาธิษฐานอยู่บ้าง หากจินตภาพที่ได้จะสอดคล้องกับมุมมองที่กวีต้องการจริง ๆ เช่นในบท “เมื่อกล่าวถึง ความโง่เขลา”\n","เมื่อเราปรารถนาจะออกจากความโง่เขลา\n","ความโง่เขลาที่เราเผชิญหน้าอยู่\n","ก็จ้องลึกเข้ามาในดวงตาของเรา\n","ราวกับจะถามว่า\n","แน่ใจแล้วหรือ\n","และเมื่อเรากะพริบตา…\n","อย่างโง่เขลา\n","เพียงเท่านั้น\n","ความโง่เขลาก็กลายร่างเป็นความฉลาด…\n","ได้อ่าน การสำเร็จความโง่ด้วยตนเอง แล้ว ก็ชวนให้นึกย้อนไปถึงลีลาลักษณะคล้าย ๆ กันในงานกวีนิพนธ์ร้อยแก้ว หรือ prose poetry ชื่อ The Prophet (1926) ของ คาลิล ยิบราน ซึ่งเขียนไว้เป็นภาษาอังกฤษ และได้รับการถอดความเป็นภาษาไทยในชื่อ ปรัชญาชีวิต โดย ระวี ภาวิไล ที่ให้นักปราชญ์มาอธิบายความหมายของคำแต่ละคำซึ่งย้อนแย้งกับนิยามเดิมที่เราเคยรับรู้ผ่านการปลูกฝังกันมาเช่นเดียวกัน เพียงแต่น้ำเสียงและเนื้อหาของ ธัชชัย ธัญญาวัลย ใน การสำเร็จความโง่ด้วยตนเอง จะมีความร่วมสมัยมากกว่า ทั้งยังสามารถอธิบายภาวะหลังสมัยใหม่ในโลกปัจจุบันได้อย่างดี โลกใบที่ความโลเลไม่แน่นอน ได้กลายมาเป็นสรณะแห่งทุกสรรพสิ่งไปเสียแล้ว\n","การสำเร็จความโง่ด้วยตนเอง ได้รับการแปลเป็นภาษาอังกฤษในชื่อ A Fool’s Guide to Making a Fool of Yourself โดยฝีมือการแปลของ Cholatep Nabangchang ซึ่งก็แปลได้ไพเราะงดงาม จนสามารถนำมาอ่านเป็นภาคต่อยุคปัจจุบันของ The Prophet โดย คาลิล ยิบราน ต้นฉบับภาษาอังกฤษได้อย่างดี\n","๒. กุมภาพันธ์บางทีก็มีฝน โดย วิสุทธิ์ ขาวเนียม\n","(นกเช้าสำนักพิมพ์ พิมพ์ครั้งแรก)\n","วิสุทธิ์ ขาวเนียม ดูจะเป็นกวีที่มีลายเซ็นเป็นเอกลักษณ์เฉพาะตัวในการประพันธ์ที่โดดเด่นมากอีกคนหนึ่งในยุคสมัยนี้ เนื้อหาและลีลาใน กุมภาพันธ์บางทีก็มีฝน จึงยังมีสไตล์ที่คล้ายกับบทกวีชุด พลัดหลงไปในห้วงเวลาของนักมายากล ของเขาเอง ซึ่งเคยเข้ารอบสุดท้ายรางวัลซีไรต์ มาแล้วเมื่อปี พ.ศ. ๒๕๕๙\n","กุมภาพันธ์บางทีก็มีฝน เป็นงานกวีนิพนธ์ฉันทลักษณ์ กลอนสุภาพ และกาพย์ฉบัง ๑๖ ผสมบทกวีไร้ฉันทลักษณ์ที่บอกเล่าประวัติศาสตร์และวิวัฒนาการของมนุษยชาติ จากเรื่องราวตำนานของบรรพบุรุษที่อาศัยอยู่ในโถงถ้ำ พัฒนามาสู่ยุคสมัยแห่งเทคโนโลยี ที่มนุษย์ผ่านอะไรต่าง ๆ มามากมาย กลายเป็นพงศาวดารฉบับย่อที่ วิสุทธิ์ ขาวเนียม ผสมผสานเกร็ดประวัติศาสตร์อันหลากหลายในบรรยากาศเหนือจริง ซ้อนทับกับภาพเหตุการณ์จริงในลักษณะสัจนิยมมหัศจรรย์ ดังจะเห็นตัวอย่างได้จากบท “บนการเลื่อนไหลของความจริงจำนวนหนึ่ง” ที่สะท้อนภาพรวมของงานกวีในเล่มนี้ได้อย่างดี\n","บนโลกที่ใบไม้กลายเป็นหิน ซากสัตว์กลายเป็นฟอสซิลใต้ดินดิบ\n","ดึกดำบรรพ์สสารผ่านกระซิบ เสียงเวลาล่องลิบเคลื่อนเวลา\n","ยาวนานวานรสัญจรย่ำ จากวิถีอารยธรรมหุบถ้ำผา\n","สู่เรือนร่มเรียงราย บ้าน ชายคา ถึงคอนโดฯ โอ่อ่าใต้ฟ้าคราม\n","การเลื่อนไหลของความจริงยิ่งชัดฉาย เรือหนังกวางท้าทายหลายคำถาม\n","ขวานหินขัดท้าทายหลายนิยาม ของพุทธ คริสต์ อิสลาม พราหมณ์ ฮินดูฯลฯ\n","ลีลากวีที่โดดเด่นของ วิสุทธิ์ ขาวเนียม คือการสลับแทรกสัญลักษณ์แปลกประหลาดชวนฉงน ปะปนกับประโยควลีที่สื่อความอย่างตรงไปตรงมา ท้าทายให้ผู้อ่านต้องพินิจใคร่ครวญว่า แต่ละสิ่งที่กวีกล่าวถึงนั้นหมายถึงสิ่งใด ถ้อยกวีของ วิสุทธิ์ ขาวเนียม จึงอุดมไปด้วยปริศนาที่อาจมิได้มีเจตนาให้ผู้อ่านต้องเข้าใจในทุก ๆ สิ่งอย่าง ทว่ายังสามารถสัมผัสบรรยากาศเหลื่อมสลัวพร่ามัวแบบเบลอ ๆ ที่กวีสร้างขึ้นมาอย่างได้อรรถรส อ่านแล้วจะเหมือนเข้าใจในทุก ๆ ถ้อยคำที่กวีเอ่ยออกมา แต่ถ้าจะให้เล่าต่อว่าเขากำลังกล่าวถึงอะไร บางครั้งก็ให้คำตอบได้ยากอยู่เหมือนกัน เช่นในบท “เหนือโค้งสะพานที่ยี่สิบเอ็ด”\n","หลังมาร์ค ซัคเคอร์เบิร์คผ่านมาเคาะประตูบ้าน\n","หอยทากอนาล็อกก็เลิกสร้างรอยแผลแก่ดอกโฮย่า\n","แมวสีสวาดผสมพันธุ์กับแมวเปอร์เซีย\n","ดีเอ็นเอนกแขกเต้าหลอมรวมกับดีเอ็นเอนกแก้วมาคอร์\n","หลานชายของโจรขมังเวทย์เปลี่ยนรูปโปรไฟล์\n","เป็นรูปพระพุทธเจ้าอุลตร้าแมน…\n","อย่างไรก็ดี ความคมคายเชิงวรรณศิลป์ที่ปรากฏใน กุมภาพันธ์บางทีก็มีฝน ของ วิสุทธิ์ ขาวเนียม ก็ทำให้ความรู้สึกฉงนฉงายอาจกลายเป็นความงดงามที่มีเสน่ห์เย้ายวนชวนให้ทำความเข้าใจ ไม่ต่างจากที่อัครกวี อังคาร กัลยาณพงศ์ เคยสร้างความน่าอัศจรรย์อันชวนตะลึงพรึงเพริดไว้ในงานกวีนิพนธ์แฟนตาซีหลาย ๆ ชิ้นของเขา\n","๓. ด้วยก้าวของเราเอง โดย ‘ธมกร’\n","(แพรวสำนักพิมพ์ พิมพ์ครั้งแรก)\n","นามปากกา ‘ธมกร’ อาจเป็นนามที่ค่อนข้างใหม่ เนื่องจากมีผลงานกวีนิพนธ์ตีพิมพ์ออกมาเล่มนี้เป็นเพียงเล่มที่ ๓ และเคยเข้ารอบสุดท้ายรางวัลซีไรต์มาแล้วกับผลงาน เมฆาจาริก เมื่อ พ.ศ. ๒๕๕๖ แต่จริง ๆ แล้ว ‘ธมกร’ เป็นอีกหนึ่งนามปากกาของกวีที่สร้างผลงานชั้นดีให้วงการกวีนิพนธ์ไทยมายาวนานหลายสิบปี และ ด้วยก้าวของเราเอง ก็เป็นประจักษ์พยานได้อย่างดี ว่ากวีผู้นี้มีความช่ำชองในการประพันธ์คำกานท์สมกับที่คร่ำหวอดอยู่ในวงการมาอย่างยาวนาน จากผลงานที่กวีสามารถร้อยเรียงถ้อยคำได้อย่างไพเราะลื่นไหล ไม่ว่าจะฉันทลักษณ์ใด หรือมีเนื้อหาเกี่ยวข้องกับอะไร กวี ก็ถ่ายทอดออกมาได้อย่างหมดจดงดงามราวไม่ต้องใช้ความพยายามเลย\n","เนื้อหาใน ด้วยก้าวของเราเอง เป็นการเฝ้ามองผู้คนตัวเล็ก ๆ หรือปรากฏการณ์ทางสังคมต่าง ๆ รอบตัวกวี ที่อาจมิได้เป็นเรื่องยิ่งใหญ่แต่อย่างใด ทว่าด้วยสายตาที่มองทะลุอย่างผู้ที่ผ่านเรื่องราวชีวิตมาอย่างยาวนาน ความคิดอ่านของกวีก็ยังคงไว้ซึ่งความลึกซึ้งคมคาย ฉายมุมมองเล็ก ๆ ที่หลาย ๆ คนอาจมองข้ามได้ ในลักษณะของคนช่างสังเกตช่างคิด\n","จุดเด่นในงานกวีของ ‘ธมกร’ คือการใช้ภาษาที่ฟังดูคล้ายการชวนสนทนาอย่างน่าฟัง หลาย ๆ บทก็แต่งออกมาเป็นการพูดคุยของตัวละครคล้ายบทละคร สร้างความมีชีวิตชีวาด้วยภาษาพูดที่จัดลงฉันทลักษณ์ได้อย่างงดงาม ดังตัวอย่างในบท “ไอ้ทิดข้าวดิบ”\n","“หม้อข้าวมิทันจะเดือด น้ำมิทันเหือด\n","ฉิบหาย! ใครหวาราไฟ”\n","เสียงยายสบถพึมไป ขณะเกรียกไม้\n","เป็นเชื้อไฟใหม่ใส่เตา\n","“ข้าเห็นไอ้ทิดมันเอา ตะหลิวตักถ่านเถ้า\n","ต่อไฟไปตีผึ้งรวง…”\n","นอกจากนี้ ‘ธมกร’ ยังนิยมใช้อักษรตัวเอียง เพื่อแสดงเสียงหรือความคิดที่ต่างมุมไปอยู่บ่อยครั้ง สร้างมิติให้กาพย์กลอนของเขามีแง่มุมที่หลากหลายและลึกซึ้งได้มากขึ้น เช่นในบท “ศัลยกรรมข้ามศตวรรษ” ที่มุ่งแดกดันเสียงโฆษณาของคลินิกศัลยกรรมความงามด้วยตัวอักษรเอียง\n","…แถลงการณ์ศัลยกรรมยังย้ำกล่าว ผ่าตัดตาตาเห็นยาวโลกเหลนหลาน\n","อนาคตที่มืดมนอนธการ จะบันดาลทิศทางสว่างชีวิต\n","ผ่าตัดหูหูจะเพียงยินเสียงใจ ยินเสียงเท็จสาไถยแยกถูกผิด\n","เข้าถึงคำทุกคำถึงความคิด แม้เสียงจิตใต้สำนึกอันลึกลี้…\n","ความไพเราะงดงามของบทกวีแต่ละบทใน ด้วยก้าวของเราเอง แสดงให้เห็นอย่างชัดเจนเลยว่า ‘ธมกร’ เป็นนักประพันธ์ที่มีความเป็น ‘กวี’ อยู่ในสายเลือดจริง ๆ ถ้อยโวหารของเขาพรั่งพรูออกมาโดยไม่ต้องกางผังฉันทลักษณ์คิดหาตำแหน่งสัมผัส ราวภาษากวีเป็นภาษาที่เขาพูดอยู่แล้วเป็นกิจวัตร ไม่ว่าจะชวนคุยด้วยจังหวะคำใด หรือหยิบยกประเด็นเรื่องราวไหน ‘ธมกร’ ก็พร้อมจะตอบโต้สนทนาด้วยภาษาแห่งคำกานท์ได้เสมอ\n","๔. ทุกขณะกระจ่างชัดสัมผัสใจ โดย รินศรัทธา กาญจนวตี\n","(สำนักพิมพ์ออน อาร์ต พิมพ์ครั้งแรก)\n","ตามที่ประกาศไว้เป็นคำโปรยบนหน้าปกกวีนิพนธ์เล่มนี้ รินศรัทธา กาญจนวตี เป็นกวีหญิง “ผู้ไร้ดวงตา” เนื่องจากเธอได้สูญเสียการมองเห็น งานกวีนิพนธ์ ทุกขณะกระจ่างชัดสัมผัสใจ จึงโดดเด่นด้วยเนื้อหาของผู้ที่มีลักษณาการทางร่างกายเฉพาะที่มิอาจมองเห็นโลกผ่านดวงตาอีกต่อไป และจะมาบอกเล่าสื่อสารกับผู้อ่านที่ยังมองเห็นว่าโลกของเธอมีหน้าตาเป็นอย่างไร ผ่านบทกลอนเป็นฉันทลักษณ์หลัก\n","เนื้อหาของ ทุกขณะกระจ่างชัดสัมผัสใจ แบ่งออกเป็น ๔ ภาคด้วยกัน คือ “โลกอีกดวงของผู้ไร้ดวงตา” เล่าประสบการณ์ส่วนตนของผู้ที่สูญเสียการมองเห็น “ประจักษ์ค่าชีวิต (แม้มิดแสง)” สะท้อนมุมมองต่อผู้คนอื่น ๆ ในสังคม “รู้สึก ความรัก ความเปลี่ยนแปลง” ระบายความรู้สึกต่าง ๆ เกี่ยวกับความรัก และ “ปัญญากระจ่างแจ้งด้วยความคิด” ใคร่ครวญถึงการเติบโตทางปัญญาและอุดมการณ์\n","บทกวีที่น่าจะเป็นเสียงแทนเนื้อหาหลักใน ทุกขณะกระจ่างชัดสัมผัสใจ ของ รินศรัทธา กาญจนวตี ได้อย่างดี ก็เห็นจะเป็นบท “จากฉัน ผู้ไร้ดวงตา” ในส่วนของคำนำ ที่เธอเล่าว่าโลกในความมืดของเธอเป็นเช่นไร\n","ฉันมิได้มองโลกกว้างเหมือนอย่างคุณ ถึงโลกหมุนอย่างไรฉันไม่เห็น\n","แม้แต่ภาพตะวันและจันทร์เพ็ญ รูปเงาเป็นอย่างไรฉันไม่รู้\n","โลกของฉันมืดยิ่งกว่าหลับตาสนิท แต่ดวงจิตฉันสว่างกระจ่างอยู่\n","และทุกวันฉันใช้หัวใจดู ยังคงสู้และพร้อมไม่ยอมแพ้…\n","ในขณะที่บางบท รินศรัทธา กาญจนวตี กลับสามารถใช้โวหารสร้างจินตภาพได้อย่างเป็นรูปธรรมทรงพลัง ราวประพันธ์โดยกวีที่ดวงตายังคงมองเห็น เช่นในบท “แรงเทียน” จากภาค “ปัญญากระจ่างแจ้งด้วยความคิด”\n","พายุจัดพัดกล้าฟ้ามืดมิด ทั้งสี่ทิศมัวหม่นทุกหนแห่ง\n","ทั้งสองเท้าก้าวข้ามแม้หนามแทง ทั้งสองมือถือแสงจากแรงเทียน\n","เอาไออุ่นจากอกช่วยปกป้อง ค่อยประคองคงแผ่มิแปรเปลี่ยน\n","เก็บความหลังทั้งหมดเป็นบทเรียน เร่งพากเพียรรวมแสงต้านแรงลม…\n","นอกเหนือจากจินตภาพและมุมมองที่แตกต่างจากกวีที่ยังมองเห็นโดยทั่วไปแล้ว บทกวีของ รินศรัทธา กาญจนวตี ยังมีความพิเศษที่แสดงให้เห็นเลยว่า กวีให้ความสำคัญกับเรื่อง ‘เสียง’ เป็นอย่างมาก ทั้งจังหวะ และการลงตำแหน่งคำ สัมผัสนอก สัมผัสใน สัมผัสสระ สัมผัสอักษร ที่กวีได้ร้อยเรียงไว้อย่างพิถีพิถันและใส่ใจเป็นพิเศษ กลอนของ รินศรัทธา กาญจนวตี จึงอ่านแล้วลื่นไหลให้สุ้มเสียงที่ไพเราะ จนชวนให้รู้สึกว่า กวีนิพนธ์ เป็นงานประพันธ์ที่ต้องสัมผัสด้วยการอ่านออกเสียงเท่านั้น ไม่สามารถอ่านเงียบ ๆ ในใจได้เลย หากไม่เชื่อคุณผู้อ่านลองอ่านออกเสียงบทกวีที่ยกตัวอย่างไว้ข้างต้นเปรียบเทียบดู ก็น่าจะสัมผัสรู้ได้ว่า ทุกขณะกระจ่างชัดสัมผัสใจ ให้สังคีตสำเนียงที่ฟังแล้วกำซาบผ่านโสตประสาทหู พุ่งเข้าสู่หัวใจเราได้จริง ๆ\n","๕. ฝันของฝูงกระต่าย โดย ศิริวร แก้วกาญจน์\n","(ผจญภัยสำนักพิมพ์ พิมพ์ครั้งแรก)\n","ผลการคัดเลือกงานกวีนิพนธ์ที่เข้ารอบสุดท้ายรางวัลซีไรต์ในปี พ.ศ. ๒๕๖๒ นี้ ได้สร้างสถิติใหม่ให้กับงานวรรณกรรม S.E.A. Write Shortlist เป็นที่เรียบร้อย เมื่อ ศิริวร แก้วกาญจน์ ได้ครองตำแหน่งนักเขียนที่มีผลงานผ่านเข้ารอบสุดท้ายรางวัลซีไรต์มาแล้วจำนวนมากที่สุดในประวัติศาสตร์ นั่นคือจำนวนถึง ๙ เล่ม มากกว่า วัฒน์ วรรลยางกูร และ ประชาคม ลุนาชัย ที่มีคนละ ๘ เล่มเท่ากัน ซึ่งจะขอย้อนทวนสถิติทั้ง ๙ เล่มที่ว่า ไล่มาตั้งแต่กวีนิพนธ์ ประเทศที่สาบสูญ พ.ศ. ๒๕๔๗ รวมเรื่องสั้น เรื่องเล่าของคนบันทึกเรื่องเล่าที่นักเล่าเรื่องคนหนึ่งเล่าให้เขาฟัง พ.ศ. ๒๕๔๘ นวนิยาย กรณีฆาตกรรมโต๊ะอิหม่ามสะตอปา การ์เด พ.ศ. ๒๕๔๙ กวีนิพนธ์ เก็บความเศร้าไว้ให้พ้นมือเด็กเด็ก กับ ลงเรือมาเมื่อวาน พ.ศ. ๒๕๕๐ พร้อมกัน รวมเรื่องสั้น ข่าวการหายไปของอาริญาและเรื่องราวอื่น ๆ พ.ศ. ๒๕๕๑ กวีนิพนธ์ ฉันอยากร้องเพลงสักเพลง พ.ศ. ๒๕๕๓ นวนิยาย โลกประหลาดในประวัติศาสตร์ความเศร้า พ.ศ. ๒๕๕๕ และมาถึงกวีนิพนธ์ ฝันของฝูงกระต่าย สำหรับพ.ศ. ๒๕๖๒ นี้\n","ด้วยจำนวนผลงานที่เคยผ่านเข้ารอบสุดท้ายมามากถึงขนาดนี้ก็คงเป็นเครื่องการันตีได้อย่างดีว่า ศิริวร แก้วกาญจน์ เป็นนักประพันธ์ร่วมสมัยที่มีฝีไม้ลายมือเจนจัดมากที่สุดคนหนึ่ง และไม่เฉพาะกับรูปแบบการประพันธ์ประเภทใดประเภทหนึ่งเท่านั้น ทว่าเขายังช่ำชองทั้งการเขียน นวนิยาย เรื่องสั้น กวีนิพนธ์ฉันทลักษณ์ และไร้ฉันทลักษณ์ เลยทีเดียว\n","ฝันของฝูงกระต่าย เป็นงานกวีนิพนธ์ที่ผสมผสานบทกวีฉันทลักษณ์และไร้ฉันทลักษณ์เข้าด้วยกัน ประกอบไปด้วย ๔ ภาค คือ “ชนเผ่าเร่ร่อนในโลกออนไลน์” “ฝันของฝูงกระต่าย” “กาแฟและหนังสือ” และ “ต้นไม้ไม่อยากเป็นเรือ” จุดเด่นในงานกวีนิพนธ์ส่วนใหญ่ของ ศิริวร แก้วกาญจน์ คือการแสดงปฏิกิริยาต่อภาพข่าว เหตุการณ์สำคัญทั้งทางด้านสังคม ประวัติศาสตร์ การเมือง การเปลี่ยนแปลงทางเทคโนโลยี และเรื่องอื่น ๆ ด้วยสายตา อารมณ์ ความรู้สึก รวมถึงความคิดนึกในแบบกวี แม้รายละเอียดของเนื้อหาอาจเป็นสิ่งที่ผู้อ่านรับรู้อยู่แล้ว จากข่าวสารและความเป็นไปรอบตัว แต่ ศิริวร แก้วกาญจน์ ก็มีมุมมองและกลวิธีที่น่าสนใจมาเล่าใหม่ได้เสมอ ทำให้งานกวีนิพนธ์ของ ศิริวร แก้วกาญจน์ รวมถึงใน ฝันของฝูงกระต่าย มักจะสดใหม่ด้วยเนื้อหาร่วมสมัย เป็นบทบันทึกอันเปี่ยมด้วยวรรณศิลป์ของเหตุการณ์บ้านเมืองที่เกิดขึ้นในรอบไม่กี่ปีที่ผ่านมา เช่น เหตุการณ์ทีมนักฟุตบอลหมูป่าติดอยู่ในถ้ำหลวง เมื่อ พ.ศ. ๒๕๖๑ ศิริวร แก้วกาญจน์ ก็ชวนให้เราระลึกถึงคืนวันอันตึงเครียดเหล่านั้นได้อย่างสะเทือนอารมณ์ ในบท “เจ้าหมูป่า เจ้าหมาน้อย (1)”\n","เจ้าหมูป่า… หนึ่ง สอง สาม เล่นซ่อนหา อย่าซ่อนหาย!\n","สี่ ห้า หก เจ็ด แปด เก้า เจ้าซ่อนกาย ซอกมุมมืดมากมายให้เสาะค้น\n","เส้นทางวกวนยากค้นหา… เจ้าก็รู้มิถุนาฯ ฟ้าอาบฝน\n","ฤดูกาล ขานกู่ฤดูกล เถอะเลิกเล่นซุกซน เลิกซุกทราย\n","นอกก็มืด ในก็หนาว เจ้าก็รู้ ลมลำเลียงเสียงกู่ แล้วเงียบหาย\n","เจ้าหมูป่า ยินไหมเล่าเจ้าลูกชาย เลิกละเล่นเร้นกาย หมายเล่นกล…\n","ในส่วนบทกวีฉันทลักษณ์ เช่น กลอนต่าง ๆ ศิริวร แก้วกาญจน์ นิยมใช้วิธีการตัดจำนวนคำ การเว้นวรรค และการใช้เครื่องหมาย … ในการขับเน้น ‘ช่องไฟไร้เสียง’ ให้มีบทบาทโดดเด่นเทียบเท่ากับช่วงของการเปล่งคำ ทำให้จังหวะกวีของ ศิริวร แก้วกาญจน์ มีการทอดห้วงเวลา เปิดโอกาสให้ผู้อ่านได้สัมผัสภาษาและเนื้อหาของบทกวีอย่างมีสุนทรียะยิ่งขึ้น ดังตัวอย่างบท “เจ้าหมูป่า เจ้าหมาน้อย (1)” ข้างต้น\n","ไม่เพียงแต่เรื่องราวความเป็นไปในประเทศไทยเท่านั้น ศิริวร แก้วกาญจน์ ยังสนใจความเป็นไปอันชวนสะเทือนใจในต่างประเทศ ดังจะเห็นจากตัวอย่างบท “ตุ๊กตาพลีชีพ” ที่กล่าวถึงข่าวเด็กหญิงวัยสิบขวบกับระเบิดพลีชีพที่ไนจีเรียเมื่อ พ.ศ. ๒๕๕๘\n","กลายเป็นระเบิดพลีชีพ\n","เด็กหญิงชาวไนจีเรีย\n","อายุ 10 ขวบ\n","ผู้ใหญ่ใจดีคนไหนหนอ\n","ส่งเธอออกมากับตุ๊กตาแปลกประหลาด\n","ร่วมเฉลิมฉลองเทศกาลวันเด็ก\n","ซื้อตั๋วไปสวรรค์ด้วยชีพเพื่อนร่วมชาติ\n","กลางตลาดสด\n","เพียงพริบตา\n","วันเวลาหนึ่งทศวรรษวับหาย\n","เลือดเนื้อและลมหายใจ\n","ถูกทำให้ไร้ค่า\n","ฝันของฝูงกระต่าย จึงเป็นงานกวีนิพนธ์ที่คล้ายเป็นบทบันทึกร่วมสมัย ว่าครั้งหนึ่งเคยเกิดเหตุการณ์อันไม่น่าเชื่อใดบนโลกใบนี้บ้าง ถ่ายทอดอย่างพิถีพิถันด้วยลีลากวีที่มีความเฉพาะตัว เป็นตัวอย่างได้อย่างดีว่างานกวีนิพนธ์ยังเป็นรูปแบบการประพันธ์ที่ไปด้วยกันได้กับน้ำเสียงและประเด็นร่วมสมัย ไม่แพ้เรื่องสั้น หรือนวนิยาย\n","๖. ระหว่างทางกลับบ้าน โดย อังคาร จันทาทิพย์\n","(ผจญภัยสำนักพิมพ์ พิมพ์ครั้งที่สาม เพิ่มเติมเนื้อหาจากการพิมพ์ครั้งแรก)\n","แชมป์เก่าเพียงหนึ่งเดียวที่มีผลงานผ่านเข้ารอบสุดท้ายรางวัลซีไรต์อีกในปีนี้ คือ อังคาร จันทาทิพย์ เจ้าของรางวัลซีไรต์จากหนังสือรวมบทกวี หัวใจห้องที่ห้า เมื่อ พ.ศ. ๒๕๕๖ ที่กลับมาร่วมชิงชัยกับผลงานเล่มใหม่ ระหว่างทางกลับบ้าน และอาจสร้างปรากฏการณ์ ‘ดับเบิลซีไรต์’ สองปีซ้อน หลังจากที่ วีรพร นิติประภา เคยทำสำเร็จไว้ในการประกวดเมื่อปีก่อน\n","ระหว่างทางกลับบ้าน เป็นงานกวีนิพนธ์ฉันทลักษณ์ที่ประพันธ์เป็นกลอนสุภาพเป็นส่วนใหญ่ กวี อังคาร จันทาทิพย์ ได้วางโครงเนื้อหาของบทกวีแต่ละชิ้นให้มีความเกี่ยวโยงกับความหมายของ ‘บ้าน’ ในหลากหลายมิติ ทั้งบ้านที่เป็นรูปธรรมของตัวอาคารเหย้าเรือน บ้านที่หมายถึงการอาศัยอยู่ร่วมกันเป็นครอบครัว บ้านที่หมายถึงประเทศและถิ่นฐานมาตุภูมิ ไปจนถึงภาวะไกลบ้าน ไร้บ้าน หรือการถูกขับออกจากบ้านของชนกลุ่มต่าง ๆ ทั้งผู้อพยพลี้ภัย หรือชาวโรฮิงญา เป็นต้น\n","บทที่โดดเด่นมากที่สุดในเล่ม ก็เห็นจะเป็น “คนสร้างบ้าน” ที่ อังคาร จันทาทิพย์ ใช้อุปกรณ์สร้างบ้านชนิดต่าง ๆ มาเป็นต้นความคิดหรือสัญลักษณ์บอกเล่าชีวิตอันแร้นแค้นขัดสนของชนชั้นแรงงานได้อย่างมีจินตนาการ เช่น\n","‘สว่านและดอกสว่าน’\n","แขนขา เคยฝากไว้ในโรงจำนำ เติมค่าแรงขั้นต่ำ ระส่ำระสาย\n","น้อง ม.ต้น เปิดเทอมที พี่ ม.ปลาย ครั้นจะขาย กลัวบาปกรรม เครื่องทำกิน\n","มีเงิน มีงาน มีบ้านอยู่ แรงกายสู้ แรงใจไม่เคยสิ้น\n","สัมมาอาชีพบีบให้ชิน มาจากดิน กร้านดำ ธรรมดา\n","ดอกเจาะไม้ ใช้เจาะปูน สูญเสียเปล่า ผู้ผ่อนหนัก ผ่อนเบา อย่างเขาว่า\n","ตื้น ลึก เจาะอย่างไร ใช้เวลา งานบางหน้า บ้านบางหลัง ทั้งชีวิต\n","ซึ่งก็เป็นตัวอย่างที่ดีของการใช้ภาพเทียบและสัญลักษณ์ ซึ่ง อังคาร จันทาทิพย์ สรรค์สร้างไว้อย่างคมคายเสมอในบทกวีหลาย ๆ ชิ้นของเขา นอกจากนี้จุดเด่นอีกประการในงานกวีนิพนธ์ของ อังคาร จันทาทิพย์ ก็คือ เขานิยมใช้ ภาษา สัญลักษณ์ เครื่องหมาย อีโมติคอน และวิธีการสื่อสารร่วมสมัย ของผู้คนในยุคปัจจุบัน มาสลับคั่นกับคำกวี สร้างสีสันและบรรยากาศที่ชวนให้รู้สึกถึงความทันสมัย นำฉันทลักษณ์เก่ามาผสมผสานกับลีลาภาษาใหม่ ๆ ได้อย่างลงตัว เช่นในบท “บ้านของเรา (อยู่ในสังคมออนไลน์)”\n","“ขำจุงเบย คิดบวก พวกล้าหลัง… ^__^”\n","“พ่อเคยบอกหลายครั้ง หยุดทั้งคู่…!”\n","“$%#^ พวกโลกสวย เดี๋ยวซึ้ง เดี๋ยวมรึงรู้…”\n","“พ่อคะหนูอ่านตำราจนตาลาย… @__@”\n","“อัพเฟซ เล่นไลน์ สิไม่ว่า… *__*”\n","“*^&$# บลา บลา บลา ยิ่งเล่น เฟรนด์ยิ่งหาย…”\n","“พักรบก่อน พี่ขอสั่งครั้งสุดท้าย!…”\n","“ไอ้ปากร้าย พ่อคะพ่อ มันล้อเลียน… %#&^”\n","ระหว่างทางกลับบ้าน จึงเป็นงานที่ร่วมสมัย มีเนื้อหาใกล้ตัวและเป็นสากล อ่านง่าย ใช้ภาษาได้อย่างสนุก มีการอ้างอิงวัฒนธรรมร่วมสมัย และที่สำคัญคือให้ภาพสัญลักษณ์ที่ชัดเจนและคมคาย เข้าถึงได้ทั้งนักอ่านรุ่นเก่าและรุ่นใหม่ไปพร้อม ๆ กัน\n","๗. ศตวรรษแห่งความพ่ายแพ้ โดย ชญรัตน์ ชญารัตน์\n","(สำนักพิมพ์สมมติ พิมพ์ครั้งแรก)\n","ผลงานกวีนิพนธ์เล่มแรกของกวีหนุ่ม ชญรัตน์ ชญารัตน์ ที่สะท้อนห้วงความคิดของคนหนุ่มผู้ไม่พอใจต่อสภาพชีวิต สังคม การเมือง และผู้คนในยุคปัจจุบัน กึกก้องไปด้วยน้ำเสียงแห่งความเกรี้ยวกราดและอัดอั้น สลับกับการกล่าวถึงคนใกล้ชิดและหญิงคนรัก ด้วยท่าที หนักแน่น ครุ่นคิด ขึงขัง เอาจริงเอาจังในทุก ๆ วรรควลี กวีระบายความรู้สึกต่าง ๆ จากห้วงภายในผ่านบทกวีไร้ฉันทลักษณ์ที่มีทั้ง บทกวีแคนโต้ กลอนเปล่า กลอนอิสระ กวีนิพนธ์ร้อยแก้ว ไปจนถึงนิทานกวีนิพนธ์ ด้วยถ้อยคำที่กระแทกกระทั้น ใช้กระบวนสัญลักษณ์เป็นอาวุธในการกล่าวโจมตีผู้มีอำนาจจากความไม่ชอบธรรมทั้งหลาย ให้ภาพอันหดหู่ชวนสิ้นหวังของสังคมรอบตัวเราในยุคปัจจุบันที่ไม่ว่าจะหันไปทางไหน ก็ดูจะไร้แสงสว่างส่องชี้ทางออก ดังจะเห็นได้จากตัวอย่างในบท “ความทรงจำในคืนวันอันปกติ” ที่กล่าวถึงการปฏิวัติซ้ำแล้วซ้ำเล่าในประวัติศาสตร์การเมืองไทย\n","…ความทรงจำในคืนวันอันแสนปกติ\n","รถถังเพ่นพ่านตะกุยผิวถนนเหวอหวะ\n","ท่านนายพลประกาศตนเป็นนายกรัฐมนตรี\n","คำรามกร้าวกลบเสียงประชาชนนับล้านล้าน\n","ฉีกรัฐธรรมนูญปลิวว่อนดุจห่าฝน\n","รุ่งสางอาทิตย์ส่องแสงสะท้อนภาพเดิมสู่นัยน์ตา\n","คืนวันอันปกติสุขผ่านพ้นไปอีกเช่นเดิม\n","ความทรงจำประทับฝังแน่น\n","รอคอยการปฏิวัติครั้งหน้าด้วยหัวใจอันเป็นปกติสุข\n","ความโดดเด่นของบทกวีใน ศตวรรษแห่งความพ่ายแพ้ คือ ชญรัตน์ ชญารัตน์ ใช้วิธีและน้ำเสียงการบอกเล่าอันหลากหลายในการถ่ายทอดความคิดอ่านของเขาเอง มีทั้งการเล่าสถานการณ์จากมุมมองของบุรุษที่สาม การใช้สรรพนามแทนตนเองในหลายนัยยะทั้ง ผม ฉัน ข้า ข้าพเจ้า ไปจนถึงการถ่ายทอดด้วยบทพูดเดี่ยว monologue หรือบทสนทนาระหว่างตัวละคร แต่ที่สำคัญคือ ชญรัตน์ ชญารัตน์ สามารถเฟ้นสรรถ้อยคำเพื่อระบายความคิดอ่านของเขาออกมาได้อย่างจริงใจ ทุกถ้อยคำตัดพ้อ บริภาษ ล้วนแสดงว่าสถานการณ์ได้ผ่านพ้นเลยจุดที่เขาจะทนต่อไปไหว จึงต้องระเบิดความไม่พอใจผ่านการแสดงทรรศนะอันทรงพลัง ดังเช่นในบท “อารยชนผู้ชอบตะเบ็งเสียงอย่างรื่นรมย์” ที่ประชดประชันผู้ประกาศตนว่าเป็น ‘คนดี’ ทั้งหลายได้อย่างแสบสัน\n","เพียงเพื่อจะบอกว่าคุณเป็นคนดี\n","คุณไม่จำเป็นต้องตะเบ็งเสียงกรอกใส่หูผม\n","ผมรู้แล้ว,\n","จริงจริงนะ ผมรู้แล้วคุณเป็นคนดี\n","แต่บางครั้งคุณควรจะให้เกียรติแก้วหูผมบ้าง\n","มันรู้ว่าคุณเป็นคนดี\n","ก่อนที่สมองจะสั่งการให้ผมรู้ว่าคุณเป็นคนดีเสียอีก\n","ศตวรรษแห่งความพ่ายแพ้ จึงเป็นงานกวีนิพนธ์ที่แสดงภาพแทนน้ำเสียงของกวีรุ่นใหม่ผู้ไม่พอใจต่อสภาพบ้านเมืองในยุคปัจจุบัน ถึงแม้เนื้อหาออกจะหนักหน่วง หม่นมืด เลือกข้าง และชวนให้หดหู่สิ้นหวังถึงเพียงไหน แต่ก็ปฏิเสธไม่ได้เลยว่านี่คือเสียงที่คนรุ่นใหม่บางกลุ่มกำลังรู้สึกอยู่จริง ๆ พวกเขาจึงต้องออกมาตัดพ้อต่อคนรุ่นก่อน ๆ ว่า เหตุใดจึงยอมปล่อยให้พวกเขาเติบโตมาในสังคมที่เป็นอยู่เช่นทุกวันนี้…\n","๘. ไฮโซ…เชียล โดย ขวัญข้าว ขวัญเรียมเอย\n","(Hi-So-Cial Publishing พิมพ์ครั้งแรก)\n","จากงานกวีเล่มหนัก ๆ อย่าง ศตวรรษแห่งความพ่ายแพ้ ก็ขอปิดท้ายกันด้วยกวีนิพนธ์ฉันทลักษณ์เนื้อหาข้ามผ่านกาลเวลาลีลาอ่อนหวาน ขบขัน น่ารัก ๆ ชื่อ ไฮโซ…เชียล ของกวีนามใหม่ ขวัญข้าว ขวัญเรียมเอย ไฮโซ…เชียล เป็นงานกวีนิพนธ์กาพย์กลอน ที่สะท้อนภาพการเปลี่ยนผ่านจากชีวิตในโลกแอนะล็อก สู่ชีวิตในโลกยุคดิจิทัล ท่ามกลางสังคมแห่งการสื่อสารผ่านตัวตนและรูปแบบการดำเนินชีวิตใหม่ ๆ ภายใต้อิทธิพลของโซเชียลมีเดีย เพื่อสะท้อนว่าภายในระยะเวลาเพียงไม่กี่สิบปี วิถีความเป็นอยู่ของผู้คนสามารถแตกต่างราวเป็นคนละโลกได้อย่างไร\n","ความพิเศษของบทกวีใน ไฮโซ…เชียล คือ แม้ว่าส่วนเนื้อหาจะแสดงความรู้สึกโหยหาชีวิตอันเรียบง่ายในอดีตกันอย่างชัดเจน แต่ ขวัญข้าว ขวัญเรียมเอย ก็ไม่ได้มองว่าสิ่งที่เคยเกิดขึ้นในอดีต จะต้องงดงามและน่าจดจำกว่าโลกในยุคปัจจุบันเสมอไป ทว่ากวีสามารถแสดงทรรศนะที่สะท้อนได้อย่างสมดุลว่า โลกเก่ากับโลกยุคปัจจุบันมันก็มีทั้งข้อที่น่าพิสมัยและไม่น่าพิสมัยในมุมที่ต่างกันไป และไม่ว่าเราจะอยู่ในยุคไหน มันก็มักจะมีปัญหามากวนอกกวนใจเราได้เสมอ การเปรียบเทียบโลกอดีต-ปัจจุบัน ของ ขวัญข้าว ขวัญเรียมเอย ใน ไฮโซ…เชียล จึงมักเป็นการส่องสะท้อนสัจธรรมแห่งความเปลี่ยนแปลง ที่ทุกสิ่งอย่างจะต้องปรับรูปรอยให้เข้ากับยุคสมัย แม้ว่าในส่วนของกิเลสและความต้องการของมนุษย์ทั้งหลายจะยังคงเผาไหม้และลุกโชนต่อไปอย่างไร้ที่สิ้นสุด ดังตัวอย่างจากบท “ดารา”\n","จอเงินเดินทางสู่จอแก้ว ยุคผ่านลมแผ่วแล้วขื่นขม\n","หนังโศก ทีวีสีเศร้าตรม เด็กก้มจิ้มหน้าจอ, ไม่ง้อดารา\n","พื้นที่มีให้ได้ปล่อยของ ทุกช่องทุกทางดั่งปรารถนา\n","เฟซบุ๊ก ไอจี ยูทูปท้า ชั่วพริบตา ชั่วเลื่อนจอก็โด่งดัง\n","อย่างไรก็ดี งานกวีของ ขวัญข้าว ขวัญเรียมเอย ก็มิได้ให้ภาพความเปลี่ยนแปลงทางเทคโนโลยีในระดับรูปธรรมแต่เพียงผิวเผินเท่านั้น หากยังพิเคราะห์ถึงความเปลี่ยนแปลงทางจิตวิทยาและพฤติกรรมของผู้คน ว่าการเปลี่ยนผ่านยุคสมัย ได้ก่อให้เกิดการเปลี่ยนแปลงภายในอย่างไรบ้าง ดังเช่นในบท “ดอกรัก” ซึ่งสะท้อนถึงระดับการแสดงออกที่ต่างกันของคนสองรุ่นได้อย่างเห็นภาพ\n","รักใครชังใครไม่ปริปาก ชอบมากรักมากอยากชิดใกล้\n","เกลียดเขาชังเขาไม่เข้าใจ ซ่อนเก็บข้างในไม่ให้รู้\n","ปล่อยวางปล่อยไว้ให้เวลา เผื่อว่าต่อไปได้เคียงคู่\n","อาจเกลียดอาจกลายเป็นเชิดชู ศัตรูอาจกลับกลายเป็นมิตร\n","เด็กน้อยคนนั้นในวันก่อน นึกย้อนสะท้อนใจในวิกฤติ\n","ยุคนั้นความลับปิดมิดชิด ยุคนี้ความคิดเปิดเผยนัก\n","“นี่คุณกำลังคิดอะไร?” รักใครชอบใครไม่เก็บกัก\n","โกรธใครเกลียดใครด่าทะลัก ให้โลกรู้จักด้านมืดตน\n","ไฮโซ…เชียล ของ ขวัญข้าว ขวัญเรียมเอย จึงเป็นงานกวีนิพนธ์ที่เปรียบดั่งสะพานทอดเชื่อมโลกอดีตแห่งความทรงจำกับความล้ำสมัยแห่งยุคปัจจุบันได้อย่างสมดุลและมั่นคง จากสายตาของผู้ที่เคยผ่านประสบการณ์ในโลกใบเก่า ทว่าสามารถปรับตัวให้เข้ากับความเปลี่ยนแปลงของโลกใบใหม่ได้อย่างชวนพิเคราะห์ เหมาะจะเป็นงานกวีที่คนรุ่นเก่าควรอ่านเพื่อรับรู้ทรรศนะมุมมองของคนรุ่นใหม่ ในขณะที่คนรุ่นใหม่ก็จะได้เรียนรู้ถึงวิถีชีวิตแบบเก่าว่าเคยมีมุมงามอย่างไร แม้จะเป็นความงามที่พวกเขาไม่อาจย้อนเวลากลับไปสัมผัสได้อีกแล้ว . . .\n","กวีนิพนธ์ที่ผ่านเข้ารอบสุดท้ายรางวัลซีไรต์ ประจำปี พ.ศ. ๒๕๖๒ ทั้ง ๘ เล่มนี้ จึงถือเป็นผลงานที่มีความเข้มข้นในแนวทางของตัวเอง พอที่จะเป็นภาพแทนส่วนหนึ่งของความหลากหลายของงานกวีนิพนธ์อีก ๕๘ เล่มที่ส่งเข้าประกวดในปีนี้ได้ ซึ่งสุดท้ายแล้วเล่มไหนจะคว้ารางวัลใหญ่ไป ก็คงต้องลุ้นกันจากการประกาศของคณะกรรมการชุดตัดสิน แต่สำหรับผู้อ่านโดยทั่วไปแล้ว งานกวีนิพนธ์เล่มที่ถูกใจ ก็อาจเป็นกวีเล่มอื่น ๆ ที่ผ่านเข้ารอบ Shortlist, Longlist หรือที่ไม่ได้เข้ารอบมาก็เป็นได้ ซึ่งก็เชื่อเหลือเกินกว่าในบรรดากวีนิพนธ์ทั้ง ๖๖ เล่มนี้ คงต้องมีอย่างน้อยสักหนึ่งเล่ม ที่จะกลายเป็น\n","ขอขอบคุณ คณะกรรมการดำเนินงานรางวัลซีไรต์ สำหรับหนังสือกวีนิพนธ์ที่ใช้ในการรีวิวครั้งนี้\n","Leave a comment\n","แนะแนวเรื่อง\n","« อ่านบทกวีชิงซีไรต์…ไปพร้อมๆ กับกรรมการ: ภาค Longlist พ.ศ. ๒๕๖๒\n","อ่านรวมเรื่องสั้นชิงรางวัลซีไรต์ . . . ไปพร้อมๆ กับกรรมการ พ.ศ. ๒๕๖๓ »\n","ใส่ความเห็น ยกเลิกการตอบ\n","อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *\n","ความเห็น *\n","ชื่อ *\n","อีเมล *\n","เว็บไซต์\n","CAPTCHA Code *\n","Δ\n","การเผยแพร่ในระดับนานาชาติ\n","วรรณศิลป์\n","ทัศนศิลป์\n","ภาพยนตร์\n","สังคีตศิลป์\n","ศิลปะการแสดง\n","บทวิจารณ์รางวัลกองทุน มล.บุญเหลือ เทพยสุวรรณ\n","ผลงาน การวิจารณ์ในฐานะพลังทางปัญญาฯ\n","ผลงานการวิจารณ์ในฐานะปรากฏการณ์ร่วมสมัย\n","ข่าวสาร\n","PDF ไฟล์ หนังสือ “วรรณกรรมละคร ของแบร์ทอลท์ เบรคชท์ การศึกษาเชิงวิจารณ์”\n","รายงานการเสวนา\n","รายงานสรุปเสวนา องค์ประกอบของการวิจารณ์ในการเรียนการสอนศิลปะการละคร\n","คลังเก็บ\n","คลังเก็บ เลือกเดือน กันยายน 2022 สิงหาคม 2022 มิถุนายน 2022 พฤศจิกายน 2021 ตุลาคม 2021 กรกฎาคม 2021 มิถุนายน 2021 เมษายน 2021 มีนาคม 2021 ตุลาคม 2020 มีนาคม 2020 กุมภาพันธ์ 2020 มกราคม 2020 ธันวาคม 2019 พฤศจิกายน 2019 ตุลาคม 2019 กันยายน 2019 สิงหาคม 2019 กรกฎาคม 2019 มิถุนายน 2019 พฤษภาคม 2019 เมษายน 2019 มีนาคม 2019 ธันวาคม 2018 พฤศจิกายน 2018 กันยายน 2018 สิงหาคม 2018 กรกฎาคม 2018 เมษายน 2018 มีนาคม 2018 กุมภาพันธ์ 2018 พฤศจิกายน 2017 กันยายน 2017 สิงหาคม 2017 มิถุนายน 2017 พฤษภาคม 2017 เมษายน 2017 มีนาคม 2017 กุมภาพันธ์ 2017 มกราคม 2017 ธันวาคม 2016 พฤศจิกายน 2016 ตุลาคม 2016 กันยายน 2016 สิงหาคม 2016 กรกฎาคม 2016 มิถุนายน 2016 พฤษภาคม 2016 เมษายน 2016 มีนาคม 2016 กุมภาพันธ์ 2016 มกราคม 2016 ธันวาคม 2015 พฤศจิกายน 2015 ตุลาคม 2015 กันยายน 2015 สิงหาคม 2015 กรกฎาคม 2015 มิถุนายน 2015 พฤษภาคม 2015 เมษายน 2015 มีนาคม 2015 กุมภาพันธ์ 2015 มกราคม 2015 ธันวาคม 2014 พฤศจิกายน 2014 ตุลาคม 2014 กันยายน 2014 สิงหาคม 2014 กรกฎาคม 2014 พฤษภาคม 2014 เมษายน 2014 มีนาคม 2014 กุมภาพันธ์ 2014 มกราคม 2014 พฤศจิกายน 2013 ตุลาคม 2013 กันยายน 2013 สิงหาคม 2013 กรกฎาคม 2013 มิถุนายน 2013 พฤษภาคม 2013 มีนาคม 2013 กุมภาพันธ์ 2013 มกราคม 2013 ธันวาคม 2012 พฤศจิกายน 2012 กันยายน 2012 สิงหาคม 2012 กรกฎาคม 2012 มิถุนายน 2012 พฤษภาคม 2012 เมษายน 2012 มีนาคม 2012 กุมภาพันธ์ 2012 มกราคม 2012 พฤศจิกายน 2011 ตุลาคม 2011 กันยายน 2011 สิงหาคม 2011 กรกฎาคม 2011 มิถุนายน 2011 พฤษภาคม 2011 เมษายน 2011 มีนาคม 2011 มกราคม 2011 ธันวาคม 2010\n","\n","ความเห็นล่าสุด\n","Muhammad Iqbal บน มอบหนังสือ ทฤษฎีการวิจารณ์ศิลปะ และ การวิจารณ์กับทวิวัจน์ข้ามชาติ\n","คลิปการบรรยายย้อนหลังในหัวข้อ “เหลียวหลังแลหน้า…การวิจารณ์วรรณกรรมในประเทศไทย” EP.01 – จ บน โครงร่างการบรรยาย “ความคิดเรื่องวุฒิภาวะในศิลปะและการวิจารณ์”\n","รุ่งภัทร เริงพิทยา บน ลงทะเบียนการประชุมเสนอผลงานการวิจัยโครงการวิจัย “ความสำนึกร่วมในพัฒนาการศิลปะและการวิจารณ์ของไทย: หมุดหมายที่สำคัญในช่วง พ.ศ. 2475-2550”\n","Books\n","CRITICISM AS CROSS CULTURE ENCOUNTER\n","โครงการวิจัย \"การวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย ภาค 2\" ดำเนินกิจการในลักษณะข้ามชาติมาตั้งแต่เริ่มแรก โดยมีการเชิญวิทยากรชาวต่างประเทศให้เสนอทัศนะที่เกี่ยวกับงานศิลปะในลักษณะของการเปรัยบเทียบข้ามวัฒนธรรม กลุ่มที่มาร่วมอภิปรายในบรรยากาศที่ไม่เป็นทางการ ประกอบด้วยศิลปิน นักวิชาการ นักวิจารณ์ และผู้รักสมัครเล่นทั้งไทยและต่างประเทศ การปะทะสังสรรค์ทางความคิดอย่างเปิดเผยได้รับการบันทึกไว้ในรายงานการสัมมนาข้ามวัฒนธรรมรวม 5 ครั้ง ในสาขาทัศนศิลป์ สังคีตศิลป์ และศิลปะการละคร โดยบรรณาธิการ (Morgan Lake) ให้ทัศนะในบทสังเคราะห์ที่ท้าทายเอาไว้เพื่อเป็นการยืนยันว่า การวิจารณ์ในลักษณะข้ามชาติเช่นนี้ คือการสร้างความมั่งคั่งทางปัญญา มิใช่แต่เฉพาะกลุ่มที่มาร่วมกิจกรรม แต่มีนัยสำคัญต่อวงการศิลปะและสังคมโดยทั่วไปด้วย\n","ราคา 165 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF File หนังสือได้ที่ https://drive.google.com/file/d/1LoPNNQOeHYxPj7ig67dILFca2crpQC4z/view?usp=sharing\n","Fervently Mediating Criticism from a Thai Perspective\n","เป็นผลงานรวมบทความภาษาอังกฤษของ เจตนา นาควัชระ (หัวหน้าโครงการวิจัยฯ) ที่มีเนื้อหาเกี่ยวกับศิลปวัฒนธรรมไทยและเทศในแง่มุมต่างๆ อย่างหลากหลาย โดยมุ่งให้ความรู้ความเข้าใจเกี่ยวกับรากฐานของศิลปวัฒนธรรมไทยแก่นักอ่าน นักวิชาการชาวต่างประเทศ รวมทั้งเสนอทัศนะและมุมมองใหม่ๆ ในทางศิลปวัฒนธรรมจากจุดยืนของนักวิชาการไทยไปสู่สากล\n","ราคา 260 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์ หนังสือได้ที่ https://drive.google.com/file/d/1Wznvs-2bh9MevC3lZUlSxD-MU4HkZyXy/view?usp=sharing\n","กวีนิพนธ์นานาชาติ การศึกษาเชิงวิจารณ์\n","หนังสือเล่มนี้เป็นหนังสือรวมบทความวิชาการ เล่มที่ 2 ของโครงการวิจัย \"การวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย ภาค 2\" เป็นการนำเสนอแนวทางและหลักวิชาในการศึกษากวีนิพนธ์ชาติต่างๆ รวม 5 ชาติ ได้แก่ อังกฤษ อเมริกัน เยอรมัน ฝรั่งเศส และไทย โดยอาจารย์ผู้ทรงคุณวุฒิในสาขาเหล่านั้น คือ จาตุรี ติงศภัทิย์ (กวีนิพนธ์อังกฤษ) สุรภีพรรณ ฉัตราภรณ์ (กวีนิพนธ์อเมริกัน) อัจฉรา วรรณชษฐ์ (กวีนิพนธ์ฝรั่งเศส) สุดาวรรณ สินธุประมา (กวีนิพนธ์เยอรมัน) และดวงมน จิตร์จำนงค์ (กวีนิพนธ์ไทย) และมีบทนำที่ชี้ให้เห็นถึงความเชื่อมโยงของกวีนิพนธ์ในระดับนานาชาติโดยองค์รวมของเจตนา นาควัชระ หนังสือเล่มนี้อาจเป็นประโยชน์ในการเรียนการสอนได้ด้วยเพราะสามารถชี้ทางให้เห็นว่าการอ่านกวีนิพนธ์ที่กอปรด้วยวิจารณญาณเป็นอย่างไร\n","ราคา 130 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์ หนังสือได้ที่ https://drive.google.com/file/d/17b_Cx2qVkMUchA75_cqc9JlrRoY-9iqr/view?usp=sharing\n","การวิจารณ์ทัศนศิลป์ ข้อคิดของนักวิชาการไทย\n","ศิลปินและนักวิชาการด้านทัศนศิลป์จากหลายสำนักรวมตัวกันเสนอบทความซึ่งเป็นการให้พื้นฐานและหลักวิชาที่ชี้ทางในด้านการวืจารณ์ในสาขาต่างๆ อาทิ ภาพพิมพ์ ประติมากรรม และศิลปะจัดแสดง โดยมีบทนำเชิงวิเคราะห์ของบรรณาธิการ (สายัณห์ แดงกลม และจักรพันธ์ วิลาสินีกุล) ที่ชี้ให้เห็นศักยภาพและทิศทางของการวิจารณ์ทัศนศิลป์ในประเทศไทย บทความเหล่านี้อาจให้ประโยชน์ต่อการเรียนการสอนได้ และในขณะเดียวกันก็เป็นตัวอย่างของการวิจารณ์ที่บ่งชี้ถึงจุดอ่อนจุดแข็งของวงการ ประเด็นบางประเด็นเป็นการท้าทายให้เกิดการวิจารณ์ซ้อนวิจารณ์ เช่น เรื่องของการเดินตามตะวันตกแบบสุดขั้ว เป็นต้น\n","ราคา 160 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1prpCyrI4wl27dpKwjwKKk702O96nfg86/view?usp=sharing\n","เก่ากับใหม่ อะไรไหนดี มนุษยศาสตร์ไทยในกระแสของความเปลี่ยนแปลง\n","ความเปลี่ยนแปลงในระดับโลกที่ทำให้เกิดการรับประสบการณ์ผ่านสื่อนานาชนิด หรือประสบการณ์ทุติยภูมิ มีผลกระทบอันใดกับวงการศิลปะและสังคมไทยโดยรวม หนังสือรวมบทความทางวิชาการของเจตนา นาควัชระ เล่มนี้ พยายามที่จะให้คำตอบ และชี้ให้เห็นถึงความแข็งแกร่งของมนุษยศาสตร์ในการที่จะเผชิญกับปัญหาของปัจจุบัน รวมทั้งชี้ทางไปสู่อนาคต\n","ราคา 195 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์คมบาง ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1gtitqGggupC4dFpkAAY3Iwnzx8RMRnAM/view?usp=sharing\n","จากแผ่นดินแม่สู่แผ่นดินอื่น รวมบทความวิชาการและบทวิจารณ์\n","หนังสือรวมบทวิจารณ์ของเจตนา นาควัชระ เล่มนี้ จัดได้ว่าเป็นผลงานต่อเนื่องจาก เพราะรักจึงสมัครเข้ามาเล่น (2540) และ ครุ่นคิดพินิจนึก (2546) การวิจารณ์เชิงปฏิบัติมิใช่เป็นเพียงการเล่าประสบการณ์ที่ได้สัมผัสกับงานศิลปะทั้งของไทยและเทศ แต่ผู้เขียนพยายามวิเคราะห์ปฏิกิริยาทางอารมณ์และความคิด เพื่อหาข้อสรุปรวมทั่วไปที่เกี่ยวกับการตีความและการประเมินคุณค่าศิลปะ ปาฐกถาเรื่อง \"ดนตรีกับชีวิต\" เป็นการสรุปประสบการณ์อันยาวนานที่ชี้ให้เห็นว่าศิลปะเชื่อมโยงกับชีวิตอย่างไร\n","ราคา 240 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์คมบาง ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1gZF0ZcwosweVyreACsmYFQYxYfKf9YUw/view?usp=sharing\n","จากเวทีละครสู่เวทีการวิจารณ์ รวมบทความวิชาการ\n","เป็นหนังสือรวมบทความวิชาการ โดยนักวิจัยของโครงการฯ และนักวิชาการรับเชิญ เป็นการพินิจละครจากมุมมองอันหลากหลาย จากการให้ประวัติการวิจารณ์ละครในประเทศไทย ไปสู่การใช้ปรัชญาพุทธศาสนาอธิบายกิจกรรมการละคร บทความบางบทให้ความรู้พื้นฐานและหลักการในการวิจารณ์ละครที่สามารถนำไปใช้ได้ดุจคู่มือการวิจารณ์ หนังสือเล่มนี้ชี้ให้เห็นว่าการวิจารณ์สามารถทำหน้าที่อันหลากหลาย ตั้งแต่การสร้างความเข้าใจและความชื่นชมในละครให้แก่มหาชน ไปจนถึงขั้นชี้ทางอันสร้างสรรค์ให้แก่ผู้แสดงด้วย ปาริชาติ จึงวิวัฒนาภรณ์ ทำหน้าที่บรรณาธิการ\n","ราคา 245 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1jl_yIHmq3mm886_GHGqEwoFt4odx2QWq/view?usp=sharing\n","จากศิลปะสู่การวิจารณ์ : รายงานการวิจัย From Work of Art to Critical Arena : Summary Report\n","เป็นรายงานของคณะผู้วิจัยในโครงการ \"การวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย\" (ภาค 2 : 2545-2548) ในสาขาทั้ง 4 อันได้แก่ วรรณศิลป์ ทัศนศิลป์ ศิลปะการละคร และสังคีตศิปล์ รวมทั้งผลการวิจัย \"การรับการวิจารณ์\" ในบทสังเคราะห์ภาษาไทยและภาษาอังกฤษ เจตนา นาควัชระ หัวหน้าโครงการ ได้ชี้ให้เห็นว่า ผลการวิจัยบ่งบอกสารอันสำคัญๆ เกี่ยวกับสังคมไทยร่วมสมัย เกินกรอบที่ว่าด้วยศิลปะโดยตรง อาทิ ปัญหาที่เกี่ยวกับวัฒนธรรมการอ่าน และความแข็งแกร่งของการปฏิบัติในวงการศิลปะไทยที่แฝงไว้ด้วยนัยเชิงทฤษฎีที่ลุ่มลึกและกว้างไกล ซึ่งนักวิชาการรุ่นใหม่จำจะต้องช่วยกันสกัดออกมาเป็นองค์ความรู้และทฤษฎีที่จะส่งผลทั้งในด้านวิชาการและย้อนกลับไปสู่การปฏิบัติ\n","ราคา 365 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ตามใจฉัน ตามใจท่าน ว่าด้วยการวิจารณ์และการวิจัย\n","จากประสบการณ์ของนักวิชาการและนักวิจัย เจตนา นาควัชระ ยืนยันหลักการที่ว่า ความพึงพอใจส่วนตน (ตามใจฉัน) กับการทำหน้าที่ที่ได้รับมอบหมาย (ตามใจท่าน) น่าที่จะประสานสัมพันธ์กันได้ บทความวิชาการที่รวมเล่มไว้ในหนังสือเล่มนี้วิเคราะห์ศิลปะหลากสาขา และพิสูจน์ให้เห็นถึงความเชื่อมโยงระหว่างโลกแห่งศิลปะกับโลกแห่งความเป็นจริงในชีวิตและสังคม\n","ราคา 240 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์คมบาง ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่\n","https://drive.google.com/file/d/1VXiMGq3jj7iRNB--sI-1608EN2xdm4Cl/view?usp=sharing\n","ทางสายใหม่แห่งวรรณกรรมไทย ทัศนะวิจารณ์ต่อนวนิยายรุ่นแรก\n","เช่นเดียวกับหนังสือ มองข้ามบ่านักเขียน : เรื่องสั้นไทยในทัศนะการวิจารณ์ หนังสือเล่มใหม่เป็นผลงานร่วมของนักวิจารณ์ 10 คน ที่เกาะกลุ่มกันเพื่อสร้างทวิวัจน์ (dialogue) เชิงวิชาการ โดยนำนวนิยายไทยรุ่นบุกเบิกรวม 12 เรื่องมาวิเคราะห์ เป็นที่แน่ชัดว่าแม้รูปแบบของนวนิยายจะเป็นผลมาจากการได้สัมผัสกับวัฒนธรรมตะวันตก แต่นักเขียนไทยก็ได้สร้างนวัตกรรมที่ทรงคุณค่าขึ้นมา และนวนิยายในฐานะประเภทของวรรณกรรม (literary genre) ก็ได้กลายเป็นหนึ่งในเสาหลักของวัฒนธรรมทางวรรณศิลป์ของไทย สุวรรณา เกรียงไกรเพ็ชร์ ทำหน้าที่บรรณาธิการและเขียนบทวิเคราะห์นำ\n","ราคา 240 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์คมบาง ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่\n","https://drive.google.com/file/d/1s0RG-0IBwGpxRpNMXLYw-AOsvHSk7DX4/view?usp=sharing\n","พลังการวิจารณ์ : บทสังเคราะห์ Criticism as an Intellectual Force in Comtemporary Society : Summary Report\n","ร่วมกับสำนักพิมพ์คมบาง หนังสือเล่มนี้เป็นเล่มที่ 1 ในจำนวน 6 เล่มของผลงานวิจัยในโครงการวิจัย \"การวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย\" ภาคแรก (พ.ศ. 2542-2545) เขียนโดย เจตนา นาควัชระ หัวหน้าโครงการ ภายในเล่มประกอบไปด้วยเนื้อหาสาระที่บ่งบอกขอบเขตและลักษณะของการวิจัยอันเป็นการพิเคราะห์งานวิจารณ์ของไทยนับตั้งแต่หลังสงครามโลกครั้งที่ 2 เป็นต้นมา เปรียบเทียบกับงานวิจารณ์นานาชาติบนรากฐานของข้อมูลอันกว้างขวางใน 4 สาขา คือ การวิจารณ์วรรณศิลป์ ทัศนศิลป์ ศิลปะการละคร และสังคีตศิลป์ (โดยได้คัดสรรตัวอย่างของงานวิจารณ์ตัวอย่าง รวม 50 บทในแต่ละสาขามาวิเคราะห์ และตีพิมพ์แยกออกต่างหากอีก 4 เล่ม) งานวิจัยนี้สามารถชี้ให้เห็นถึงจุดอ่อนจุดแข็งของการวิจารณ์ของไทย และให้ข้อเสนอแนะในการที่จะปรับศักยภาพของการวิจารณ์ให้เป็นพลังทางปัญญาให้แก่สังคม นอกจากนี้ยังมีบทสังเคราะห์เป็นภาษาอังกฤษในรูปของ Summary Report พร้อมบทความเชิงทฤษฎีการวิจารณ์ที่เป็นบทแปลภาษาอังกฤษอันเป็นการขยายผลของการวิจัย\n","ราคา 250 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์คมบาง ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","เบิกฟ้า มัณฑนา โมรากุล\n","หนังสือเล่มนี้เป็นผลสืบเนื่องมาจากกิจกรรมการสัมมนาเชิงปฏิบัติการด้านสังคีตศิลป์เรื่อง \"มัณฑนาวิชาการ\" ของโครงการวิจัย \"การวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย ภาค 2\" ในการสัมมนาครั้งนั้น วิทยาการที่ประกอบด้วย นักร้อง นักดนตรี นักแต่งเพลง นักวิจารณ์ และนักวิชาการ ได้ร่วมกันวิเคราะห์ผลงานเพลงของ มัณฑนา โมรากุล นักร้องแนวหน้าของไทย รวมทั้งมีการจัดการแสดงการขับร้องเพลงของมัณฑนา โมรากุล โดยนักร้องที่มีชื่อในยุคปัจจุบัน ผลการสัมมนาและการแสดงดนตรียืนยันได้ว่า มัณฑนา โมรากุล เป็นหนึ่งในบรรดานักร้องรุ่นบุกเบิกที่สร้างรากฐานอันมั่นคงให้แก่เพลงไทยในฐานะประเภทของศิลปะ (artistic genre)\n","ราคา 170 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่\n","https://drive.google.com/file/d/1zkyq24nb7t-okkCFpYwtTQjnoOCUlDgU/view?usp=sharing\n","พลังการวิจารณ์ : วรรณศิลป์\n","ร่วมกับสำนักพิมพ์ประพันธ์สาส์น หนังสือเล่มนี้มีลักษณะเป็นทั้งรายงานการวิจัย และตำราทางวิชาการ บทวิเคราะห์ของผู้วิจัย (รื่นฤทัย สัจจพันธุ์ และคณะ) ให้ภาพรวมของการวิจารณ์ด้านวรรณศิลป์ของไทยจากข้อมูลเอกสารที่รวบรวมได้เป็นจำนวนมาก รวมทั้งผลจากการจัดกิจกรรมการวิจารณ์ของโครงการเอง ที่ให้ทั้งองค์ความรู้และข้อสรุปรวมเชิงทฤษฎี นอกจากนี้ยังได้คัดสรรบทวิจารณ์ตัวอย่างไว้ 50 บท เป็นงานของนักวิจารณ์ไทย 47 บท และของนักวิจารณ์ต่างประเทศ 3 บท โดยทุกบทมีบทวิเคราะห์ของผู้วิจัยประกอบด้วย อันจะยังประโยชน์ต่อการเรียนการสอนได้อีกด้วย\n","ราคา 560 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ประพันธ์สาส์น จำกัด 413/26 ถนนอรุณอมรินทร์ เขตบางกอกน้อย กทม. 10700\n","โทรศัพท์ : 0-2434-1347, 0-2435-5789 โทรสาร : 0-2434-6812\n","www.prapansarn.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่\n","https://drive.google.com/file/d/1p5RsLDSBScTg9-fJ-WwEayqXgONqjv6E/view?usp=sharing\n","พลังการวิจารณ์ : ศิลปะการละคร\n","ร่วมกับสำนักพิมพ์ ณ เพชร หนังสือเล่มนี้เป็นรายงานการวิจัยเกี่ยวกับการวิจารณ์ละคร แต่องค์ความรู้ที่นำมาวิเคราะห์และสรุปรวมอย่างเป็นระบบ เป็นประโยชน์ต่อการเรียนการสอนได้ด้วย จากฐานข้อมูลเอกสารอันกว้างขวาง ผู้วิจัย (ปาริชาติ จึงวิวัฒนาภรณ์ และคณะ) ได้คัดสรรบทวิจารณ์ของนักวิจารณ์ไทย 22 บท และนักวิจารณ์ชาวต่างประเทศ 28 บท รวมเป็น 50 บท มาเป็นตัวอย่าง พร้อมให้บทวิเคราะห์ประกอบทุกบท จากข้อมูลเอกสารและจากกิจกรรมการวิจารณ์เชิงปฏิบัติ ผู้วิจัยสามารถจะชี้ให้เห็นว่าการวิจารณ์เป็นพลังทางปัญญาให้แก่สังคมได้อย่างไร\n","ราคา 560 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ ณ เพชร ตู้ ปณ. 154 ปณจ. บางกอกน้อย กทม. 10700\n","www.napetch.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่\n","https://drive.google.com/file/d/1qsgn-BxN2xs4PE6No_I8imzqcVQUy0_P/view?usp=sharing\n","พลังการวิจารณ์ : สังคีตศิลป์\n","ร่วมกับสำนักพิมพ์ชนนิยม หนังสือเล่มนี้ให้ภาพของการวิจารณ์ดนตรีในสังคมไทย ซึ่งแต่เดิมยังเป็นการแสดงทัศนะในหมู่คนในวงการอย่างไม่เป็นทางการ ในกรอบของวัฒนธรรมมุขปาฐะ ผู้วิจัย (รังสิพันธุ์ แข็งขัน และคณะ) พยายามชี้ให้เห็นว่าการปรับการวิจารณ์ให้เป็นกิจสาธารณะด้วยการเผยแพร่เป็นลายลักษณ์อักษร เป็นทางที่จะสร้างพลังทางปัญญาให้แก่สังคมได้อย่างไร ทั้งนี้มีการเสนอบทวิจารณ์ตัวอย่างรวม 50 บท อันเป็นผลงานของนักวิจารณ์ไทยและต่างประเทศ แบ่งเป็นบทวิจารณ์ดนตรีไทย 23 บท และดนตรีตะวันตก 27 บท แต่ละบทมีบทวิเคราะห์ประกอบ รวมทั้งบทนำเชิงวิเคราะห์ที่ให้หลักวิชาในการวิจารณ์ เหมาะที่จะนำไปใช้ในการเรียนการสอนได้ด้วย\n","ราคา 500 บาท\n","จัดจำหน่ายโดย บริษัทชนนิยม จำกัด\n","244/539 หมู่บ้านเธียรสวน ถนนรามอินทรา บางเขน กทม. 10200\n","โทรศัพท์, โทรสาร : 0-2552-4070, 0-2670-5759, 0-2970-6586\n","www.chonniyom.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/16j_ncmdrM0ZJFSqjHHKYqUJRla_mCIWp/view?usp=sharing\n","พลังการวิจารณ์ : ทัศนศิลป์\n","ร่วมกับสำนักพิมพ์ชนนิยม หนังสือเล่มนี้มีลักษณะเป็นทั้งรายงานการวิจัย และตำราทางวิชาการ ในบทวิเคราะห์ ผู้วิจัย (จักพันธ์ วิลาสินีกุล และคณะ) เสนอภาพรวมของการวิจารณ์ด้านทัศนศิลป์ของไทยเทียบเคียงกับวงการนานาชาติ จากรากฐานข้อมูลเอกสารที่กว้างขวางทั้งของไทยและต่างประเทศ อีกทั้งยังให้ข้อสรุปจากผลการจัดกิจกรรมทางวิจารณ์เชิงปฏิบัติที่ชี้ให้เห็นข้อเด่นข้อด้อยของวงการทัศนศิลป์ไทย สำหรับสรรนิพนธ์บทวิจารณ์ตัวอย่างรวม 50 บท เป็นผลงานของนักวิชาการไทย 27 บท และนักวิจารณ์ชาวต่างประเทศ 23 บท โดยทุกบทมีบทวิเคราะห์ของผู้วิจัยประกอบด้วย หนังสือเล่มนี้จึงเหมาะที่จะนำไปใช้ในการเรียนการสอนได้ด้วย\n","ราคา 650 บาท\n","จัดจำหน่ายโดย บริษัทชนนิยม จำกัด\n","244/539 หมู่บ้านเธียรสวน ถนนรามอินทรา บางเขน กทม. 10200\n","โทรศัพท์, โทรสาร : 0-2552-4070, 0-2670-5759, 0-2970-6586\n","www.chonniyom.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1xjtQWXRGRmS0VE42Be9WDkC51DUK41MR/view?usp=sharing\n","เพ็ญศรี พุ่มชูศรี คีตศิลปิน\n","เป็นผลงานต่อเนื่องจากหนังสือ \"เบิกฟ้า มัณฑนา โมรากุล\" ว่าด้วยคีตศิลป์แนวไทยสากลที่ผู้รู้และนักวิชาการนำมาวิเคราะห์ร่วมกันในการสัมมนา \"เพ็ญศรีวิชาการ\" และการแสดงดนตรี \"แด่เพ็ญศรี คีตศิลปิน\" เมื่อวันที่ 12-13 พฤศจิกายน 2548 วิทยากรซึ่งประกอบไปด้วย นักแต่งเพลง นักร้อง นักดนตรี นักวิชาการ ได้ร่วมกันวิเคราะห์ให้เห็นว่า ศิลปะในการขับร้องของ เพ็ญศรี พุ่มชูศรี มีลักษณะอย่างไร อีกทั้งยังได้ศึกษาอิทธิพลของเพ็ญศรีที่มีต่อวงการเพลงไทยสากล รวมทั้งได้มีการสำรวจผลงานโดยรวมของเพ็ญศรี ซึ่งบางส่วนเป็นหลักฐานจากการอัดเสียงในรูปแผ่นครั่งของกรมประชาสัมพันธ์ที่มิได้มีการเผยแพร่ทั่วไป\n","ราคา 160 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1GpTqO_WOHsuEiBnW19BC89CiZDif040g/view?usp=sharing\n","มองข้ามบ่านักเขียน : เรื่องสั้นไทยในทัศนะนักวิจารณ์\n","หนังสือเล่มนี้เป็นผลงานร่วมของนักวิจารณ์ไทย จำนวน 12 คน พร้อมด้วยที่ปรึกษาอีก 4 คน ซึ่งได้แลกเปลี่ยนทัศนะวิจารณ์เกี่ยวกับเรื่องสั้นไทยต่อเนื่องกันเป็นเวลาประมาณ 6 เดือน แล้วจึงร่วมกันคัดสรรเรื่องสั้นไทยที่ถือได้ว่าเป็นตัวแทนของวรรณกรรมประเภทนี้จำนวน 12 เรื่อง โดยแบ่งกันเขียนบทวิจารณ์คนละ 1 บท ผลที่ได้จึงมิใช่เป็นเพียงผลงานของนักวิจารณ์แต่ละคน แต่สะท้อนให้เห็นปฏิสัมพันธ์่ทางความคิดที่เริ่มจะก่อตัวขึ้นมาเป็น \"สำนัก\" แห่งการวิจารณ์อย่างไม่เป็นทางการ สุวรรณา เกรียงไกรเพ็ชร์ รับหน้าที่เป็นบรรณาธิการผู้เขียนบทวิเคราะห์\n","ราคา 295 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่\n","https://drive.google.com/file/d/1FaN5-t20s3cQAYUevN7SN5-jpN_hToFP/view?usp=sharing\n","พลังการวิจารณ์ : รวมบทวิจารณ์ร่วมสมัย\n","ร่วมกับสำนักพิมพ์คมบาง ผลงานเล่มนี้มีลักษณะเป็นสรรนิพนธ์บทวิจารณ์งานวรรณกรรมร่วมสมัยในช่วงปี 2542-2545 ซึ่งกลุ่มผู้วิจัยและผู้สนใจทั้ง 4 สาขา คือ วรรณศิลป์ ทัศนศิลป์ สังคีตศิลป์ และศิลปะการละคร เขียนขึ้นในช่วงที่ทำโครงการวิจัยการวิจารณ์ภาคแรก แต่เนื่องจากผู้วิจัยไม่อยู่ในฐานะที่จะคัดสรรและวิเคราะห์ผลงานของตนเองได้ด้วยความเป็นกลาง โครงการฯ จึงได้เชิญ สุวรรณา เกรียงไกรเพ็ชร์ เป็นบรรณาธิการ ทำหน้าที่คัดสรรและวิเคราะห์ผลงาน บรรณาธิการได้กล่าวถึงผลงานของผู้วิจัยว่าเป็น \"งานซึ่งเกิดจากการทำงานร่วมกันของนักวิชาการและผู้ปฏิบัติงานศิลปะจากต่างสาขา ชี้ชัดถึงการพัฒนาศักยภาพและทักษะทางการวิจารณ์และพิสูจน์ถึงความลุ่มลึกของคำว่า 'ส่องทาง' ทั้งในแง่ศิลปะและการวิจารณ์ 'ส่องทางให้แก่กัน'\" ผลงานเล่มนี้มีบทวิจารณ์รวมทั้งสิ้น 30 บท แบ่งออกเป็นสาขาวรรณศิปล์ ทัศนศิลป์ ศิลปะการละคร สาขาละ 7 บท สาขาสังคีตศิลป์ 8 บท และบทความนำ \"ศิลปะส่องทางให้แก่กัน\" ของเจตนา นาควัชระ\n","ราคา 200 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์คมบาง ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ลายลักษณ์แห่งการวิจารณ์ : รวมบทวิจารณ์ร่วมสมัย เล่ม 2\n","เป็นผลของการคัดสรรบทวิจารณ์ที่นักวิจัยและผู้ร่วมโครงการวิจัย \"การวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย ภาค 2\" เขียนขึ้น ผู้เขียนส่วนใหญ่ทำงานร่วมกันเป็นหมู่คณะต่อเนื่องกันเป็นเวลาหลายปี ดูประหนึ่งจะมีการก่อตัวกันขึ้นเป็น \"สำนัก\" อย่างไม่เป็นทางการ และมีทิศทางร่วมกันอยู่บ้าง นั่นก็คือการใช้การวิจารณ์ให้เป็นกลไกในการปลุกพลังทางปัญญาให้แก่สังคม โดยพยายามใช้เหตุผลอธิบายว่าจุดเด่นและจุดด้อยของศิลปะทั้ง 4 แขนงคือ วรรณศิลป์ ทัศนศิลป์ ศิลปะการละคร และสังคีตศิลป์อยู่ ณ ที่ใด คงกฤช ไตรยวงค์ ทำหน้าที่บรรณาธิการ และเขียนบทนำเชิงวิเคราะห์\n","ราคา 240 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่\n","https://drive.google.com/file/d/1FaN5-t20s3cQAYUevN7SN5-jpN_hToFP/view?usp=sharing\n","วิถีแห่งการวิจารณ์ : ประสบการณ์จากสามทศวรรษ\n","เจตนา นาควัชระ เป็นนักวิชาการที่สร้างผลงานต่อเนื่องในด้านการวิจารณ์ ทั้งในด้านการสร้างองค์ความรู้ การพัฒนาทฤษฎี และการวิจารณ์เชิงปฏิบัติ หนึ่งในผลงานที่นำมารวมเล่มในที่นี้ัคือ \"วรรณคดีวิจารณ์และวรรณคดีศึกษา\" (2514) ซึ่งมีผู้ใช้อ้างอิงต่อเนื่องมาเป็นเวลานาน ผู้เขียนได้เพิ่มผลงานล่าสุดที่ว่าด้วย \"หลักการวิจารณ์\" รวมทั้งปาฐกถา ศิลป์ พีระศรี 2548 ในหัวข้อ \"บ้านเมืองจะอับจน ถ้าผู้คนร้างศิลปะ\" และ \"บทสังเคราะห์\" ที่มาจากงานวิจัยกวีนิพนธ์นานาชาติ หนังสือเล่มนี้เหมาะสำหรับใช้ในการเรียนการสอนด้วย\n","ราคา 270 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1nRuB4yRk1FUCdniPY6yfqahYRMBJDNfE/view?usp=sharing\n","ศิลป์ส่องทาง\n","หนังสือเล่มนี้เป็นการรวมบทความทางวิชาการของเจตนา นาควัชระ รวม 10 บท ซึ่งเคยตีพิมพ์ในนิตยสารหรือวารสารวิชาการต่างๆ มาก่อน และบางบทมาจากการบรรยายทางวิชาการ บทความทั้งหมดสะท้อนปัญหาและบทบาททางวัฒนธรรมของการวิจารณ์ในประเทศไทย ที่มุ่งให้เกิดการรู้-คิด-วินิจฉัย ในเรื่องของศิลปะทั้ง 4 สาขา คือ วรรณศิลป์ ทัศนศิลป์ ศิลปะการละคร และสังคีตศิลป์ เน้นการวิเคราะห์บทบาทของการวิจารณ์ทั้ง 4 สาขา ที่ส่องทางให้แก่กัน การศึกษาเปรียบเทียบแนวคิดและวัฒนธรรมจากภูมิภาคต่างๆ ของโลก ตลอดจนถึงเรื่องการวิวาทะกวีนิพินธ์ร่วมสมัยของไทยกับตะวันตก สุวรรณา เกรียงไกรเพ็ชร์ ทำหน้าที่บรรณาธิการและเขียนบทนำเชิงวิเคราะห์\n","ราคา 210 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์คมบาง ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/123La_RP3hO6Kj20dKFwSc3IryMaPcpRM/view?usp=sharing\n","25 ปี การวิจารณ์ คำพิพากษา\n","ในการศึกษาทั้ง \"คำพิพากษา\" และ \"ชาติ กอบจิตติ\" ทำให้มองเห็นเส้นทางของการวิจารณ์วรรณกรรม ทั้งการใช้ทฤษฎีการวิจารณ์ การตีความอันเปลี่ยนแปลงไปตามสมัย\n","ราคา 165 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1Iiv3F_sNIW4KmVWWdtFzmrW3fvftNRuH/view?usp=sharing\n","80 ปี อังคาร กัลยาณพงศ์\n","80 ปี อังคาร กัลยาณพงศ์ เป็นผลงานวิจัยที่จะทำให้ผู้อ่านได้เข้าใจแนวทางการวิจารณ์กวีนิพนธ์ ตลอดจนได้มองเห็นความสัมพันธ์ระหว่างโลกของผู้เขียนกับการสร้างสรรค์งานเขียน\n","ราคา 190 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1RSBKwMfu6ughVa3BcE9gj6SnqaxhJ8Un/view?usp=sharing\n","การรับ การเสพ การบริโภคงานศิลปะ\n","ในประเทศไทย การเสพงานศิลปะเป็นกิจกรรมยามว่างที่มีกลุ่มผู้สนใจปฏิบัติอยู่เพียงจำนวนหนึ่ง กล่าวให้ชัดเจนขึ้นก็คือ ผลงานศิลปะทั้งวรรณศิลป์ ทัศนศิลป์ คีตศิลป์ และสังคีตศิลป์ เป็นที่ชื่นชมและบริโภคในกลุ่มวงการศิลปะกันเอง หรือเป็นผู้ที่ชื่นชอบศิลปะแขนงนั้นเป็นพิเศษ เว้นแต่ว่า งานศิลปะนั้นๆ จะมีลักษณะเชิงพาณิชย์ชัดเจน มีระบบการตลาดที่แข็งกว่าคุณค่าทางศิลปะ หรือมี “ดารา” เป็นจุดดึงดูดความสนใจจากสื่อมวลชนและคนทั่วไป\n","\"การรับ การเสพ การบริโภคงานศิลปะ\" เป็นงานวิจัยของ โครงการวิจัยการวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย (ภาค 2 ) นำโดย ศาสตราจารย์เกียรติคุณ ดร. เจตนา นาควัชระ เมธีวิจัยอาวุโส ซึ่งสนใจในปรากฏการณ์การรับ การเสพ และการบริโภคงานศิลปะของคนในสังคมไทย จึงได้ศึกษาทั้งกระบวนการของการจัดเผยแพร่งานศิลปะ เพื่อวิเคราะห์ลึกถึงรากเหง้าของที่มาแห่งวิกฤตทางศิลปะในสังคมไทย ในขณะเดียวกันก็เพื่อสามารถมองสังคมไทยอย่างเข้าใจ สามารถตั้งรับ และยกระดับศิลปะทั้งกระบวนการ ตั้งแต่ผู้สร้าง และผู้รับ\n","ในสถานการณ์ที่สังคมไทยขาดแนวคิดในการยกระดับงานศิลปะของประเทศ \"การรับ การเสพ การบริโภคงานศิลปะ\" เป็นหนังสือเล่มสำคัญ ที่จะทำให้มองเห็นแนวทางที่จะยกระดับศิลปะทั้งกระบวนการ\n","สำนักพิมพ์ชมนาด มีความภาคภูมิใจอย่างยิ่ง ที่ได้รับความไว้วางใจในการจัดพิมพ์ \"การรับ การเสพ การบริโภคงานศิลปะ\" เล่มนี้ และหวังเป็นอย่างยิ่งว่าวงการวิชาการด้านศิลปะทั่วประเทศจะได้รับประโยชน์ยิ่งจากหนังสือเล่มนี้\n","ราคา 125 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1YHg_AZfRGmcuxkQIbROdotuwIQqP0BuK/view?usp=sharing\n","พิเชษฐ กลั่นชื่น ทางไปสู่การอภิวัฒน์นาฏศิลป์ไทย\n","งานวิจัย โดยศึกษา พิเชษฐ กลั่นชื่น ในฐานะผู้แสดงนาฏศิลป์ไทย ที่คงทั้งความเป็นศิลปะไทยและมีทั้งความร่วมสมัย โดยพิเชษฐเอง นอกจากมีพื้นฐานนาฏศิลป์ไทยที่ดีแล้ว ยังได้ไปศึกษาต่างประเทศด้านการแสดง ทำให้หลอมรวมความเป็นไทยกับความเป็นสากล เป็นงานวิจัยที่น่าอ่านอย่างยิ่ง\n","ราคา 125 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1duvc9_2nNU2zEpNAbsOUzwfmAaqo5MVN/view?usp=sharing\n","รวงทองส่องทางศิลป์\n","หากกล่าวถึงวงดนตรีไทยที่มีคุณภาพและยืนยงยาวนาน ในประเทศไทย ชื่อ “สุนทราภรณ์” โดดเด่นปรากฏชัด ที่สำคัญ ครูเอื้อ สุนทรสนาน ได้รับการประกาศยกย่องเชิดชูเกียรติให้เป็นบุคคลสำคัญของโลก ประจำปี พ.ศ. 2553- 2554 สาขาวัฒนธรรมดนตรีไทยสากล จากองค์กรวิทยาศาสตร์และวัฒนธรรมแห่งสหประชาชาติ หรือยูเนสโก*\n","วงดนตรีสุนทราภรณ์ จึงเป็นเสมือน “สำนัก” ที่สร้างคนดนตรีคุณภาพจากอดีตมาจนถึงปัจจุบัน\n","สำนักพิมพ์ชมนาด ได้เคยตีพิมพ์ผลงานการวิจัย ของโครงการ การวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย ภาค 2 ที่เป็นงานวิจัยนักร้องสุนทราภรณ์ 2 คน คือ “เบิกฟ้า มัณฑนา โมรากุล” เมื่อปี พ.ศ. 2547 และ “เพ็ญศรี พุ่มชูศรี คีตศิลปิน” เมื่อปี พ.ศ. 2549 อันเป็นงานวิจัยที่มีคุณค่ายิ่งต่อวงการดนตรีไทย\n","โครงการ การวิจัยการวิจารณ์ในฐานะปรากฏการณ์ร่วมสมัยเพื่อพัฒนาความรู้ด้านสังคมศาสตร์การวิจารณ์ อันเป็นโครงการวิจัยต่อเนื่องจาก โครงการ การวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัย ภาค 2 ได้ศึกษาวิจัยนักร้องจากวงดนตรีสุนทราภรณ์อีกครั้ง นั่นคือ รวงทอง ทองลั่นธม ซึ่งเป็นศิลปินที่ประสบความสำเร็จในอาชีพนักร้องอย่างมาก และยังคงอาชีพร้องเพลงต่อเนื่องจากอดีตมาจนปัจจุบัน\n","ที่น่าสนใจคือ รวงทอง มิได้เป็นเพียงนักร้องเสียงดี หากรวงทองยังเป็นนักร้องที่มีพรสวรรค์ของศิลปินไม่แพ้พรแสวงแห่งอาชีพของตน ซึ่งทำให้การร้องเพลงของรวงทองมีเอกลักษณ์ เป็นที่ชื่นชอบ และเป็นถึงระดับ “ตำนาน” ของวงการเพลงไทย\n","ผู้ที่ติดตามผลงานเพลงของ รวงทอง ทองลั่นทม หากได้อ่านหนังสือเล่มนี้แล้ว เชื่อว่าคงจะตระหนักชัดยิ่งขึ้นในความสามารถและความไม่หยุดนิ่งในการเรียนรู้ของรวงทอง ส่วนผู้ที่เป็นแฟนเพลงรุ่นใหม่ หรือผู้ที่เกี่ยวข้องกับวงการเพลง การได้ศึกษาเส้นทางชีวิตและผลงานของรวงทอง น่าจะทำให้ได้มองเห็นความมุ่งมั่น และความเป็นอัจฉริยะของรวงทอง อันสามารถนำมาเป็นแบบอย่างที่ดีได้\n","ราคา 90 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1ueCYrpa5nwXHgk2YR1MAJJE1YgbQkWqM/view?usp=sharing\n","ลักษณะร่วมสมัยในงานศิลปะแขนงต่างๆ ทัศนะของศิลปิน\n","หนังสือที่รวบรวมข้อมูลจากการสัมมนาในโครงการ การวิจัยการวิจารณ์ในฐานะพลังทางปัญญาของสังคมร่วมสมัยเพื่อการพัฒนาความรู้ด้านสังคมศาสตร์ โดยมี ผศ. ดร. ธีระ นุชเปี่ยม เป็นหัวหน้าโครงการ\n","ผู้ร่วมสัมมนา คือ\n","อัศศิริ ธรรมโชติ (วรรณศฺลป์)\n","อรรฆ์ ฟองสมุทร (ทัศนศิลป์)\n","ประดิษฐ ปราสาททอง (ศิลปะการแสดง)\n","อมานัต จันทรวิโรจน์ (สังคีตศิลป์)\n","ราคา 90 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่\n","https://drive.google.com/file/d/1o0L-fJuMIJlFScNg9qrf5pDcaMRFqE5k/view?usp=sharing\n","รายงานการวิจัยฉบับสมบูรณ์ โครงการวิจัย การวิจารณ์ในฐานะปรากฎการณ์ร่วมสมัยเพื่อพัฒนาความรู้ด้านสังคมศาสตร์การวิจารณ์\n","สามารถอ่านในรูปแบบ e-book ได้ที่ http://www.thaicritic.com/criticism-ebook/index.html\n","ปัญญา วิจินธนสาร: ปรากฏการณ์ศิลปะไทยร่วมสมัย\n","ในวงการจิตรกรรม ชื่อของปัญญา วิจินธนสาร เป็นที่รู้จักในฐานะจิตรกรผู้สร้างงานแนวศิลปะไทย ที่มีเอกลักษณ์ เป็นที่ยอมรับทั้งใน\n","ประเทศและต่างประเทศ ความสำเร็จของปัญญา วิจินธนสาร มักได้รับการกล่าวถึงในมุมของศิลปินผู้ประสบความสำเร็จ ทั้งผลงานและ\n","รายได้ ทว่าการกล่าวลึกลงไปถึง \"ต้นธาร\" ของความสำเร็จดังกล่าว มีไม่มากนัก โดยเฉพาะการสะสมองค์ความรู้ด้านศิลปะมาสู่\n","กันปรับประยุกต์ศิลปะแบบไทยให้มีความเป็นสากล ซึ่งทำให้ผลงานของปัญญา วิจินธนสาร โดดเด่น แตกต่าง และประสบความสำเร็จ\n","ดังกล่าว และกล่าวได้ว่าเป็นปรากฏการณ์จิตรกรรมไทยร่วมสมัย\n","ปัญญา วิจินธนสาร : ปรากฏการณ์จิตรกรรมไทยร่วมสมัย เป็นการศึกษาวิจัย ปัญญา วิจินธนสาร ในฐานะศิลปินผู้สร้างงาน\n","จิตรกรรมไทยร่วมสมัย ซึ่งทำให้มองเห็นรากเหง้าของศิลปะไทย และมองเห็นกระบวนการของศิลปิน ที่ได้ปรับประยุกต์เทคนิคและวิธี\n","รวมทั้งความคิดในผลงานศิลปะไทยให้เป็นสากล โดยได้รับอิทธิพลจากการไปด้านศึกษาศิลปะจากต่างประเทศ เป็นการศึกษาวิจัยที่มี\n","ความสำคัญยิ่งสำหรับวงการศิลปะไทย\n","ราคา 250 บาท\n","จัดจำหน่ายโดย สำนักพิมพ์ชมนาด ตู้ ป.ณ. 9 ปท. อ่อนนุช กทม. 10250\n","โทรศัพท์ : 0-2368-2689 www.combangweb.com\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/18LVn8paB9K0BlKnRKCAs1QpXmnzN0dYX/view?usp=sharing\n","ทางสายกลางแห่งการวิจารณ์\n","บางส่วนจากคำนำหนังสือ \"ทางสายกลางแห่งการวิจารณ์\" รวมบทความและบทวิจารณ์ของอาจารย์เจตนา นาควัชระ สำนักพิมพ์ openbooks\n","นักวิจารณ์มีอหังการพอที่จะกล่าวอ้างได้หรือว่าเขาเป็นหนึ่งในเสียงแห่งมโนธรรมของสังคม ไม่ว่านักวิจารณ์จะวางตัวไว้สูงหรือต่ำ พวกเขาก็ปฏิเสธไม่ได้ว่าการวิจารณ์เป็นกิจแห่งการประเมินคุณค่า และแม้ว่าจุดเริ่มต้นของการวิจารณ์ในที่นี้จะเป็นคุณค่าที่แฝงอยู่ในศิลปะหรือสื่อความได้โดยผ่านศิลปะ แต่ก็มิใช่จะขีดวงแต่เฉพาะคุณค่าในเชิงสุนทรียะเท่านั้น หากแต่ได้มีการแสดงทัศนะที่ว่าด้วยบริบท ดังเช่นในกรณีของตลาดยุคปัจจุบันที่มุ่งผลเชิงธุรกิจเสียจนไม่ลังเลที่จะบีบบังคับให้เกิดการผลิตงานที่มุ่งปลุกสัญชาตญาณใฝ่ต่ำ\n","ถ้าการวิจารณ์ก่อให้เกิดความสำนึกและการอภิปรายถกแถลงในประเด็นที่กล่าวมานี้ได้ ความสนใจที่มหาชนจะมีให้ต่องานวิจารณ์ ศักยภาพของการคิดเชิงวิจารณ์ ความมุ่งมั่นที่จะสร้างวัฒนธรรมแห่งการวิจารณ์ขึ้นมาให้เป็นพลังทางปัญญาของสังคม อาจเป็นทางให้เราก้าวพ้นจากวังวนของสัญชาตญาณใฝ่ต่ำก็ได้ ถ้าจุดเริ่มต้นคือสุนทรียภาพ ทางสายกลางแห่งการวิจารณ์อาจจะนำเราไปสู่ปลายทางคือจริยธรรมก็ได้\n","จัดทำโดย สำนักพิมพ์ openbooks 286 ถนนพิชัย แขวงถนนนครชัยศรี เขตดุสิต กรุงเทพฯ 10300\n","โทรศัพท์ 02-669-5145 โทรสาร 02-669-5146\n","www.onopen.com\n","onopenon@yahoo.com\n","www.facebook.com/openbooks\n","จากวินทร์ถึงปราบดา: ปรากฏการณ์ของการวิจารณ์วรรณกรรมไทยร่วมสมัย\n","ดาวน์โหลด PDF ไฟล์หนังสือได้ที่ https://drive.google.com/file/d/1YblomWnnkI72GyBa-WcN4EygV21Bxv09/view?usp=sharing\n","\n","doc 2\n","ศูนย์วิจัยกรุงศรี คาดอัตราการติดเชื้อโควิดระลอกล่าสุดในไทยถึงจุดสูงสุดเดือนสิงหาคม worst case อาจทะลุ 2 หมื่นรายต่อวัน | Techsauce\n","TH | EN ส่งบทความ\n","สมัครสมาชิกเพื่อลงบทความ\n","Search TH EN ส่งบทความ Sign in\n","NEWS TECH & BIZ METAVERSE EXEC INSIGHT CORP INNOV SAUCY THOUGHTS VIDEOS PODCAST STARTUP GUIDE OUR SERVICE\n","0\n","110\n","ศูนย์วิจัยกรุงศรี คาดอัตราการติดเชื้อโควิดระลอกล่าสุดในไทยถึงจุดสูงสุดเดือนสิงหาคม worst case อาจทะลุ 2 หมื่นรายต่อวัน\n","กรกฎาคม 19, 2021 | By Techsauce Team\n","ศูนย์วิจัยกรุงศรี คาดอัตราการติดเชื้อโควิดระลอกล่าสุดในไทย จะถึงจุดสูงสุด เดือนสิงหาคม กรณีเลวร้ายที่สุด (worst case) อาจทะลุ 20,000 รายต่อวัน และจะลดต่ำกว่า 1,000 รายต่อวันในเดือนพฤศจิกายน พร้อมปรับลดประมาณการณ์ GDP ปี 2564 ไทยเหลือ 1.2%\n","จากอัตราการแพร่เชื้อในปัจจุบัน แบบจำลองแสดงให้เห็นถึงแนวโน้มของยอดผู้ติดเชื้อโควิด-19 จากการระบาดระลอกล่าสุด โดยจะมีอัตราการติดเชื้อสูงสุดในเดือนสิงหาคม ใน base case ยอดผู้ติดเชื้อจะอยู่ราว 15,000 รายต่อวัน\n","จากการคาดการณ์สถานการณ์ที่แย่ที่สุดในระลอกก่อน ได้กลายมาเป็นสถานการณ์พื้นฐานในระลอกปัจจุบัน เนื่องจากมีผู้ติดเชื้อรายใหม่เพิ่มขึ้นเกือบ 10,000 รายต่อวันตั้งแต่ต้นเดือนกรกฎาคม และที่สำคัญคือ ไวรัสสายพันธุ์เดลตากำลังระบาดหนักและแพร่กระจายไปยังหลายจังหวัด การคาดการณ์ล่าสุดจึงระบุว่า ในอีกไม่กี่เดือนข้างหน้า ผู้ติดเชื้อรายใหม่ในไทยส่วนใหญ่จะเป็นผู้ติดเชื้อสายพันธุ์เดลตาและเบตา\n","ทั้งนี้ใน base case คาดว่าจำนวนผู้ติดเชื้อรายใหม่จะลดลงต่ำกว่า 1,000 รายต่อวันภายในเดือนพฤศจิกายนปีนี้ หากแต่ในกรณีที่เลวร้ายที่สุด ที่วัคซีนจะมีประสิทธิภาพน้อยลง และการล็อกดาวน์ในเดือนกรกฎาคมไม่สามารถควบคุมการระบาดของโรคได้ ผู้ติดเชื้อรายใหม่ก็อาจเพิ่มขึ้นสูงเกิน 20,000 ราย และระยะเวลาการล็อกดาวน์ก็จะนานขึ้นด้วย\n","เนื่องจากจำนวนผู้ป่วยโควิด-19 ในไทยมักเป็นผู้ป่วยที่ติดเชื้อสายพันธุ์เดลตา ซึ่งเป็นสายพันธุ์ที่ร้ายแรง อีกทั้งไทยยังมีเรื่องที่น่ากังวลเกี่ยวกับประสิทธิภาพของวัคซีนและการเข้าถึงวัคซีนที่ล่าช้า แสดงให้เห็นว่ามาตรการล็อกดาวน์อาจยืดระยะเวลาไปจนถึงเดือนตุลาคม\n","ดังนั้นประสิทธิภาพของวัคซีนจึงยังคงเป็นกุญแจสำคัญในการที่จะลดจำนวนผู้ติดเชื้อในแต่ละวันได้\n","แม้ระลอกที่ 3 จะรุนแรงที่สุด แต่มาตรการล็อกดาวน์ในเดือนกรกฎาคมนี้ก็เข้มงวดน้อยกว่าปีที่แล้ว\n","ระลอกที่สามซึ่งเริ่มตั้งแต่เดือนเมษายนที่ผ่านมา ถือเป็นระลอกที่รุนแรงที่สุดของไทย ด้วยจำนวนผู้ติดเชื้อรายใหม่ที่พุ่งสูงถึง 10,000 รายต่อวัน สิ่งนี้กระตุ้นให้รัฐบาลกำหนดมาตรการกักกันที่เข้มงวดมากยิ่งขึ้น โดยกำหนดให้มีการล็อกดาวน์ (บางส่วน) เป็นเวลา 14 วันในเดือนกรกฎาคม\n","ดัชนีความเข้มงวดของมหาวิทยาลัยอ็อกซ์ฟอร์ดเปิดเผยว่า การล็อกดาวน์ในปัจจุบันนั้นเข้มงวดเพียง 81% เช่นเดียวกับในเดือนเมษายนปี 2563 นอกจากนี้ ดัชนีความคล่องตัวของ Google ได้แสดงให้เห็นถึงความแออัดของการจราจรในสถานที่ทำงาน ร้านค้าปลีก และสถานที่พักผ่อนหย่อนใจอยู่ที่ 81.1 (ฐานก่อนเกิดโรคระบาด = 100) และดัชนี Apple Mobility แสดงให้เห็นถึงสภาพการจราจรที่ติดขัดอยู่ที่ 43.4 (ฐานก่อนเกิดโรคระบาด = 100) ซึ่งหมายความว่าตัวบ่งชี้การเคลื่อนไหวล่าสุดนั้นสูงกว่าช่วงปิดเมืองทั้งหมด 14% ในเดือนเมษายนปี 2563 สำหรับสถานที่ทำงานและร้านค้าปลีก และเพิ่มขึ้น 40% สำหรับการจราจร\n","นอกจากนี้ คาดว่าการล็อกดาวน์ในเดือนกรกฎาคมนี้จะมีผล 70% เท่ากับการล็อกดาวน์ในเดือนเมษายนปี 2563 โดยผู้ติดเชื้อรายใหม่จะเพิ่มขึ้นเป็น 15,000 คน/วัน ภายในต้นเดือนสิงหาคม และคาดว่าประเทศไทยจะจัดสรรวัคซีนจำนวน 250,000 โดสต่อวันให้กับประชาชน โดยจะฉีดวัคซีนทั้งหมดให้ครบ 55 ล้านโดสภายในสิ้นปี ซึ่งอาจช่วยลดจำนวนผู้ติดเชื้อรายใหม่ในแต่ละวันได้ โดยเฉพาะตั้งแต่เดือนกันยายนเป็นต้นไป\n","ปรับลดคาดการณ์ GDP ปี 2564 เหลือ 1.2% สะท้อนถึงการระบาดหนักของโควิด-19 ในไทย\n","การแพร่ระบาดของโรคโควิด-19 ครั้งล่าสุด ส่งผลให้เกิดผลกระทบเชิงลบอย่างใหญ่หลวงมากกว่าการได้กำไรจากการสนับสนุนนโยบายที่จำกัดการส่งออกที่เข้มงวด โดยผลกระทบสุทธิต่อการเติบโตของ GDP ของไทยจะอยู่ที่ลบ 0.8 ทำให้การคาดการณ์อัตราการเติบโตของทั้งปีนี้อยู่แค่ 1.2% เท่านั้น ซึ่งเพิ่มจากการคาดการณ์ครั้งก่อนหน้านี้ 2.0% ชี้ให้เห็นว่าเศรษฐกิจไทยอาจเข้าสู่ภาวะถดถอยทางเทคนิคในไตรมาสที่ 3 จากการแพร่ระบาดที่เลวร้ายลงเรื่อย ๆ นับตั้งแต่ช่วงวันหยุดสงกรานต์ที่ผ่านมา\n","นอกจากนี้ ยังมีการปรับลดจำนวนนักท่องเที่ยวต่างชาติและการบริโภคของภาคเอกชนในปี 2564 ทว่าเพิ่มการคาดการณ์การเติบโตของการส่งออก ทำให้เรามองเห็นการฟื้นตัวรูปตัว K แบบเป็นรูปเป็นร่างขึ้น\n","การแพร่ระบาดที่รุนแรงและยาวนานเกิดคาดในไทย ประกอบกับสายพันธุ์เดลตาที่กำลังแพร่ระบาดในหลาย ๆ ประเทศ ทำให้จำนวนนักท่องเที่ยวต่างชาติในปี 2564 ลดลงเหลือ 210,000 คน (จาก 330,000 คน) และลดการเติบโตของการบริโภคภาคเอกชนลงเป็น +1.1% จาก +1.8% อย่างไรก็ตาม ได้มีการปรับเพิ่มการคาดการณ์การเติบโตของการส่งออกในปีนี้ (ตามข้อมูลของ ธปท.) เป็น +15% จาก +9.5% โดยการหมั่นส่งออกสินค้าจะช่วยบรรเทาผลกระทบบางส่วนต่อการผลิตภาคอุตสาหกรรมและการลงทุนทางธุรกิจได้\n","ทั้งนี้ ธปท. ยังมีแนวโน้มคงอัตราดอกเบี้ยนโยบาย เพื่อบรรเทาสถานการณ์อันเลวร้ายด้วยการกระตุ้นที่ตรงเป้าหมายมากขึ้น โดย ธปท. จะคงอัตราดอกเบี้ยนโยบายไว้ที่ระดับต่ำสุดในประวัติการณ์ทั้งในปีนี้และปีหน้า เนื่องจากการฟื้นตัวของเศรษฐกิจไทยมีความเปราะบาง และอาจต้องใช้เวลานานกว่าจะสามารถฟื้นตัวได้ในวงกว้าง\n","สำหรับนโยบายการเงินแบบกำหนดเป้าหมาย ความช่วยเหลือทางการเงินในปัจจุบันได้รับการออกแบบมาเพื่อแก้ไขปัญหาก่อนเกิดการระบาดครั้งล่าสุด โดยชี้ให้เห็นถึงความจำเป็นในการกระตุ้นทางการเงินที่ตรงเป้าหมายมากขึ้น เพื่อช่วยเหลือกลุ่มที่ได้รับผลกระทบรุนแรงและเพื่อป้องกันการกระทบกับเศรษฐกิจในระยะยาว\n","อ่านวิจัยฉบับเต็มได้ที่ Krungsri\n","News\n","covid-19\n","lockdown\n","krungsri research\n","RELATED ARTICLE\n","บจ. mai เผยผลการดำเนินงาน 9 เดือนแรก ปี 65 ยอดขายรวม 153,582 ลบ. กำไรรวม 6,572 ลบ.\n","บริษัทจดทะเบียน (บจ.) ในตลาดหลักทรัพย์ เอ็ม เอ ไอ (mai) รายงานผลการดำเนินงานงวดสะสม 9 เดือน ปี 2565 มียอดขายรวม 153,582 ล้านบาท เพิ่มขึ้น 23.8% ขณะที่กำไรจากการดำเนินงานรวม 8,136 ล...\n","พฤศจิกายน 28, 2022 | By Techsauce Team\n","0\n","News\n","mai\n","เปิดตัว Thailand Accelerator พร้อมผนึก 25 พันธมิตร มุ่งช่วย Startup ระดมทุน\n","ครั้งแรก! ในประเทศไทยกับการเปิดตัวโครงการ “Thailand Accelerator” มุ่งเน้นช่วยให้สตาร์ทอัพไทยและภูมิภาคเอเชียตะวันออกเฉียงใต้ระดมทุนได้ และเร่งให้เติบโตอย่างรวดเร็ว ภายใต้การผนึกกำล...\n","พฤศจิกายน 28, 2022 | By Techsauce Team\n","0\n","News\n","startup\n","techsauce\n","thailand-accelerator\n","มัดรวมแผนงานชุดใหญ่ที่ ‘depa’ มุ่งทำตามแนวคิด Digital Infinity\n","สำนักงานส่งเสริมเศรษฐกิจดิจิทัล หรือ ดีป้า มาเผยความเปลี่ยนแปลงที่จะเกิดขึ้นกับคนไทย สังคมและเศรษฐกิจประเทศไทย หลังจากมุ่งส่งเสริมการใช้นวัตกรรมดิจิทัล การพัฒนาคนที่มีทักษะดิจิทัล ...\n","พฤศจิกายน 28, 2022 | By Techsauce Team\n","0\n","News\n","depa\n","digital\n","ecosystem\n","110\n","แก้ไขบทความ\n","×\n","เมื่อท่านได้ทำการแก้ไขบทความแล้ว ระบบจะส่งบทความของท่านเข้าสู่กระบวนการตรวจสอบโดย Techsauce Team อีกครั้ง\n","\n","doc 3\n","หากท่านพบเห็นการกระทำ หรือพฤติกรรมใด ๆ ที่ไม่เหมาะสม ซึ่งอาจก่อให้เกิดความเสื่อมเสียแก่สถาบันชาติ ศาสนา พระมหากษัตริย์ รวมถึง การใช้ข้อความที่ไม่สุภาพ พฤติกรรมการหลอกลวง การเผยแพร่ภาพลามก อนาจาร หรือการกระทำใด ๆ ที่อาจก่อให้ผู้อื่น ได้รับความเสียหาย กรุณาแจ้งมาที่ feedback@sanook.com\n","\n","doc 4\n","SHKD-982 : jav xxx พนักงานสาวแคชเชียร์ร้านสะดวกซื้อมาใหม่เพิ่งทำงานวันแรก เธอก็ต้องมาเจอเพื่อนร่วมงานสายหื่นมันเห็นเธออยู่คนเดียวก็พุ่มเข้ามากระชากเสื้อเธอออกแล้วเล้าโลมpornjapanของเธอและบังคับให้เธออมควยมันเอวีญี่ปุ่นจนพอใจแล้วลากเธอมาเย็ดอย่างแรงหลายยวันต่อมามันเงี่ยนอยากเย็ดสาวนมใหญ่มันเข้าหาเธอตอนเธอจัดของแล้วพยายามข่มขืนเธออีกกลางร้านสะดวกซื้อ\n","\n","doc 5\n","ยุทธศาสตร์การดำเนินงานสถาบันพัฒนาองค์กรชุมชน (องค์การมหาชน) พ.ศ. 2560 – 2564 04 กุมภาพันธ์ 2562 เขียนโดย งานสื่อสารเพื่อการพัฒนา ฮิต: 7367\n","\n","doc 6\n","หน้าแรก » ทัวร์ทั้งหมด » เนปาล » ทัวร์ EBC Gokyo Trek ข้าม Cho La Pass และ Renjo La Pass 18 วัน + ไกด์หญิงไทย\n","ราคา ฿71,900\n","ทัวร์ EBC Gokyo Trek ข้าม Cho La Pass และ Renjo La Pass ที่ไม่เหมือนใคร + จัด 18 วันเพื่อความปลอดภัยในเรื่อง AMS และ ความสนุกเต็มที่ที่มากขึ้น\n","1 – 18 เม.ย. 2566 (18 วัน)\n","ไม่ออกเดินทางไป Manthali ตอนตี 2 + เดินทางด้วย “รถส่วนตัว” ไม่ใช่รถสาธารณะ\n","มี cheklist แจก + ช่วยตรวจอุปกรณ์ + ให้คำปรึกษาแนะนำ + พาเลือกช้อป/เช่าของที่เนปาล ให้ได้ของครบและพร้อมที่สุด\n","ประเภทการท่องเที่ยว\n","แอดเวนเจอร์\n","ประเภทกิจกรรม\n","เทรคกิ้ง\n","จำนวนสมาชิก\n","9 ท่าน\n","รีวิว & ความในใจคุณลูกค้า\n","0 รีวิว\n","สถานที่\n","เนปาล\n","วันที่ออกเดินทาง\n","1 เมษายน 2023\n","สำรองที่ พร้อมลุย!\n","คำถามเพิ่มเติมเกี่ยวกับทริป หยกพร้อมตอบค่ะ\n","ชื่อ-สกุล *\n","อีเมล *\n","คำถามเพิ่มเติม\n","Trip code ST-NEP-09\n","พิเศษ: ให้คำปรีกษาแนะนำ + พาช้อป/เช่าของ ระยะเวลา: 18 วัน (เทรคกิ้ง 13 วัน) ความสูงสูงสุด: Kalapatthar 5648 m ราคานี้รวม: BF + ที่พักในเมือง 3 คืน ราคานี้รวม: ตั๋วเครื่องไป Lukla, รถส่วนตัว ราคานี้ไม่รวม: ตั๋วเครื่องจากไทย, วีซ่า, ประกัน\n","ภาพรวม\n","โปรแกรม\n","ราคานี้รวม\n","ราคานี้ไม่รวม\n","รูปภาพ\n","ราคา\n","คำถามที่พบบ่อย\n","ทัวร์ EBC Gokyo Trek ข้าม 2 พาส คือ Cho La และ Renjo La Pass (อ่านรีวิว EBC Trek และข้อมูลเทรคที่หยกไปมาได้ที่ลิ้งค์นะคะ) ที่ใครๆ ว่ายากและท้าทายสุดๆ จะง่ายขึ้นกว่าไปกับคนอื่น และ สนุกมากขึ้นกับโปรแกรมการเดินที่หยกออกแบบเอง ให้ไม่โหดเกินไป ให้ปลอดภัย และ หลีกเลี่ยง AMS เพื่อนๆ จะได้เทรคสนุกเต็มอิ่ม ไร้ความกังวล ทั้งหยกยังเลือกที่พักแต่ละหมู่บ้านเองด้วยนะคะ\n","มือใหม่พึ่งเริ่มเทรค หรือ เพื่อนๆ ที่ไม่มีประสบการณ์ก็สามารถมาเทรคได้นะคะ (แต่ต้องมีการเตรียมตัวที่ดีและถูก ฟิตมาพอสมควร หยกให้คำแนะนำได้ค่ะ) หยกจะพาเทรคและดูแลอย่างดีเลยค่ะ\n","ทำไมต้องมา ทัวร์เทรคกิ้งเนปาล กับหยก?\n","ความยากง่าย? มือใหม่เทรคได้ไหม?\n","ลักษณะการเดิน\n","เส้นทางเดียวกัน แต่ไปกับกลุ่มคนต่างกัน ประสบการณ์ที่ได้ก็ต่างกันนะคะ ยิ่งมีหยกจัดการทริปและพาเทรคเองด้วยแล้ว คุณภาพล้วนๆ ความสนุกเต็มล้นเลยนะคะ\n","มาค่ะ มาดูความน่าสนใจบนเส้นทางนี้ที่หยกจัดให้เพื่อนๆ กันค่ะ\n","1. ทำไมต้องมา ทัวร์เทรคกิ้งเนปาล กับหยก?\n","หยกนำทริปพาเพื่อนๆ เทรคด้วยตัวเองเลยค่ะ จะมีทัวร์เทรคกิ้งเนปาลสักกี่ทัวร์กัน ที่มีคนไทยพาเทรค!?\n","ประสบการณ์ที่เพื่อนๆ จะได้จะไม่เหมือนไปกับคนอื่นอย่างแน่นอน ด้วยทุกเส้นทางที่หยกออกแบบเองอย่างพิถีพิถัน และ ใส่ใจ กับทุกรายละเอียด ทั้งการเลือกที่พักเอง และ เลือกหมู่บ้านที่จะพักเอง และ พาเทรคเอง\n","หยกออกแบบแผนการเดินเองค่ะ ให้เดินกันได้สบายหน่อย ให้ได้อิ่มเอมกับบรรยากาศระหว่างการเดินในแต่ละที่ แต่ละวัน ได้อย่างเต็มที่ ทั้งหยกยังหลีกเลี่ยงการเดินขึ้นที่สูงๆ อย่างรวดเร็ว เพื่อหลีกเลี่ยงการเกิด AMS ให้มากที่สุด เพื่อที่เพื่อนๆ จะได้ไม่ต้องมีอาการปวดหัว ทรมาน นอนไม่หลับ หรือ ทานอาหารไม่ได้ จนหมดสนุก\n","ระหว่างเทรค หยกยังจะคอยแนะนำทริคต่างๆ เช่น การปรับไม้เท้าเดินป่า สำหรับทางชัน, ทางลาด และ ทางเรียบ หรือ การสะพายกระเป๋าให้ไม่เจ็บหลังและไหล่ หรือ การดูแลตัวเองเพื่อนหลีกเลี่ยง AMS เป็นต้น\n","รวมทั้ง เรื่องเล็กๆ น้อยๆ แต่สำคัญอย่างเช่น เรื่อง อาหารระหว่างเทรคค่ะ แต่ละจานคืออะไร ทำจากอะไร หน้าตาแบบไหน รสชาติประมาณไหน ทานอะไรดี เพื่อที่เพื่อนๆ จะได้เลือกสั่งอาหารได้อย่างสบายใจ\n","มีการพูดคุยกับเพื่อนๆ แบบส่วนตั๊วส่วนตัวก่อนออกทริป เพื่อให้เพื่อนๆ ได้ปรึกษา สอบถามสิ่งต่างๆ ที่เพื่อนๆ สงสัยและไม่แน่ใจ ทั้งยังมีการแนะนำการเตรียมตัว การเตรียมอุปกรณ์ต่างๆ แบบที่เพื่อนๆ สามารถยิงคำถามมาได้เลยค่ะ หยกยินดีทั้งตอบ ทั้งอธิบายให้เพื่อนๆ ได้เข้าใจอย่างถ่องแท้เลยนะคะ\n","ให้คำแนะนำปรึกษาเรื่องการเตรียมตัวเตรียมอุปกรณ์ด้วยตัวหยกเองอย่างละเอียด ถามแบบแชทต่อแชทได้เลยค่ะ\n","มีแจกเอกสาร check list ของที่ต้องเตรียม และ ข้อควรรู้ต่างๆ ให้เหมาะสมกับแต่ละเส้นทาง แต่ละสภาพอากาศ เพื่อให้เพื่อนๆ ได้เตรียมตัวอย่างดีและพร้อมที่สุด\n","หยกจัดทำเอกสารต่างๆ ด้วยตัวเอง ให้เหมาะสมกับแต่ละเส้นทาง และ ช่วงเวลาที่ไป\n","ช่วยเรื่องวีซ่า\n","แนะนำเรื่องซิมการ์ดที่เนปาล\n","พาไปแลกเงินร้านเรทดีๆ ที่เนปาล\n","แนะนำงบที่ควรพกไป\n","และอื่นๆ อีกมากมายที่ไม่มีบริษัททัวร์ไหนทำ\n","หยกพาไปเลือกซื้อ/เช่าอุปกรณ์เทรคกิ้งที่เนปาล ให้เพื่อนๆ ได้เลือกของที่โดนใจ ตรงการใช้งาน ในราคาประหยัด ตะเวนช้อป พากันเลือก พากันลอง ช้อปกันมันส์ หมดวันไม่รู้ตัวเลยค่ะ\n","หยกจะตรวจอุปกรณ์ของทุกท่านในทริปก่อนเดินทาง พร้อมทั้งคอยให้คำแนะนำ อธิบาย พาเดิน และ ช่วยเลือกซื้อ/เช่าของที่เนปาล เพื่อหาอุปกรณ์ที่ขาด\n","นอกจากนี้ เนื่องจากสภาพอากาศบนเขานั้นคาดการณ์ไม่ได้ ซึ่งหยกจะตรวจสภาพอากาศในช่วงนั้นๆ ก่อนเดินทางอีกที ดังนั้นแล้ว ของบางอย่างหยกจะให้พกไปเพื่อไว้นะคะ เพราะเราไม่สามารถหาของเหล่านี้บนเขาได้ ซึ่งหากได้ใช้งาน คือเพื่อนๆ จะแฮปปี้และดีใจมากๆ ที่พกมา แต่หากไม่ได้ใช้ ก็ไม่เป็นนะคะ เพราะเท่ากับว่า เราได้เตรียมตัวไปดีพร้อมสุดๆ แล้วค่ะ\n","หยกไม่ได้แค่พาไป EBC แต่หยกจะพาไป Kalapathar (มีจุดเริ่มเดินอยู่ที่หมู่บ้านเดี่ยวกัน) ที่อยู่สูงกว่า เดินสนุกกว่า มีวิวสวยกว่า และยังมองเห็นยอดเขา Everest อีกด้วยค่ะ\n","หยกเลือกที่พักบนเขาแต่ละที่แต่ละวันแต่ละหมู่บ้านด้วยตัวเองค่ะ\n","จากทริปที่หยกเทรคมาเมื่อ กลางธันวาคม 2564 - กลางมกราคม 2565 ค่ะ หยกได้สำรวจที่พักหลายๆ ที่ บางที่เดินหาที่พักนานถึง 1.5 ชั่วโมงเลยค่ะ แล้วเลือกแล้วคัดมาแล้วว่าน่าพักที่สุด สะอาด วิวดี อุ่น เจ้าของที่พักเป็นมิตร และ ที่สำคัญอาหารอร่อย จนเพื่อนๆ จะแปลกใจมากว่าเราอยู่บนเขาจริงไหม ทำไมสบายและกินดีกว่าที่คิด อิอิ\n","นอกจากนั้น หยกยังเลือก ไกด์เนปาล เอง และ ให้ partner ที่เนปาลจัดหา ลูกหาบ ตามเงื่อนไขที่หยกต้องการเอง อีกด้วยนะคะ ใช่ค่ะ ระยะเวลาทั้งทริปของการเทรคกิ้ง 13 วันต้องมีความสุข มีคุณค่า ไม่มีอะไรมากวนใจนะคะ\n","เพื่อนๆ มีอิสระในการเลือกทานอาหารที่อยากทานเอง โดยหยกจะให้คำแนะนำร้านอาหารประเภทต่างๆ ในเมือง และอาหารประเภทต่างๆ บนเขา ที่รับรองว่าการมาเที่ยวครั้งนี้ เพื่อนๆ จะไม่ได้แค่การเทรคกิ้ง แต่จะได้อยู่ ได้กินอย่างสุดสบายสุดๆ\n","ลองทักมาคุยกันสิคะ แล้วเพื่อนๆ จะทราบได้เองเลยว่า อยากไปเทรคด้วยกันมากแค่ไหน :) LINE ID: sanooktiew\n","2. ความยากง่าย? มือใหม่เทรคได้ไหม?\n","เทรคกิ้งในเขต Everest หรือ Khumbu นี้ยากและท้าทายค่ะ หากเตรียมตัวมาดี (เตรียมกาย) และ ทำการบ้านเข้าใจเส้นทางการเดิน สภาพอากาศที่หนาวมากและแห้งมาก มาบ้าง (เตรียมใจ) เพื่อจะได้เตรียมอุปกรณ์ให้ครบและพร้อมที่สุด (เตรียมของ) ก็สามารถเทรคเส้นทางนี้ได้ค่ะ\n","เมื่อ กาย + ใจ + อุปกรณ์พร้อม มือใหม่ที่ยังไม่เคยเทรคก็จะสามารถเริ่มเทรคเส้นทางนี้ได้เช่นกันค่ะ\n","ลักษณะเส้นทางเดินมีสลับกันไปค่ะ ตั้งแต่เดินง่ายๆ ชิวๆ ไปจนกลางๆ และ ค่อนไปทางยากๆ เดินชันๆ สูงๆ ระยะทางเดินสั้นๆ กลางๆ ไปจนถึง เดินนานๆ ทำให้วันเดินของเรามีความหลากหลายค่ะ ส่วนใหญ่แล้ววันที่จะยากและยาวนานหน่อยจะเป็น\n","วันที่เดินไป Kalaphatthar เพราะสูงถึง 5644 m และในวันเดียวกันนี้ ยังต้องเดินต่ออีก 4 ชั่วโมง\n","วันข้ามพาส โดยเฉพาะ Cho La Pass ซึ่งยากและเดินนานกว่า Renjo La Pass ค่ะ\n","คืนที่ต้องนอนค้างที่ Lobuche 4910 m และ Gorak Shep 5140 m ซึ่งจะเป็นสองคืนที่เรานอนสูงที่สุด ทั้งออกซิเจนที่เบาบาง และ อากาศที่หนาวมากๆ แบบติดลบเลยค่ะ\n","ส่วนวันอื่นๆ นั้น เมื่อเทียบกับมาตรฐานเทรคกิ้งเนปาล ก็ถือว่า กลางๆ ค่ะ ส่วนตัวหยกว่าเดินสบายนะคะ\n","ดังนั้น สำหรับมือใหม่ที่มีการเตรียมความพร้อมมาสักหน่อย สามารถเริ่มเทรคบนเส้นนี้ได้ค่ะ\n","ทัวร์ EBC Gokyo Trek ข้าม 2 พาส คือ Cho La และ Renjo La Pass นี้ เราจะเดินกันบนความสูงที่สูงเกิน 4,000 เมตร ถึง 9 วัน (จากวันเดินทั้งหมด 13 วัน) นี้เลยเป็นเหตุผลที่หยกใช้คำว่า \"เส้นนี้ค่อนข้างท้าทาย\" เพราะเรื่องความสูง ออกซิเจนที่น้อย อากาศที่หนาว ทั้งสัมพันธ์กับความเสี่ยงของการเกิด AMS ด้วยค่ะ\n","ทั้งนี้ หากเส้นทางเดินถูกออกแบบ แบบไม่เร่งรีบ คือ ไม่ขึ้นถึงที่สูงๆ เร็วเกินไป เช่น เดินขึ้นไปค้างคืนที่ความสูง 4,400 เมตร ในวันที่ 3 ซึ่งแบบนี้ไม่ดีค่ะ (หยกไม่จัดแน่ค่ะ)\n","โดยทั่วไปแล้ว ร่างกายของคนเราจะสามารถปรับตัวเองให้เข้ากับสภาพอากาศบนที่สูงเองได้ค่ะ แต่ยังต้องอาศัยความร่วมมือเล็กๆ น้อยๆ จากตัวเพื่อนๆ เองด้วยนะคะ เช่น ระยะเวลา ทานอาหารให้ครบ 3 มื้อ, ดื่มน้ำเยอะๆ, เมื่ออยู่สูงๆ ไม่วิ่งหรือเดินเร็วเกินไป, พักผ่อนนอนหลับให้เต็มที่ และ สำรวจอาการตัวเองอยู่ตลอดเวลาค่ะ\n","*จากประสบการณ์ หยกยังไม่เคยประสบปัญหา AMS แบบรุนแรงนะคะ มีแค่ปวดหัวเบาๆ และ นอนไม่หลับ แค่นั้นเองค่ะ\n","**เราสามารถ AMS หลีกเลี่ยงได้ง่ายมากๆ ด้วยตัวของเราเอง โดยไม่จำเป็นต้องทานยาเพื่อป้องกันเลยนะคะ\n","3. ลักษณะการเดิน\n","เส้นทาง EBC Gokyo Trek ข้าม 2 พาส คือ Cho La และ Renjo La Pass นี้จะมีจุดเริ่มเดินและจุดสิ้นสุดอยู่ที่หมู่บ้านเดียวกัน คือ Lukla ค่ะ (โดยที่เราจะเดินทางไป Lukla ด้วยเครื่องบิน) ดังนั้นแล้ว ขาไปเราจะเดินกัน 2 วันจาก Lukla ไป Namche Bazaar จากนั้นจะเดินเป็นลูปวกเข้า Namche Bazaar แล้วเดินกลับลงทางเดิมจาก Namche Bazaar ไป Lukla อีก 1 วันค่ะ\n","ทัวร์ EBC Gokyo Trek ข้าม 2 พาส คือ Cho La Pass และ Renjo La Pass\n","หยกนำเทรคเองทุกทริปนะคะ\n","หยกไม่ใช่คนจัดเที่ยวมืออาชีพ แต่หยกเป็นนักเดินทาง เลยรู้ว่าเที่ยวให้สนุกต้องเที่ยวยังไง ไปดูแผนคร่าวๆ พร้อมรูปภาพงามๆ เป็นน้ำจิ้มกับ 18 วัน ที่เราจะอยู่ด้วยกัน ที่เราจะเที่ยวแบบเพื่อนไปเที่ยวด้วยกัน ที่ด้านล่างนี้เลยค่ะ\n","* ที่นี่คือเนปาล อะไรก็เกิดขึ้นได้ ไม่ว่าจะเป็นรถติด ปิดถนน รถไม่ออก ฝนตก ฟ้าปิด พายุเข้า ผิดแผน ออกนอกเส้นทาง ไฟท์ล่าช้า เครื่องไม่บิน ตกลงแต่ไม่ตกลง พูดว่าใช่แต่ส่ายหน้า ทำอาหารนาน เป็นต้น จงยอมรับและมีความสุขกับสิ่งเหล่านี้ที่เราควบคุมไม่ได้ ด้วยการเปิดตาเปิดใจ อะไรที่ผิดแผน ไม่เป็นไปดั่งที่วางแผนไว้ ก็ทำการปรับเปลี่ยนใหม่ไปตามสถานการณ์นั้นๆ ให้ได้ประสบการณ์ใหม่ๆ ที่ไม่คาดหวัง และสนุกสนานด้วยกันนะคะ\n","** แผนการเดินทางอาจมีการเปลี่ยนและ/หรือปรับเปลี่ยนให้เหมาะสมกับสถานการณ์ ณ ขณะนั้น\n","*** การเดินทางท่องเที่ยวทุกประเภทนั้นมีความเสี่ยง ไม่ว่าจะเป็นอุบัติเหตุต่างๆ ทั้งจากตัวเราเอง และ/หรือสิ่งรอบข้างที่คาดการณ์ไม่ได้ ดังนั้นแล้ว หยกขอปฏิเสธข้อเรียกร้องและความรับผิดชอบใดๆ ที่อาจเกิดขึ้นจากท่องเที่ยวตลอดทั้งทริป ไม่ว่าจะด้วยเหตุผลใดก็ตาม โดยถือว่าเพื่อนๆ ผู้ร่วมทริปนั้นตกลงใจในความรับผิดชอบกับสิ่งที่อาจเกิดขึ้นใดๆ ด้วยตัวเองนะคะ\n","แผนการเดินทาง ลุย!\n","Day 0\n","เดินทาง ไทย - เนปาล หยกเรียก day 0 เพราะวันนี้เรายังไม่มีกิจกรรมใดๆ ค่ะ\n","การผจญภัยกำลังจะเริ่มต้นขึ้นแล้วค่ะ เดินทางด้วยสายการบินที่เพื่อนๆ จองมา หยกรอรับที่สนามบินนะคะ ตื่นเต้นๆๆ แล้วค่ะ\n","เข้าที่พัก เช็คอินให้เรียบร้อย จากนั้น หยกจะพาไปแลกเงินค่ะ โดยหยกจะเลือกร้านที่เรทดีที่สุดให้นะคะ\n","Day 1\n","ช้อปปิ้ง เลือกซื้อ/เช่าอุปกรณ์เทรคกิ้ง | เดินทางด้วย \"รถส่วนตัว\" สู่เมือง Manthali\n","ลุยทาเมล เริ่มด้วยการช้อปปิ้ง หรือ เช่าอุปกรณ์เทรคกิ้ง หากใครอยากจะช้อปของฝาก ของที่ระลึกเลยก็ไม่ว่ากันค่ะ หยกจะพาเพื่อนๆ ไปเลือกซื้อของ ลุยกันทุกร้านเลยค่ะ พร้อมพาไป เช่าถุงนอน (ขนห่านแท้), เสื้อหนาวดาวน์ (ขนห่านแท้) และ ไม้เท้าเดินป่า (ให้เพื่อนๆ ได้เลือกของด้วยตัวเอง) จากนั้นจะพาไปช้อป ช่วยเลือก และ ให้คำแนะนำอุปกรณ์เทรคกิ้งอุปกรณ์กันหนาวต่างๆ ที่จำเป็นค่ะ\n","ตามด้วยการช้อปของกิน ของใช้ที่เป็นประโยชน์ระหว่างเทรค เช่น water purification tablets, snickers, energy bar, ขนมต่างๆ และกระดาษชำระ เป็นต้น\n","ตารางเดินทางวันนี้อาจมีการเปลี่ยนแปลงนะคะ ขึ้นกับว่าจะมีเที่ยวบินไป Lukla จากที่ไหน (Kathmandu หรือ Manthali) ถ้าจาก Manthali เวลาประมาณ 13.00 - 14.00 น. เราจะออกเดินทางด้วย \"รถส่วนตัว\" สู่เมือง Manthali ค้างคืนที่นี่ เพื่อเตรียมบินไป Lukla เช้าวันถัดไปค่ะ\n","Day 2\n","ออกเดินทางด้วยเครื่องบิน Manthali - Lukla (30 min) | Lukla 2850 m - Chumoa 2555 m (5 hr)\n","ตารางเดินทางวันนี้อาจมีการเปลี่ยนแปลงนะคะ ขึ้นกับว่าจะมีเที่ยวบินไป Lukla จากที่ไหน (Kathmandu หรือ Manthali) ถ้าจาก Kathmandu เราก็จะออกเดินทางเช้ามืด เพื่อไปรถขึ้นเครื่องที่ สนามบินตรีภูวัน ค่ะ\n","เมื่อถึง Lukla 2850 m ก็ออกเริ่มเดินกันเลยค่ะ ทางเดินวันนี้ไม่ยากนะคะ จะไปค้างกันที่หมู่บ้านเล็กๆ น่ารักๆ บรรยากาศดี เงียบสงบที่ Chumoa (ไม่ค่อยมีทัวร์ไหนพักที่นี่ค่ะ) เพื่อนๆ จะหลงรักที่นี่แน่นอนค่ะ\n","Day 3\n","Chumoa 2555 m - Namche Bazaar 3440 m (4.5 hr)\n","08.00 น. ถ้าอากาศดี ฟ้าเปิด เราก็จะได้บินกันตามแพลนนะคะ เมื่อถึง Lukla ก็จะแวะทานอาหารเช้าเติมพลังกันค่ะ แล้วก็เริ่มเทรคกันเลยนะคะ วันนี้เดินกันวันแรกก็จะยากๆ หน่อยเป็นธรรมดาค่ะ ค่อยๆ ไปกันนะคะ วันนี้จะไปค้างที่ Namche 3440 m เลยค่ะ โดยที่วันนี้เพื่อนๆ จะมองเห็นคุณยอดเขา Everest ด้วยนะคะ (เห็นแค่ยอดจริงๆ ค่ะ) ค่อยๆ เดินกันไปเรื่อยๆ ค่ะ\n","ที่พักที่ Namche หยกเลือกมาอย่างดีค่ะ (หยกเลือกที่พักด้วยตัวเองตลอดเส้นทางเลยนะคะ) ตอนไปสำรวจ คือ เดินหาที่พักเข้าๆ ออกๆ หลายที่ นาน 1.5 ชั่วโมงเลยค่ะ จนได้ที่พักกีๆ ที่นี่มา ห้องพักมีวิวดีๆ อุ่น อาหารอร่อยมากๆ ค่ะ วันนี้ยังมีเนื้อสัตว์ให้ทานนะคะ อิอิ\n","Day 4\n","Acclimatization Day ที่ Namche Bazaar 3440 m\n","คืนนี้นอนนี่อีก 1 วันค่ะ เพื่อช่วยให้ร่างกายปรับตัวกับสภาพอากาศบนที่สูงให้ได้ดีขึ้น ช่วยในเรื่องของ AMS เราจะเดินเล่นกันไปยังจุดชมวิวสวยๆ วิวดีๆ เหนือหมู่บ้าน Namche ที่สูงประมาณ 4,065 เมตร เพื่อชมวิวยอดเขา Everest ยอดเขาอื่นๆ และที่สำคัญคือเพื่อ acclimatization หลีกเลี่ยง AMS กันค่ะ\n","Namche Bazaar เป็นหมู่บ้านที่ใหญ่มาก มีทุกย่างที่ต้องการ มีร้านค้ามากมาย เผลอๆ ของเยอะกว่า Thamel ซะอีกนะคะ ช้อปปิ้งได้สนุกเลยค่ะ ทั้งยังมีร้านเบเกอรี่ และ ร้านคาเฟ่หลายร้าน มีมุมถ่ายรูปมากมาย เพลินเลยค่ะ\n","Day 5\n","Namche Bazaar 3440 m - Phortse 3810 m (6 hr)\n","07.30 น. วันนี้จะได้เห็นหิมาลัยสวยๆ หลายพีคเลยนะคะ ไม่ว่าจะเป็น Amadablam, Lhotse รวมทั้ง Everst ด้วยค่ะ โดยจะพาแวะร้านเบเกอรี่วิวภูเขางามๆ เติมพลัง หรือ ซื้อเสบียงไว้เดินก็ได้เช่นกันค่ะ\n","วันนี้จะเจอ Napali Flat เยอะหน่อยนะคะ ขึ้นๆ ลงๆ แต่แค่ช่วงสั้นๆ ค่ะ ไม่โหดมากนะคะ ถ้าไม่เจอ เดี๋ยวจะหาว่ามาไม่ถึงเนปาลค่ะ อิอิ\n","เพื่อนๆ อาจได้เจอ Danphe หรือ ไก่ฟ้าหิมาลัย ที่ตัวผู้นั้นมีสีสันสดใสนีออนสุดๆ ด้วยนะคะ และอาจจะได้เจอ Musk Deer อีกด้วยค่ะ\n","Day 6\n","Phortse 3810 m - Dingboche 4410 m (5.5 hr)\n","07.00 น. ทางเดินออกจาก Phortse นี่คือทางเดินช่วงโปรดของหยกเลยนะคะ หยกว่าเดินง่าย เดินสนุก และสวยมากๆ ค่ะ โดยที่การเดินช่วงแรกๆ อากาศจะหนาวหน่อยนะคะ เพราะเราอยู่สูงและแสงแดดยังส่องมาไม่ถึง เดินไปเรื่อยๆ เราอาจได้เห็น Himalayan Tahr หรือ แพะหิมาลัย ฝูงใหญ่ๆ ที่ใหญ่ มีเขาสวย ทั้งบางตัวยังมีขนที่มีเอกลักษณ์คล้ายๆ สิงโตด้วยค่ะ วันนี้มีคุณพี่ Amadablam เดินเป็นเพื่อนค่ะ ยอดเขาสูงชะลูดมีเอกลักษณ์และสวยมากๆ ค่ะ\n","แวะทานอาหารเที่ยงกันที่ความสูงประมาณ 4,000 m กับร้านอาหารวิวดีๆ acclimatize ปรับตัวกันต่ออีกสักนิด ก่อนเดินต่อไปค้างที่ Dingboche 4410 m ค่ะ\n","Day 7\n","Acclimatization Day: Dingboche 4410 m\n","วันนี้เป็นวันที่ช่วยให้ร่างกายปรับตัวกับสภาพอากาศบนที่สูงให้ได้ดีขึ้นค่ะ หยกจะพาเพื่อนๆ เดินเล่นชม stupa และชมหมู่บ้าน Dingboche จากมุมสูงที่ Nangkartshang 5073 m กันค่ะ ซึ่งมีจุดวิวไปเรื่อยๆ acclimatize ปรับตัวกันสำหรับการไปนอนที่ Lobuche 4910 m ในวันพรุ่งนี้กันนะคะ เพื่อประโยชน์ของเพื่อนๆ เอง ช่วยหลีกเลี่ยงการกเกิด AMS ค่ะ จะบอกว่าจุดชมวิวนั้นสวยมากๆ นะคะ\n","เสร็จแล้ว ไปทานเที่ยงกันที่ร้านคาเฟ่สุดเก๋ที่มีกาแฟสด มีขนมเค้กน่าทานๆ มากมาย ที่ ความสูง 4410 m อาหารก็หลากหลาย อร่อย และ ฟิน แบบที่ไม่อยากจะเชื่อว่าเรากำลังเทรคกิ้งอยู่บนเขาเลยค่ะ\n","Day 8\n","Dingboche 4410 m - Lobuche 4910 m (3 hr)\n","07.30 น. วันนี้เราเดินกันสั้นๆ ค่ะ (เมื่อเทียบกับการเดินเทรคในเนปาล) เดินสนุก วิวสวย และ บรรยากาศดีมากๆ ค่ะ ค่อยๆ ไป และ สังเกตอาการกันไปนะคะ\n","คืนนี้เราจะไปนอนกันที่ความสูง 4910 m กันคะ เตรียมรับมือกับอากาศหนาวๆ ได้ใช้อุปกรณ์กันกนาวที่เพื่อนๆ เตรียมมาแน่นอนค่ะ (อย่ากังวลไป หยกจะจัดการช่วยเรื่องการเตรียมอุปกรณ์กันหนาวของเพื่อนๆ ให้ครบถ้วนและพร้อมที่สุด ตั้งแต่ที่ Kathmandu แน่นอนค่ะ)\n","Day 9\n","Lobuche 4910 m - Gorak Shep 5140 m (2.5 hr): Day Hike to EBC 5364 m (ขาไป 1-1.5 hr | ขากลับ 1 hr)\n","07.00 น. วันนี้เราเดินกันสั้นๆ ข้ามธราน้ำแข็ง ไปที่ Gorak Shep กันค่ะ\n","ขึ้นกับเวลาที่เราถึง Gorak Shep นะคะ เราอาจจะทานอาหารเที่ยงกันให้เรียบร้อย แล้วไป EBC ที่หลายๆ ท่านรอคอยกัน หรือ เราอาจจะพกขนม เสบียงไปเติมพลัง น้ำดื่ม และ อุปกรณ์กันแดดกันหนาว แล้วเดินไป EBC กันก่อน แล้วค่อยกลับมาทานอาหารขากลับก็ได้ค่ะ\n","Day 10\n","Day Hike to Kalapatthar 5644 m (ขาไป 2-2.5 hr | ขากลับ 1.5-2 hr) | Gorak Shep 5140 m - Dzonglha 4830 m (4 hr)\n","06.00 น. วันนี้อาจจะหนักหนาสักหน่อย แต่คุ้มค่าแน่นอนค่ะ เพราะ EBC ที่ว่าดังว่าฮิตแล้ว ที่ๆ หยกจะพาเพื่อนๆ ไปวันนี้นั้น ฮิตไม่เท่า แต่สวยงามมากกว่าเยอะเลยค่ะ กับ Kalapatthar 5644 m ที่จะได้เห็นยอดเขา Everest จริงๆ จังๆ แล้วค่ะ ทางเดินชันขึ้นมากหน่อย ประกอบกับอากาศที่เบาบาง เราจึงจะออกเช้าหน่อย เพื่อที่จะได้กลับลงมาทัน ทานเที่ยง แล้วลุยต่อไปยัง Dzonghlha 4830 m ค่ะ\n","Day 11\n","Dzonglha 4830 m - Cho La Pass 5420 m - Gokyo 4750 m (9 - 11 hr)\n","06.00 น. วันนี้จะข้าม Cho La Pass กันแล้วนะคะ เดินเยอะเดินยาวกันหน่อย ออกกันเช้าๆ สักนิดนะคะ ช่วงท้ายๆ 2.5 - 3.5 ชั้่วโมงสุดท้าย เราตะเดินข้ามธารน้ำแข็งกันด้วยค่ะ\n","คืนนี้เราจะไปค้างกันที่ Gokyo ค่ะ หยกเลือกที่พักริมทะเลสาบเลย วิวดี อาหารอร่อย จะบอกว่าที่พักที่หยกเลือกมานี้ ห้องพักดีและอุ่นมากๆๆ ค่ะ ไม่ต้องใช้ถุงนอนเลย คืนนี้เราจะได้เห็น Gokyo Lake อย่างใกลิชิดกันแล้วนะคะ\n","Day 12\n","Acclimatiztion Day ที่ Gokyo 4750 m: Gokyo Ri 5360 m (ขาไป 1.5-2.5 hr | ขากลับ 0.5-1 hr)\n","08.00 - 08.30 น. วันนี้ชิวๆ สบายๆ ค่ะ ไม่ต้องออกกันเช้ามาก ไปพิชิต Gokyo Ri กันค่ะ และไปชมวิวความงดงามของ Gokyo Lake, ยอดเขา Everest และ ยอดอื่นๆ พร้อมทั้ง ชมทางเดินธารน้ำแข็งที่เดินมาเมื่อวานนี้ บนยอดเขา Gokyo Ri กันนะคะ\n","Day 13\n","Gokyo 4750 m - Renjo La Pass 5360 m - Lungden 4380 m (4-5 hr)\n","06.00 น. วันนี้เราจะข้าม Renjo La Pass กันค่ะ พาสนี้วิวดี สวยมากๆ เห็นพิมาลัยพาโนรามา พีคใหญ่ๆ ทั้งนั้น เคล้าไปกับ Gokyo Lake โอ๊ยยย ฟิน พาสนี้เราไม่ต้องข้ามธารน้ำแข็งกันนะคะ\n","Day 14\n","Lungden 4380 m - Namche Bazaar 3440 m (6 hr)\n","07.00 น. ชิวๆ แล้วค่ะ วันนี้เดินลงยาวๆ ไปยัง Namche Bazaar ค่ะ เดินกันเยอะนะคะ แต่เค้าว่ากันว่าขาลงนี่เราจะเดินเร็วกว่าที่เราคิดไว้ค่ะ เย็นนี้ไปพักผ่อนชิวๆ เข้าร้านคาเฟ่ จิบเอสเพรสโซ เคล้าเค้กอร่อยๆ กันค่ะ\n","Day 15\n","Namche Bazaar 3440 m - Lukla 2850 m (6 hr)\n","07.00 น. วันสุดท้ายของการเทรคกิ้งแล้ว เราก็ยังคงเดินลงๆๆ กันต่อค่ะ แล้วไปฉลองกันอีกรอบที่ Lukla นะคะ ที่พักดี มีห้องน้ำในตัวให้ได้อาบน้ำร้อนสบายๆ หลังจากไม่ได้อาบาหลายวัน พร้อมกับแนะนำให้ลิ้มลอง Yak Steak หรือจะเป็น Pork Chop หรือ เมนูอร่อยๆ มากมายให้ได้ทานอย่างสุดฟินเลยค่ะ\n","Day 16\n","เดินทางด้วยเครื่องบิน Lukla - Manthali | จากนั้นออกเดินทางด้วย \"รถส่วนตัว\" จาก Manthali สู่ Kathmandu | ช้อปปิ้งของระลึกที่ Kathmandu\n","06.00 น. แพ๊คของเรียบร้อย แล้วเดินกันเบาๆ 5 นาที เพื่อไปสนามบิน Lukla เพื่อบินเข้า Manthali หรือ Kathmandu ขึ้นกับว่าเที่ยวบินตอนนั้นจะบินไปไหน\n","ถ้าบินไป Manthali จากนั้นเดินทางด้วย \"รถส่วนตัว\" จากเมือง Manthali เข้าสู่ Kathmandu กันค่ะ\n","ลุยทาเมล ช้อปปิ้ง และ กินๆ กันอีกรอบนะคะ\n","Day 17\n","เดินทางกลับ เนปาล - ไทย\n","ทานอาหารเช้า ก่อนช้อปปิ้งทิ้งท้าย\n","เดินทางไปสนามบิน เพื่อกลับไทยพร้อมมิตรภาพ ความสนุก ความทรงจำที่ดี และเพื่อนใหม่ กับทริปที่ประทับใจสุดๆ ด้วยสายการบินที่เพื่อนๆ จองมาค่ะ เจอกันทริปหน้านะคะ (ค่าแท็กซี่ไปสนามบิน 600-800 rs ค่ะ)\n","ค่าตั๋วเครื่องบินไป-กลับ Kathmandu - Lukla รวมทั้งค่ารถไป-กลับ ที่พักใน Kathmandu - สนามบิน\n","ค่าที่พักจำนวน 3 คืนใน Kathmandu รวมอาหารเช้า (แชร์ห้องพัก)\n","ค่าธรรมเนียมใบอนุญาตเดินป่า ในเขต Khumbu คือ Tourism Fee และ National Park Entrance Fee\n","ค่าเดินทางด้วยรถส่วนตัว ตลอดทั้งทริปตามที่กำหนดไว้ในแผนการเดินทาง (ยกเว้น ไป-กลับ สนามบิน ที่มาจากไทย และ กลับไทย)\n","ไกด์ไทย (หยกเองค่ะ) ตลอดทริป\n","ไกด์พื้นเมือง ระหว่างการเทรคกิ้ง\n","ลูกหาบ (20 กิโลกรัม) โดยลูกหาบ 1 คน ต่อ เทรคเกอร์ 2 คน (คนละ 10 กิโลกรัม)\n","ค่าเช่า duffle bag คนละ 1 ใบ เพื่อใส่ของให้ลูกหาบแบก\n","ค่าเดินทาง ค่ากิน ค่าที่พัก ของทั้งไกด์และลูกหาบตลอดเทรค\n","ค่าประกันการเดินทางของไกด์และลูกหาบ\n","พิเศษไม่เหมือนใคร เฉพาะ SanookTiew Tours:\n","มีไกด์ไทย หยกเองค่ะ พาเที่ยวพาเทรคตลอดทริป (จะมีกี่ทัวร์เทรคกิ้งเนปาลกัน ที่มีไกด์ไทยไปด้วย)\n","ให้คำปรึกษาแนะนำไม่จำกัดครั้ง\n","พาช้อป/เช่าอุปกรณ์เทรคที่เนปาล เพื่อการเตรียมตัวให้พร้อมที่สุด หยกช่วยเลือกและให้คำแนะนำ\n","แจกเอกสาร รายการของ (checklist) ที่แนะนำให้เตรียมไป ให้เหมาะสมกับสภาพอากาศและเส้นทาง อย่างละเอียด พร้อมเหตุผลอธิบายว่าเตรียมไปทำไม, เลือกของยังไง เป็นต้น เพื่อที่เพื่อนๆ จะได้เตรียมตัวได้พร้อมที่สุด\n","แจกเอกสาร การขอวีซ่า, แลกเงิน, ซิมการ์ด, ข้อควรรู้ และ เทคนิคต่างๆ ที่จะทำให้การเทรคกิ้งง่ายและสบายขึ้น\n","แนะนำวิธีการใช้อุปกรณ์ต่างๆ ระหว่างเทรค เพื่อให้ใช้อุปกรณ์ได้ถูกต้อง จะได้เทรคได้สนุกขึ้น และเพลิดเพลินกับวิวหิมาลัยได้อย่างเต็มที่\n","การรักษาและความเจ็บป่วยใดๆ, ค่าใช้จ่ายในการกักตัว และค่าใช้จ่ายต่างๆ ที่อาจเกิดขึ้นได้ในช่วงโรคระบาดนี้ เช่น ค่าตรวจโควิด หรือ กรณีที่ต้องบินกลับไทยก่อนจบทริป เป็นต้น\n","ค่าตั๋วเครื่องบินไป-กลับ BKK หรือ DMK-KTM (รายละเอียดเพิ่มเติมที่ คำถามที่พบบ่อย)\n","ค่าธรรมเนียมวีซ่าเนปาล ($30 สำหรับวีซ่า 15 วัน | $50 สำหรับวีซ่า 30 วัน | $125 สำหรับวีซ่า 90 วัน)\n","ค่าเดินทางไป-กลับ สนามบินตรีภูวัน-เมืองทาเมล ที่มาจากไทยและกลับไทย\n","ค่าอาหารเที่ยง และ เย็น ใน Kathmandu\n","ค่าที่พักและมื้ออาหารตลอดการเทรค ตั้งแต่ Lukla จนถึงขากลับมาที่ Lukla (รายละเอียดเพิ่มเติมที่ คำถามที่พบบ่อย)\n","ค่าเครื่องดื่มแอลกอฮอล์ตลอดทริป\n","ค่าใช้จ่ายส่วนตัวตลอดทั้งทริป เช่น ค่าอาบน้ำร้อน, ค่าอินเทอร์เน็ต, ค่าซักรีดเสื้อผ้า, ค่าโทรศัพท์ และค่าชาร์จไฟ เป็นต้น\n","ค่าใช้จ่ายที่เกี่ยวข้องกับอุปกรณ์ท่องเที่ยว เช่น การเช่าถุงนอน เป็นต้น\n","ค่าประกันการเดินทางที่ครอบคลุมโควิด และ การกู้ภัยด้วยเฮลิคอปเตอร์บนที่สูงที่ครอบคลุมความสูงของเส้นทางที่เทรค (รายละเอียดเพิ่มเติมที่ คำถามที่พบบ่อย)\n","ค่าสินน้ำใจตอบแทนสำหรับไกด์และลูกหาบ โดยเฉพาะคุณลูกหาบที่ทำให้เราได้เดินอย่างสบายๆ ไม่ต้องแบกของหนัก (รายละเอียดเพิ่มเติมที่ คำถามที่พบบ่อย)\n","Please wait...\n","ขออ่านหน่อย เปิดทั้งหมดเลยจ้า ปิดได้ อ่านจบแล้วจ้า\n","การจอง, มัดจำ และ ชำระค่าใช้จ่าย\n","โปรดทราบว่า - สำคัญ\n","หลังจากชำระค่าทริปแล้ว ไม่ว่าจะ ชำระเต็มจำนวน หรือ ชำระบางส่วน เท่ากับว่า เพื่อนๆ ได้ตกลงยินยอมและยอมรับ รายละเอียดและเงื่อนไขการสำรองที่ (คลิกได้) รวมทั้ง ได้อ่านรายละเอียดทริป, ค่าใช้จ่ายรวมและไม่รวม และ คำถามที่พบบ่อย ครบถ้วน อย่างเข้าใจถ่องแท้ดีแล้วนะคะ\n","ขั้นตอนการสำรองที่\n","1). ทำการจองบนเว็บไซต์ได้เลย โดยเลือกทริปที่เพื่อนๆ สนใจ\n","2). กด \"สำรองที่ พร้อมลุย!\" พร้อมกรอกรายละเอียด (ชื่อสกุล, เบอร์โทร, อีเมล) ให้เรียบร้อย\n","ขั้นตอนการ \"ยืนยัน\" การสำรองที่\n","สำหรับทริปปลายปี 2565\n","1). ชำระค่าทริปครบจำนวน มาที่ ธนาคารไทยพาณิชย์ เลขที่บัญชี 016-433109-2 ชื่อบัญชี นางสาวสกุณา ศิริบูรณ์พิพัฒนา\n","2). ส่งหลักฐานการโอนเงิน โดยใส่หัวข้อว่า “ชำระที่เหลือ” มาที่ trips@sanooktiew.com หรือ ที่ LINE ID: sanooktiew\n","สำหรับทริปต้นปี 2566\n","1). ชำระมัดจำ 25% ของค่าทัวร์ มาที่ ธนาคารไทยพาณิชย์ เลขที่บัญชี 016-433109-2 ชื่อบัญชี นางสาวสกุณา ศิริบูรณ์พิพัฒนา\n","2). ส่งหลักฐานการโอนเงิน โดยใส่หัวข้อว่า “ชำระที่เหลือ” มาที่ trips@sanooktiew.com หรือ ที่ LINE ID: sanooktiew\n","“กฎเกณฑ์การคืนเงิน” ยกเลิกทริป ได้เงินคืนไหม?\n","การยกเลิกทริปหลังจากการยืนยันออกทริปนั้น อาจสร้างความเสียหายให้แก่หลายฝ่ายอย่างมากนะคะ โดยเฉพาะอย่างยิ่งกรณีที่มีจำนวนคนน้อยกว่าขั้นต่ำที่กำหนดไว้ จึงสร้างความเสียหายอย่างมาก ให้แก่ทั้งหยก ที่ได้จัดเตรียมทุกอย่างและชำระค่าใช้จ่ายในเนปาลไว้แล้ว และ เพื่อนๆ ในกลุ่มที่อาจซื้อตั๋วเครื่องบิน, ประกันการเดินทาง และ อื่นๆ ไปแล้ว\n","หยกขอให้เพื่อนๆ ทำความเข้าใจ “กฎเกณฑ์การคืนเงิน” อย่างถ่องแท้ ก่อนทำการยืนยันการสำรองที่ นะคะ เพื่อนๆ สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ รายละเอียดและเงื่อนไขการสำรองที่ (คลิกได้) เลยค่ะ\n","การยกเลิกทริป “ก่อน” ยืนยันออกทริป\n","หากต้องการยกเลิกทริป กรณีที่ “ยังไม่มีการยืนยันออกทริป” เพื่อนๆ จะ “ได้รับเงินทั้งหมด (มัดจำ) ที่ชำระมาแล้วคืน” ค่ะ\n","การยกเลิกทริป “หลัง” ยืนยันออกทริป\n","แจ้งยกเลิก 91 วัน ก่อนเริ่มทริป “เก็บเงิน 10%” คืนเงินที่เหลือ\n","EBC + 3 Pass + Kalapatthar Trek ก่อน 14 ก.ค. 2565\n","Annapurna circuit +Tilicho Lake Trek ก่อน 7 ส.ค. 2565\n","Mardi Himal Base Camp Trek ก่อน 27 ส.ค. 2565\n","Langtang Trek ก่อน 10 ก.ย. 2565\n","Annapurna Base Camp (ABC) Trek ก่อน 25 ก.ย. 2565\n","แจ้งยกเลิกระหว่าง 61 - 90 วัน ก่อนเริ่มทริป จะ “เก็บมัดจำ 25%” คืนเงินที่เหลือกรณีมีการชำระเข้ามา\n","EBC + 3 Pass + Kalapatthar Trek ระหว่าง 13 ก.ค. - 13 ส.ค. 2565\n","Annapurna circuit +Tilicho Lake Trek ระหว่าง 8 ส.ค. - 6 ก.ย. 2565\n","Mardi Himal Base Camp Trek ระหว่าง 28 ส.ค. - 26 ก.ย. 2565\n","Langtang Trek ระหว่าง 11 ก.ย. - 10 ต.ค. 2565\n","Annapurna Base Camp (ABC) Trek ระหว่าง 26 ก.ย. - 25 ต.ค. 2565\n","แจ้งยกเลิกระหว่าง 31 - 60 วัน ก่อนเริ่มทริป จะ “ไม่ได้เงินคืน แต่จะได้เครดิตเงินคืน 50%” โดยสามารถใช้เครดิตนี้แทนเงินได้กับทุก SanookTiew Tours ได้ก่อนธันวาคมปีถัดไป\n","EBC + 3 Pass + Kalapatthar Trek ระหว่าง 12 ส.ค. - 12 ก.ย. 2565\n","Annapurna circuit +Tilicho Lake Trek ระหว่าง 7 ก.ย. - 6 ต.ค. 2565\n","Mardi Himal Base Camp Trek ระหว่าง 27 ก.ย. - 26 ต.ค. 2565\n","Langtang Trek ระหว่าง 11 ต.ค. - 9 พ.ย. 2565\n","Annapurna Base Camp (ABC) Trek ระหว่าง 26 ต.ค. - 24 พ.ย. 2565\n","แจ้งยกเลิกน้อยกว่า 30 วัน ก่อนเริ่มทริป จะ “ไม่ได้เงินคืนและไม่ได้เครดิตเงินคืน” นะคะ\n","EBC + 3 Pass + Kalapatthar Trek หลัง 13 ก.ย. 2565\n","Annapurna circuit +Tilicho Lake Trek หลัง 7 ต.ค. 2565\n","Mardi Himal Base Camp Trek หลัง 27 ต.ค. 2565\n","Langtang Trek หลัง 10 พ.ย. 2565\n","Annapurna Base Camp (ABC) Trek หลัง 25 พ.ย. 2565\n","สายการบินไป Kathmandu และ ราคา\n","ก่อนช่วงโรคระบาด มี 3 สายการบิน ที่บินตรงจากประเทศไทย คือ\n","1. Thai Airways\n","บินจากสนามบินสุวรรณภูมิ มีเที่ยวบินทุกวัน วันละรอบ ค่าตั๋วไป-กลับประมาณ 11,500 - 18,000 บาท มีอาหารบริการ และโหลดสัมภาระได้ฟรีในน้ำหนักที่กำหนด\n","ขาไป: 10.30 - 12.45 น.\n","ขากลับ: 13.55 - 18.30 น.\n","2. Nepal Airlines\n","บินจากสนามบินสุวรรณภูมิเช่นกัน มีเที่ยวบิน 3 วันต่อสัปดาห์เท่านั้น คือวันจันทร์, พุธ และศุกร์ วันละรอบ ค่าตั๋วไป-กลับประมาณ 11,000 - 13,000 บาท มีอาหารบริการ และโหลดสัมภาระได้ฟรีในน้ำหนักที่กำหนด\n","ขาไป: 17.00 - 19.15 น.\n","ขากลับ: 11.25 - 16.00 น.\n","3. Lion Air\n","บินจากสนามบินดอนเมืองค่ะ มีเที่ยวบินทุกวัน วันละรอบ ค่าตั๋วไป-กลับ เริ่มต้น 7,500 บาท ไม่มีอาหารบริการ และต้องซื้อน้ำหนักโหลดสัมภาระเพิ่ม\n","ขาไป: 12.00 - 14.00 น.\n","ขากลับ: 15.00 - 19.45 น.\n","* ราคาค่าตั๋วโดยสารและเที่ยวบินสามารถมีการเปลี่ยนแปลงได้ตลอดเวลา โปรดตรวจสอบข้อมูลราคาและเที่ยวบินอีกครั้งก่อนเดินทางนะคะ เพื่อที่จะได้ราคาและเที่ยวบินที่เป็นปัจจุบันค่ะ\n","** ใกล้ๆ ทริป หรือ หากมีข้อมูลที่อัพเดทเรื่องสายการบินแล้ว หยกจะมาอัพเดทเที่ยวบินและราคาให้ค่ะ\n","เมื่อไหร่จะ \"ยืนยันออกทริป\"? ซื้อตั๋วเครื่องบินตอนไหน? ทราบได้อย่างไรว่าทริปนี้ได้ไปเทรคแน่ๆ?\n","ทริปจะเกิดขึ้น หลังมีการ “ยืนยันออกทริป” ค่ะ\n","โดยที่หยกจะ “ยืนยันออกทริป หากทริปมีเพื่อนร่วมทริป 3 - 4 ท่าน (ขึ้นกับทริป) และทุกท่านได้ทำการชำระค่าทริปเต็มจำนวนแล้ว” นั่นก็หมายความว่า เพื่อนๆ สามารถซื้อตั๋วเครื่องบินและเตรียมตัวไปเทรคกันได้เลยค่ะ ในระหว่างนี้หยกจะทำการจองที่พัก จองรถส่วนตัวที่เนปาล ใบอนุญาตเดินป่า และจัดการเรื่องอื่นๆ ให้เรียบร้อยเลยด้วยนะคะ\n","หลังยืนยันออกทริปแล้ว เพื่อนๆ สามารถทำการซื้อตั๋วเครื่องบินไปเนปาลได้เลยค่ะ\n","งบอาหาร และ ที่พักระหว่างการเทรค\n","งบอาหารและที่พักบนเขา\n","ค่าอาหารบนเขาแปรผันตามความสูงค่ะ ยิ่งสูงค่าอาหารก็ยิ่งแพง เพราะการขนส่งขึ้นไปที่ยากลำบาก และ ส่วนที่พัก หากเลือกห้องพักแบบมีห้องน้ำในตัว (ถ้ามี) จะมีราคาแพงกว่า แบบห้องน้ำรวม\n","$18-22 ต่อวัน สำหรับท่านที่ทานน้อย-กลาง\n","$22-30 ต่อวัน สำหรับทานที่ทานกลางๆ-มาก (โดยที่ EBC 3 Pass Trek สามารถสูงได้ถึง $35 ต่อวัน เพราะความสูงที่เราไปนั้นสูงเกิน 4,000 m ถึง 12 วัน)\n","หยกไม่ได้รวมค่าอาหารบนเขาไว้ในค่าทริป เพราะแต่ละท่านทานมากน้อยต่างกันค่ะ และเพื่อที่แต่ละท่านจะได้เลือกอาหารที่อยากทานเองได้อย่างอิสระ\n","*ไม่รวมค่าเครื่องดื่มน้ำเปล่าขวด, น้ำอัดลม หรือ แอลกอฮอล์ นะคะ\n","งบอาหารในเมือง\n","ค่าอาหารในเมือง ต่อมื้อเฉลี่ยประมาณ\n","เราสามารถหาร้านอาหารที่มีราคาพอๆ กับสตรีทฟู๊ด หรือ ร้านอาหารริมถนนในกรุงเทพได้ค่ะ คือมื้อละ 40-100 บาท/ท่าน\n","ทั้งนี้ ราคาอาหารสามารถแพงขึ้น หากเราเลือกที่จะทานร้านอาหารที่ดูดีขึ้นมาหน่อย หรือ ร้านอาหารสำหรับนักท่องเที่ยว คือมื้อละ 100-300 บาท/ท่าน\n","การเลือกทานอาหารในเมือง\n","นานๆ ได้ไปเที่ยวกันที หยกต้องการให้เพื่อนๆ มีอิสระในการทานอาหารต่างแดนค่ะ โดยที่หยกสามารถให้คำแนะนำได้ว่ามีอาหารประเภทไหนบ้าง เป็นแบบไหน ร้านไหนอร่อย ซึ่งแน่นอนว่าหยกมีร้านในใจหลายร้านมาแนะนำเลยค่ะ แล้วทางกลุ่มก็เลือกกันค่ะ เราก็จะไปกันแบบกลุ่ม หรือ หากอยากไปทานแยกร้านกันก็ได้เช่นกัน อิสระเต็มที่ จะสั่งทานเดี่ยวๆ หรือ จะแชร์กันก็ได้ค่ะ จะได้สนุกในการได้ลิ้มรสอาหารต่างชาติหลายๆ จาน ตามที่อยากทานเลยนะคะ\n","สรุป\n","หยกแนะนำว่า หากคำนวณงบคร่าวๆ ได้เท่าไหร่แล้ว ให้บวกเพิ่ม 15 - 25% เผื่อเป็นค่าใช้จ่ายเพิ่มเติมที่ไม่คาดคิด และ ค่าอื่นๆ เช่น ค่าอาบน้ำ, ค่าชาร์จแบต, ค่าไวไฟ, ค่าซื้อของกินของใช้ต่างๆ (กระดาษชำระ, สบู่ หรือ ขนมขบเคี้ยว เป็นต้น) และ ค่าทิปตอนจบทริป เป็นต้น เพราะเราไม่สามารถกดเงินสด หรือ แลกเงินระหว่างเทรคได้ หากเพื่อนๆ มีบัตรเครดิต แนะนำให้พกไปด้วยนะคะ เผื่อค่าพยาบาลอื่นๆ กรณีฉุกเฉินค่ะ\n","น้ำดื่ม ยาฆ่าเชื้อ และ ที่กรองน้ำ\n","หากใส่ water purification tablets แล้ว ดื่มได้เลยไหม? จำเป็นต้องใช้(ซื้อ)ที่กรองน้ำหรือเปล่า?\n","ไม่จำเป็นต้องใช้ที่กรองน้ำค่ะ สามารถดื่มได้โดยตรงเลยค่ะ เพราะ water purification tablets นี้ได้ออกฤทธิ์ฆ่าเชื้อโรคต่างๆ จนกลายเป็นน้ำดื่มที่ปลอดภัยแล้ว\n","การใช้ที่กรองน้ำนั้น จะช่วยในเรื่องการกรองตะกอนต่างๆ ให้ดูสะอาดและน่าดื่มเท่านั้นค่ะ ทั้งนี้ น้ำดื่มตามธรรมชาติบนเขานั้นค่อนข้างใสค่ะ ยกเว้นแต่บนที่สูงมากๆ ที่ต้องใช้น้ำจากหิมะที่ละลาย\n","หากเพื่อนๆ ท่านไหน อยากซื้อ ที่กรองน้ำ ปรึกษาหยกได้ค่ะ\n","หยกแนะนำให้ซื้อ water purification tablets โดยกะประมาณให้เพียงพอกับปริมาณน้ำที่จะดื่มตลอดเทรคนะคะ แนะนำให้ดื่มอย่างน้อยๆ 4 - 5 ลิตรต่อวัน นั่นก็หมายความว่าต้องใช้ 4 - 5 เม็ดต่อวัน หากมาเทรค 4 วัน ก็เตรียมมาให้มากกว่า 20 เม็ด เผื่อหล่น เผื่อหายค่ะ แต่หากใครดื่มน้ำเยอะมากๆ ก็จัดไป 50 เม็ดเลยค่ะ จะได้สบายใจ (ราคาไม่แพงค่ะ กล่องเล็กสุดมี 50 เม็ด ราคา 130 NPR หรือประมาณ 35 - 40 บาท เท่านั้นเองค่ะ)\n","*water purification tablets คือ ยาฆ่าเชื้อสำหรับน้ำดื่มแบบเม็ด\n","ทำไมถึงต้องไปเทรคกิ้งกับหยก?\n","ง่ายๆ เลยค่ะ เพราะหยกจัดทริปหาเพื่อนใหม่ เที่ยวกันอย่างเพื่อน ดูแลอย่างคนในครอบครัว มาดูกันเลยค่ะว่า ทำไมต้องมาเทรคกับหยก... (ไม่ได้เรียงตามลำดับความสำคัญนะคะ เพราะทุกข้อสำคัญหมดเลยค่ะ)\n","หยกจัดโปรแกรมเส้นทางเดินเองและวางแผนเอง ไม่ได้ซื้อแพ็คเกจผ่านเอเจนซี่ค่ะ\n","ซึ่งการจัดแผนการเดินเองเช่นนี้ จะมีเอกลักษณ์ค่ะ เพราะหยกจัดแผนการเดินเองอย่างพิถีพิถัน และ ใส่ใจ กับทุกรายละเอียด จึงมีอิสระอย่างเต็มที่ ทั้งการเลือกที่พักเอง และ เลือกหมู่บ้านที่จะพักเอง และ พาเทรคเอง\n","หากซื้อแพ็คเกจของเอเจนซี่ เค้าจะมีคอนเน็กชั่นกับที่พักบนเขา ที่ๆ เค้าจะให้ลูกค้าเค้าเข้าพักเป็นประจำ ที่ไม่ได้ตามใจเรา แต่ตามใจเค้าค่ะ\n","เส้นทางมีเอกลักษณ์ ไม่เหมือนทัวร์อื่นๆ และหาที่ไหนไม่ได้\n","ก็เพราะหยกจัดแผนการเดินเองยังไงล่ะคะ\n","หยกพาเที่ยว พาเทรคเอง สาวๆ ที่อยากมาคนเดียวก็ไม่ต้องกังวลเลยค่ะ\n","หลายคนคงกังวลหากต้องไปเทรคกับไกด์ท้องถิ่น ไกด์มักเป็นผู้ชายอีก หรือไปร่วมทริปกับเพื่อนๆ ที่ไม่รู้จักกัน โดยเฉพาะกับมือใหม่ที่ไม่เคยเทรค คงจะกลัวไปทำป้ำๆ เป่อๆ มีสิ่งที่กังวลและไม่เข้าใจอยู่หลายอย่าง แต่ไม่รู้จะถามใคร ไหนบางคนที่กังวลเรื่องภาษาอีก เนปาลีก็ไม่รู้เรื่อง ภาษาอังกฤษก็งูๆ ปลาๆ\n","\"หยุดกังวลได้เลยค่ะ ถ้ามากับหยก\"\n","หยกยินดีแบ่งปันประสบการณ์ทุกอย่างที่หยกมีเกี่ยวกับการเทรคกิ้ง และ การท่องเที่ยวอื่นๆ อย่างเต็มที่ และ เต็มใจ ทั้งหยกยังให้คำแนะนำปรึกษาเรื่องการเตรียมตัวเตรียมอุปกรณ์ด้วยตัวหยกเองอย่างละเอียด\n","\"หยกใจเย็น ถามมา ตอบหมด ถึงไม่ถาม ก็บอกหมดเช่นกัน โดยบอกแบบอธิบาย พร้อมตัวอย่าง เพื่อให้เห็นภาพและให้เข้าใจได้ง่ายขึ้น\"\n","หยกเรียนรู้จากข้อผิดพลาดของตัวเอง จึงเข้าใจได้ดี และสามารถอธิบายอย่างละเอียดให้เพื่อนๆ เข้าใจได้อย่างถ่องแท้เลยค่ะ\n","ส่วนใครที่ไม่ได้เรื่องภาษา ก็ไร้ความกังวลไปอีก\n","เพราะหยกอยู่ด้วยทุกที่ ตลอดทริปเลยนะคะ\n","ไม่พาชะโงกทัวร์ ยังมีเวลาพาช้อปอุปกรณ์เทรคกิ้ง และ เช่าของดีๆ ราคางามๆ\n","ที่ กาฐมาณฑุ หยกยังจะพาช้อป/เช่าอุปกรณ์กันหนาว อุปกรณ์เทรคกิ้งต่างๆ เช่น ไม้เท้าเดินป่า ที่เพื่อนๆ ขาดเหลือให้มีของครบและพร้อมสุดๆ โดยที่หยกได้จัดโปรแกรมแบบให้เรามีเวลาเลือกซื้อและพิจารณาอุปกรณ์เทรคกิ้งที่จำเป็น เปรียบเทียบหลายๆ ร้าน, คุณภาพ และราคา เลือกเอาที่ดีที่ตรงใจที่สุด ทั้งยังจะพาไปเช่าอุปกรณ์เทรคกิ้งบางอย่าง ที่ดีมีคุณภาพ สะอาด และราคาถูก ที่เพื่อนๆ จะต้องไปลอง และ ไปเลือกเองค่ะ\n","หยกมีประสบการณ์เทรคกิ้งที่มากมาย เทรคมาแล้วนับไม่ถ้วน แค่กับเนปาล ก็มาเนปาลแล้ว 6 ครั้งค่ะ\n","หยกจึงสามารถแบ่งปันประสบการณ์ บทเรียน และข้อผิดพลาด ให้เพื่อนๆ ได้อย่างเต็มที่ ให้เพื่อนๆ ได้ข้ามขั้น เรียนรู้จากประสบการณ์ของหยก ไม่ทำผิดซ้ำเหมือนที่หยกเคยทำ\n","ไม่เพียงเท่านั้น ระหว่างเทรค หยกจะคอยแนะนำทริคต่างๆ เช่น การใช้เท้าเดินป่า สำหรับกรณีเดินขึ้นทางชัน, ทางลาด และ ทางเรียบ หรือ การสะพายกระเป๋าให้ไม่เจ็บหลังและไหล่ หรือ การดูแลตัวเองเพื่อนหลีกเลี่ยง AMS เป็นต้น\n","หยกจัดทริปเอง พาเที่ยวเอง เลยจะมีความพิเศษและใส่ใจแบบสุดๆ เหมือนกับไปเที่ยวกันเองกับเพื่อนจริงๆ\n","ก่อนเริ่มทริป หยกจะแจกเอกสาร check list ของที่ต้องเตรียมและข้อควรรู้ต่างๆ ให้เหมาะสมกับแต่ละเส้นทาง แต่ละสภาพอากาศ เพื่อให้เพื่อนๆ ได้เตรียมตัวอย่างดีพร้อมที่สุด\n","ทั้งเมื่อถึงเนปาลแล้ว หยจะพาเพื่อนๆ ช้อป ลองเสื้อผ้า อุปกรณ์เทรคกิ้งต่างๆ ต่อรองราคากันให้สนุกไปเลย\n","และหยกยังจะพาเพื่อนๆ ไปลิ้มลองอาหารพื้นเมืองในร้านที่ส่วนใหญ่จะมีแต่คนพื้นเมือง ที่เพื่อนๆ จะได้สัมผัสถึงบรรยากาศของการท่องเที่ยวในแบบที่ไม่เคยมาก่อน โดยเพื่อนๆ จะมีอิสระในการเลือกทานอาหารที่อยากทานเอง โดยหยกจะให้คำแนะนำร้านอาหารประเภทต่างๆ ในเมือง (และอาหารประเภทต่างๆ บนเขา) ที่รับรองว่าการมาเที่ยวครั้งนี้ เพื่อนๆ จะไม่ได้แค่การเทรคกิ้งแน่นอนค่ะ\n","ได้เพื่อนใหม่และมิตรภาพดีๆ กลับบ้านด้วย อย่างน้อยก็หยกคนนึงแล้วค่ะ อิอิ\n","อะฮ่า พร้อมที่จะไปเที่ยวกับเพื่อนใหม่คนนี้แล้วใช่ไหมล่ะ\n","ประกันการเดินทาง ที่ครอบคลุมการเทรคกิ้ง การกู้ภัยด้วยเฮลิคอปเตอร์บนเขาสูง\n","หยกขอแนะนำเจ้าที่หยกใช้บริการอยู่นะคะ (ไม่มีสปอนเซอร์ค่ะ) คือ ประกันการเดินทางของ \"World Trips ซึ่งเป็นของ Tokio Marine ที่เป็นบริษัทญี่ปุ่น โดยที่เจ้านี้ครอบคลุมกิจกรรมการเทรคกิ้งบนภูเขาที่ความสูงไม่เกิน 4,500 เมตร + ครอบคลุมประเทศเนปาล + ครอบคลุมการรักษาพยาบาลกรณีติดโควิดด้วยค่ะ\n","จะมีประกัน 2 แพลน ให้ได้เลือก คือ Atlas Travel และ Atlas Premium โดยหยกจะเลือกตัว Atlas Premium ค่ะ เพราะให้ความคลุมครองที่ดีกว่า ลองเข้าไปศึกษาดูนะคะ\n","เพื่อนๆ สามารถดูขั้นตอนและวิธีการซื้อได้ที่นี่ ค่ะ\n","เอกสารที่ต้องเตรียม สแกนแล้วส่งเมลให้หยก\n","หยกขอให้เพื่อนๆ เตรียมไฟล์เอกสารดังต่อไปนี้ แล้วส่งเข้าอีเมล trips@sanooktiew.com ประมาณเดือนกันยายนนะคะ โดยหยกจะแจ้งวันอีกทีค่ะ\n","หนังสือเดินทาง ที่มีอายุเกิน 6 เดือนก่อนวันเดินทาง และ มีหน้าว่างอย่างน้อย 2 หน้า\n","บัตรประจำตัวประชาชน\n","รูปถ่ายพื้นหลังสีอ่อน (ถ่ายมาภายใน 6 เดือนนี้)\n","ประกันการเดินทาง หากใครซื้อเรียบร้อยแล้ว\n","หรือ จะส่งเป็นเอกสารตัวสำเนา มาให้หยกก็ได้ค่ะ ขอรูปถ่าย 3 รูปนะคะ\n","วัคซีนที่แนะนำให้ฉีด\n","แม้ปัจจุบันจะยังไม่มีกฎหรือข้อบังคับใดๆ เกี่ยวกับการได้รับวัคซีนก่อนเดินทางเข้าประเทศเนปาล แต่ทั้งนี้ ก็มีวัคซีนที่แนะนำว่านักท่องเที่ยวควรได้รับค่ะ เนื่องจากมีความเสี่ยงในการติดเชื้อสูงในเนปาล จะเป็นวัคซีนชนิดไหนนั้นก็ขึ้นอยู่กับปัจจัยหลายอย่าง ไม่ว่าจะเป็นระยะเวลาที่จะอยู่ในเนปาล ประเภทของกิจกรรมที่จะทำ ตลอดจนความเหมาะสมของตัวนักท่องเที่ยวเอง จึงควรปรึกษาแพทย์ผู้ชำนาญการเพื่อขอคำแนะนำที่ถูกต้อง\n","ควรพึงระลึกอยู่เสมอว่า วัคซีนบางชนิดต้องฉีดมากกว่า 1 ครั้ง โดยอาจมีระยะเวลาห่างกันเป็นเวลาหลายสัปดาห์จนถึงหลายเดือนเลยก็ได้ จึงควรมีการเตรียมการล่วงหน้าเพื่อวางแผนในการรับวัคซีนก่อนเดินทางแต่เนิ่นๆ นะคะ\n","วัคซีนที่แนะนำให้ได้ ได้แก่\n","Typhoid\n","Hepatitis A\n","Hepatitis B\n","Rabies\n","เป็นต้น\n","โดยสามารถปรึกษาเรื่องการรับวัคซีนได้ที่ คลินิกเวชศาสตร์ท่องเที่ยวและการเดินทาง โรงพยาบาลเวชศาสตร์เขตร้อน มหาวิทยาลัยมหิดล สามารถดูรายละเอียดเพิ่มเติมได้ที่ ลิ้งค์นี้ เลยค่ะ\n","ทิป ให้เท่าไหร่ดี?\n","ทิป คือสินน้ำใจ คือการตอบแทน ของงานบริการที่สุจริตค่ะ การที่เราให้ทิป เพื่อแทนความขอบคุณสำหรับการช่วยเหลือดูแล แบ่งปันประสบการณ์ หากไม่มีท่าน การท่องเที่ยวคงไม่ราบรื่นและสนุกเท่า ทั้งเพื่อเป็นกำลังใจและสนับสนุนอาชีพบริการที่สุจริตเหล่านี้ให้คงอยู่ต่อไป และดีขึ้นเรื่อยๆ\n","ทิป ยังถือเป็นวัฒนธรรมของงานบริการที่สุจริตอีกด้วยนะคะ\n","โดยทั่วไปแล้ว เราให้ค่าทิปไกด์ไทย, ไกด์พื้นเมือง และ ลูกหาบ ไม่น้อยไปกว่า 700 - 1,500 NPR ต่อวันต่อคน ในส่วนของทิปลูกหาบนั้น ลูกหาบใครก็ให้ทิปเฉพาะลูกหาบที่แบกสัมภาระให้เรานะคะ ทั้งนี้ ยังขึ้นกับความเหมาะสมของระยะเวลา ความพึงพอใจ และ บริการที่ได้รับอีกด้วยนะคะ โดยที่เราจะให้เป็นเงินสกุล เนปาลีรูปี (NPR) หรือ USD ก็ได้ค่ะ\n","ตัวอย่าง\n","เช่น\n","ลูกหาบ 1 คน แบกของให้เรากับเพื่อน เทรคกัน 10 วัน แล้วลูกหาบคนนี้ดีมากๆ อารมณ์ดี ช่วยเหลือเราดีมาตลอด มีพลังบวก อยู่ด้วยตลอด 10 วันแล้วสบายใจ อยากจะทิปมากๆ แต่เรามีงบจำกัด ก็อาจจะให้ไปกลางๆ คือ 800 NPR ต่อวัน เทรค 10 วัน ก็ให้ไปทั้งหมด 8,000 NPR เรากับเพื่อนก็จ่ายให้ลูกหาบคนละ 4,000 NPR ค่ะ\n","ส่วนตัวหยกแล้ว ปกติหยกจะทิปลูกหาบ 800 - 1,200 NPR ต่อวันค่ะ กรณีที่บริการประทับใจสุดๆ ก็ 1,200 NPR ต่อวันเลยค่ะ หยกได้เดินเทรคสบายๆ ก็เพราะคุณลูกหาบนี้แหละค่ะ นับถือความแข็งแรงและการช่วยเหลือที่ดีเยี่ยมของเค้าจริงๆ เลยค่ะ\n","มีมากให้มาก มีน้อยให้น้อย มันเป็นประเพณีที่สืบต่อกันมา และยังเป็นสินน้ำใจและกำลังใจให้คนเหล่านี้ได้ทำงานที่สุจริตต่อไป งานที่ช่วยให้เทรคเกอร์อย่างเราได้เดินเทรคตัวเบาอย่างสบายๆ\n","โปรดอ่าน - สำคัญ\n","การเดินทางท่องเที่ยวทุกประเภทนั้นมีความเสี่ยง ไม่ว่าจะเป็นอุบัติเหตุต่างๆ ทั้งจากตัวเราเอง และ/หรือสิ่งรอบข้างที่คาดการณ์ไม่ได้\n","ดังนั้นแล้ว หยกขอปฏิเสธข้อเรียกร้องและความรับผิดชอบใดๆ ที่อาจเกิดขึ้นจากท่องเที่ยวตลอดทั้งทริป ไม่ว่าจะด้วยเหตุผลใดก็ตาม โดยถือว่าเพื่อนๆ ผู้ร่วมทริปนั้นตกลงใจในความรับผิดชอบกับสิ่งที่อาจเกิดขึ้นใดๆ ด้วยตัวเองนะคะ\n","อื่นๆ\n","แต่หากยังคงมีข้อข้องใจ, คำถามเพิ่มเติม, มีอะไรที่ไม่ชัดเจน หรือ ต้องการคำแนะนำอื่นใด อย่ารีรอ กดปุ่ม “คำถามเพิ่มเติมเกี่ยวกับทริป หยกพร้อมตอบค่ะ” ที่ด้านบนของหน้านี้ (ข้างปุ่ม “สำรองที่ พร้อมลุย!”)\n","หรือ ส่งอีเมลเข้ามาถามหยกได้ที่ trips@sanooktiew.com หรือ แอดไลน์หยกมาที่ LINE ID: sanooktiew เพื่อสอบถามด่วนๆ เลยค่ะ\n","หยกจะรีบตอบกลับเพื่อช่วยไขสิ่งที่ค้างคาใจทันที มาร่วมทริป ไปเทรคกิ้งกับหยกนะคะ\n","ทริปที่คล้ายคลึงกัน\n","ทัวร์ Mohare & Khopra Trek 12 วัน + ไกด์หญิงไทย\n","ราคา ฿42,900\n","4 มีนาคม 2023\n","5 out of 5\n","(2 รีวิว)\n","แอดเวนเจอร์\n","ทัวร์ Langtang เนปาล 11 วัน (มี 1 วันเต็มเที่ยวในเมือง) + ไกด์หญิงไทย\n","ราคา ฿40,900\n","10 ธันวาคม 2022\n","10 ธันวาคม 2022 18 มีนาคม 2023 6 พฤษภาคม 2023\n","แอดเวนเจอร์\n","ทัวร์ ABC เนปาล 13 วัน (ทัวร์ Annapurna Base Camp Trek) + ไกด์หญิงไทย\n","ราคา ฿42,500\n","25 ธันวาคม 2022\n","25 ธันวาคม 2022 22 เมษายน 2023\n","แอดเวนเจอร์\n","คำถามเพิ่มเติม สำหรับ ทัวร์เทรคกิ้ง\n","ทัวร์ที่สนใจ Selectทัวร์ EBC Gokyo Trek ข้าม Cho La Pass และ Renjo La Pass 18 วัน + ไกด์หญิงไทยทัวร์ปีนัง มาเลเซีย พาเที่ยวปีนัง ไกด์หญิงไทย | ทัวร์ส่วนตัวทัวร์ Mohare & Khopra Trek 12 วัน + ไกด์หญิงไทยทัวร์ Langtang เนปาล 11 วัน (มี 1 วันเต็มเที่ยวในเมือง) + ไกด์หญิงไทยทัวร์ ABC เนปาล 13 วัน (ทัวร์ Annapurna Base Camp Trek) + ไกด์หญิงไทยทัวร์ Everest 3 Passes & EBC & Kalapatthar Trek + ไกด์หญิงไทยทัวร์ Annapurna Circuit + Tilicho Lake Trek + ไกด์หญิงไทยทัวร์ EBC & Kalapatthar Trek + ไกด์หญิงไทย | รับจัดกลุ่มส่วนตัวทัวร์ Mardi Himal Base Camp Trek + ไกด์หญิงไทย | รับจัดกลุ่มส่วนตัวทัวร์ Poon Hill Trek + ไกด์หญิงไทย | รับจัดกลุ่มส่วนตัวทัวร์จอร์แดน ส่วนตัว เที่ยว Dead Sea, Petra, Wadi Rum, Aqaba, Ammanทัวร์ Tajikistan & Kyrgyzstan เที่ยวส่วนตัว + ไกด์คนไทย: ตะลุยเทือกเขา Pamirทัวร์ Kyrgyzstan ส่วนตัว เที่ยว แบบลุยๆ เทรคกิ้ง + แค้มปิ้ง + ไกด์คนไทยทัวร์ศรีลังกา ส่วนตัว เที่ยว Sigiriya, Adam's Peak, Galle, Kandy, World’s End\n","ชื่อ-สกุล *\n","อีเมล *\n","คำถามเพิ่มเติม\n","สิ่งน่ารู้\n","เกี่ยวกับหยก\n","ทำไมทัวร์ของหยกจึงแตกต่าง?\n","ติดต่อ SanookTiew\n","ลิขสิทธิ์และคำสงวนสิทธิ์\n","\n","แหล่งข้อมูลเพิ่มเติม\n","คู่มือเที่ยว\n","เที่ยวไหนดี\n","บทความ\n","รับจัดทริปส่วนตัว\n","รายได้เสริมจากการท่องเที่ยว\n","หยกมีไลน์แล้ว แอดมาคุยกันค่ะ\n","Copyright © 2015-2022 • SanookTiew • All Rights Reserved • เว็บไซต์นี้ขับเคลื่อนด้วยพละกำลังจากกาแฟและการเทรคกิ้ง • DOT License # 51/00978\n","Facebook\n","Instagram\n","เนื้อหาทั้งหมดเป็นลิขสิทธิ์ของ SanookTiew แต่เพียงผู้เดียว\n","ฮาโหลๆ หยกเห็นนะคะ ว่าคุณได้ปิดการใช้งาน JavaScript หยกเข้าใจดีเลยค่ะ แต่ว่า SanookTiew จำเป็นต้องใช้ JavaScript เพื่อการป้องกันข้อมูลนะคะ หากคุณเปิดใช้งาน JavaScript อีกครั้ง คุณก็จะสามารถสนุกกับการค้นหาการผจญภัยครั้งต่อไปได้ค่ะ!\n","\n","doc 7\n","4. คู่มือการปฏิบัติงาน การสอบแข่งขันเพื่อบรรจุและแต่งตั้งบุคคลเข้ารับราชการเป็นข้าราชการครูและบุคลากรทางการศึกษาตำแหน่ง \"ครูผู้ช่วย\"\n","5. คู่มือการปฏิบัติงาน การคัดเลือกบุคคลเพื่อบรรจุและแต่งตั้งเข้ารับราชการเป็นข้าราชการครูและบุคลากรทางการศึกษาตำแหน่ง \"ครูผู้ช่วย\" (กรณีที่มีความจำเป็นหรือมีเหตุพิเศษ)\n","6. คู่มือการปฏิบัติงาน การขอช่วยราชการของข้าราชการครูและบุคลากรทางการศึกษา\n","7. คู่มือการปฏิบัติงาน การขอปรับเงินเดือนกรณีวุฒิการศึกษาเพิ่มขึ้นหรือสูงขึ้นของข้าราชการครู\n","8. คู่มือการปฏิบัติงาน การให้ข้าราชการครูและบุคลากรทางการศึกษารักษาการในตำแหน่ง \"ผู้อำนวยการสถานศึกษา\"\n","\n","doc 8\n","8 ศิลปิน ส่งคลิปถึงแฟนไทย ชวนมามันส์เต็มแม็กซ์ในงาน LALAPA K-CONCERT IN BANGKOK 2022 24 กันยานี้ ห้ามพลาด!!\n","3 months ago popconth\n","หลังจากผู้จัดหน้าใหม่อย่าง บริษัท PEERORUM (พีโอรึม) เปิดตัวโปรเจคสุดพิเศษ คอนเสิร์ตรวมศิลปินที่เตรียมขนไอดอลเกาหลีมามากกว่า 40 ชีวิต มาร่วมสร้างความสนุกสุดมันส์ให้แฟนๆ ชาวไทยได้สนุกเต็มอรรถรส ในงาน LALAPA K-CONCERT IN BANGKOK 2022 ที่จะจัดขึ้นในวันเสาร์ที่ 24 กันยายน 2565 ณ ยูเนี่ยน ฮอลล์ ศูนย์การค้ายูเนี่ยน มอลล์ ตอนนี้เหล่าศิลปินได้ทยอยส่งคลิปสุดอ้อนมาชวนแฟนๆ…\n","\n","doc 9\n","เราเปิดโอกาสรับสมัครบุคคลทั่วไปเข้าสู่ทีมงานพัฒนาวิกิของเรา เนื่องจากระบบวิกิเป็นระบบที่ใหญ่และต้องมีฐานข้อมูลต้องครอบคลุม ซึ่งไม่สามารถทำให้สำเร็จได้ด้วยเพียงคนกลุ่มเล็กๆในเวลาสั้นๆ เราจึงเปิดโอกาสให้บุคคลที่มีเวลาและพอจะสละเวลามาร่วมพัฒนาวิกิของเราโดยการเพิ่ม/เติมในส่วนของข้อมูลที่ยังไม่สมบูรณ์\n","โดยถ้าหากคุณสนใจโปรดส่งอีเมล์แจ้งตามรายการด้านล่าง และอธิบายสาเหตุที่อยากเข้าร่วมทีมงานพัฒนาวิกิกับเราที่อีเมล์ [email protected]\n","ชื่อบัญชีเฟสบุค และลิงค์ URL โปรไฟล์ (ถ้ามี)\n","ชื่อ-นามสกุล และนามแฝง (ชื่อของคุณจะถูกจารึกในประวัติศาสตร์การพัฒนาวิกิของเรา)\n","เบอร์โทรศัพท์ที่ติดต่อได้ (เผื่อกรณีฉุกเฉิน)\n","หมายเหตุ : ข้อมูลของคุณจะถูกเก็บเป็นความลับสูงสุด, เมื่อหลังจากทีมงานพิจารณาการสมัครของคุณแล้ว ทีมงานจะติดต่อกลับไปทางอีเมล์ โปรดรอการติดต่อกลับจากเรา, ในขณะนี้เรายังรับสมัครโดยไม่จำกัดจำนวน แต่เราอาจจะในอนาคต\n","ค้นหาข้อมูลในวิกิ\n","ผลการค้นหา\n","ยอดนักสืบจิ๋วโคนัน เดอะซีรีย์ ปี 9\n","ตอนที่ 403 | ทางเดินที่พูดไม่ได้ (ตอนจบ)\n","ไม่มีข้อมูล\n","ตัวละครหลัก\n","ไม่มีข้อมูล\n","ผู้เคราะห์ร้าย\n","ไม่มีข้อมูล\n","ผู้ร้าย / สมรู้ร่วมคิด\n","ไม่มีข้อมูล\n","ตัวละครใหม่\n","ไม่มีข้อมูล\n","พบตัวละครใหม่\n","ทั้งหมด 0 คน\n","ตอนที่\n","ปีที่\n","ชื่อตอน\n","วันที่ออกอากาศ\n","ญี่ปุ่น\n","ไทย\n","ญี่ปุ่น\n","ไทย\n","372 403 9\n","ทางเดินที่พูดไม่ได้ (ตอนจบ)\n","ไม่มีข้อมูล ไม่มีข้อมูล\n","เรายังต้องการผู้พัฒนาอีกมากมาช่วยกันพัฒนาฐานข้อมูล\n","หาคุณสนใจเข้ามาร่วมเป็นส่วนหนึ่งในทีมงานพัฒนาวิกิกับเรา ? ลงทะเบียนเดี๋ยวนี้\n","ค้นหาข้อมูล ตัวละครหลัก\n","เลือกตัวละครหลัก คุโด้ ชินอิจิ (Silver Bullet)โมริ รันโมริ โคโกโร่ (โคโกโร่นิทรา)เอโดงาวะ โคนัน (Cool guy, Cool kid,เด็กแสบ, กาฝาก)อากาสะ ฮิโรชิ (ด๊อกเตอร์อากาสะ)โยชิดะ อายูมิซึบุรายะ มิซึฮิโกะโคจิมะ เก็นตะไฮบาระ ไอมิยาโนะ ชิโฮะ- ท่านผู้นั้น- ยิน- วอดก้าคริส วินยาร์ด (ชารอน วินยาร์ด)- เคียนติ- กอร์นมิยาโนะ อาเคมิอามุโระ โทโอรุ (ฟุรุยะ เรย์ / ซีโร่)- เตกีล่ามัตสึยาม่า เคนโซ- คาลวาโดสฮอนโด ฮิเดมิ (มิซึนาชิ เรย์นะ)มิยาโนะ อัทซึชิมิยาโนะ เอเลน่า (เฮลล์แองเจิ้ล)- ไอริช- รัม- สก๊อตช์เมงูเระ จูโซทาคางิ วาตารุซาโต้ มิวาโกะชิราโทริ นินซาบุโร่มิยาโมโต้ ยูมิชิบะ ผู้หมวดนากาโมริ กินโซจาคิ ชินทาโร่- โทเมะมัสสึโมโตะ คิโยนางะ- โมริมุระโอดางิริ โทชิโร่ซาโต้ มาซาโยชิมัตสึดะ จิมเปย์ฮางิวาระ เคนจิยูมินาง่า สารวัตรวากาอิ เคนจิโคบายาชิ โยสุเกะมิอิเกะ นาเอะโกะฮาคุบะ ผู้บังคับการดาเตะ วาตารุฮัตโตริ เฮย์โซโยโคมิโซะ ซังโงโยโคมิโซะ จูโงยามามูระ มิซาโอะยามาโตะ คันซึเกะ (คันจัง)อุเอฮาระ ยูอิอายาโนะโคจิ ฟูมิมาโร่โอกิโนะ อายามิโมโรฟุชิ ทากาอากิ- เดอลองโจดี้ สตาร์ลิ่ง (โจดี้ แซนตามีเลี่ยน)เจมส์ แบล็กอากาอิ ชูอิจิ (โมโรโบชิ ได)อังเดร คาเมลอีธาน ฮอนโดคุโรบะ ไคโตะ (จอมโจรคิด รุ่นที่ 2)คุโรบะ โทอิจิ (จอมโจรคิด รุ่นที่ 1)จิอิ โคโนะสึเกะนากาโมริ อาโอโกะฮาคุบะ ซางุรุคุโด้ ยูซากุคุโด้ ยูกิโกะ (ไนท์บารอนเนส)คิซากิ เอริซึซึกิ โซโนโกะฮัตโตริ เฮย์จิโทยามะ คาซึฮะเคียวโกขุ มาโคโตะโคบายาชิ ซึมึโกะอาราอิเดะ โทโมอากิฮอนโด เอย์สึเกะโอกิยะ สึบารุ (อากาอิ ชูอิจิ)เซระ มาสึมิเอโนโมโตะ อาซึสะฟุซาเอะ แคมเบลสึบุรายะ อาซามิคุริยาม่า มิโดริโคจิมะ เก็นจิโอกิโนะ โยโกะ (โยโกะจัง)อากากิ ฮิเดโอะ (ฮิเดะ)ยูเอมูระ นาโอกิฮัตโตริ ชิซึกะซึซึกิ จิโรคิจิยามามูระ มิซาเอะคุโจ เรโกะเมงูเระ มิโดริซึซึกิ อายาโกะซึซึกิ ชิโร่ซึซึกิ โทโมโกะคิโนชิตะ โยชิโร่สึคุโมะ โมโตยะสึโซนาดะ คาซึมิอุเอมัทซึ ริวจิโร่โอตากิ โกโร่ฮิโง เรียวสึเกะ (ฮิโงะ)โยเนะฮาระ อากิโกะทาคายาม่า มินามิโทมิซาวะ ยูโซซานาดะ คาสึมิซานาดะ ทาคาฮิโระ- โคราเซาโอวกะ โมมิจิเรนยะ คาราสุมะ\n","ค้นหาข้อมูล เดอะซีรีย์\n","เลือกปี (โคนัน เดอะซีรีย์) โคนัน เดอะซีรีย์ ปี 1โคนัน เดอะซีรีย์ ปี 2โคนัน เดอะซีรีย์ ปี 3โคนัน เดอะซีรีย์ ปี 4โคนัน เดอะซีรีย์ ปี 5โคนัน เดอะซีรีย์ ปี 6โคนัน เดอะซีรีย์ ปี 7โคนัน เดอะซีรีย์ ปี 8โคนัน เดอะซีรีย์ ปี 9โคนัน เดอะซีรีย์ ปี 10โคนัน เดอะซีรีย์ ปี 11โคนัน เดอะซีรีย์ ปี 12โคนัน เดอะซีรีย์ ปี 13โคนัน เดอะซีรีย์ ปี 14โคนัน เดอะซีรีย์ ปี 15โคนัน เดอะซีรีย์ ปี 16โคนัน เดอะซีรีย์ ปี 17โคนัน เดอะซีรีย์ ปี 18โคนัน เดอะซีรีย์ ปี 19โคนัน เดอะซีรีย์ ปี 20โคนัน เดอะซีรีย์ ปี 21\n","เลือกตอน (โคนัน เดอะซีรีย์) ปี 1 | คดีฆาตกรรมบนรถไฟเหาะปี 1 | ยอดนักสืบย่อส่วน คดีลักพาตัวลูกสาวประธานบริษัทปี 1 | คดีฆาตกรรมในห้องปิดตายของยอดดาราปี 1 | คดีลายแทงรหัสลับปี 1 | คดีรถไฟชินคันเซ็นมรณะปี 1 | คดีฆาตกรรมวันวาเลนไทน์ปี 1 | คดีของขวัญอันตรายปี 1 | คดีฆาตกรรมเจ้าของหอศิลป์ปี 1 | คดีฆาตกรรมอำพรางปี 1 | คดีข่มขู่นักฟุตบอลอาชีพปี 1 | คดีฆาตกรรมเปียโนโซนาต้า (ตอนแรก)ปี 1 | คดีฆาตกรรมเปียโนโซนาต้า (ตอนจบ)ปี 1 | คดีลักพาตัวอายูมิจังปี 1 | คดีฆาตกรรมบุรุษลึกลับปี 1 | คดีข้อความปริศนาปี 1 | คดีฆาตกรรมศพล่องหนปี 1 | คดีฆาตกรรมนักสะสมของเก่าปี 1 | คดีบุกปล้นดีพาร์ทเม้นสโตร์ปี 1 | คดีฆาตกรรมเจ้าสาวเดือนมิถุนาปี 1 | คดีฆาตกรรมลิฟท์มรณะปี 1 | คดีฆาตกรรมในบ้านผีสิงปี 1 | คดีโลเคชั่นอันตรายปี 1 | คดีฆาตกรรมลูกโซ่ (ตอนแรก)ปี 1 | คดีฆาตกรรมลูกโซ่ (ตอนจบ)ปี 1 | คดีสาวสวยลึกลับผู้ไร้ความทรงจำปี 1 | คดีเรียกค่าไถ่จอมปลอมปี 1 | คดีฆาตกรรมจอห์นยอดสุนัขปี 1 | คดีฆาตกรรมสมาคมศิษย์เก่าของโคโกโร่ (ตอนแรก)ปี 1 | คดีฆาตกรรมสมาคมศิษย์เก่าของโคโกโร่ (ตอนจบ)ปี 1 | คดีฆาตกรรมคอมพิวเตอร์ปี 1 | คดีฆาตกรรมพยานอ้างอิงปี 1 | คดีฆาตกรรมในสถานีโทรทัศน์ปี 1 | คดีฆาตกรรมในร้านกาแฟปี 1 | กลุ่มนักสืบเยาวชนผจญภัยปี 1 | คดีฆาตกรรมซ่อนเงื่อน (ตอนแรก)ปี 1 | คดีฆาตกรรมซ่อนเงื่อน (ตอนจบ)ปี 1 | คดีฆาตกรรมทุ่มครึ่งวันจันทร์ปี 1 | คดีฆาตกรรมดอกกระบองเพชรปี 1 | คดีฆาตกรรมเทศกาลปีศาจแดงปี 1 | คดีฆาตกรรมลูกสาวเศรษฐี (ตอนแรก)ปี 1 | คดีฆาตกรรมลูกสาวเศรษฐี (ตอนจบ)ปี 1 | คดีทำลายธงแห่งชัยชนะปี 1 | คดีฆาตกรรมในห้องคาราโอเกะปี 1 | คดีลักพาตัวเอโดะงาวะ โคนัน ปี 2 | คดีฆาตกรรมสามพี่น้องฮอตตะปี 2 | คดีฆาตกรรมครีมพอกหน้าปี 2 | คดีฆาตกรรมบ้านพักภูเขาหิมะปี 2 | คดีฆาตกรรมสปอร์ทคลับปี 2 | คดีฆาตกรรมนักการทูต (ตอนแรก)ปี 2 | คดีฆาตกรรมนักการทูต (ตอนจบ)ปี 2 | คดีฆาตกรรมในห้องสมุดปี 2 | คดีฆาตกรรมสนามฝึกซ้อมกอล์ฟปี 2 | คดีฆาตกรรมตำนานคิริเทนงู (ตอนแรก)ปี 2 | คดีฆาตกรรมตำนานคิริเทนงู (ตอนจบ)ปี 2 | คดีฆาตกรรมอาวุธปริศนาปี 2 | คดีฆาตกรรมบริษัทเกมปี 2 | คดีฆาตกรรมบนรถไฟปี 2 | คดีฆาตกรรมบริษัททำความสะอาดปี 2 | คดีฆาตกรรมคนบ้าโฮส์ม (ตอนแรก)ปี 2 | คดีฆาตกรรมคนบ้าโฮส์ม (ตอนจบ)ปี 2 | คดีฆาตกรรมเด็กเดินจ่ายตลาดปี 2 | คดีฆาตกรรมนักวาดภาพปี 2 | คดีฆาตกรรมเรือผีสิง (ตอนแรก)ปี 2 | คดีฆาตกรรมเรือผีสิง (ตอนจบ)ปี 2 | คดีฆาตกรรมสัตว์ประหลาดโกเมล่าปี 2 | คดีฆาตกรรมรอยนิ้วมือที่ 3ปี 2 | คดีปริศนาลักพาตัวปูกับปลาวาฬปี 2 | คดีฆาตกรรมกลางถนนยามวิกาลปี 2 | คดีฆาตกรรมนางเอกละครเวทีปี 2 | คดีฆาตกรรมไนท์บารอน (ภาคเปิดคดี)ปี 2 | คดีฆาตกรรมไนท์บารอน (ภาคสงสัย)ปี 2 | คดีฆาตกรรมไนท์บารอน (ภาคปิดคดี)ปี 2 | คดีฆาตกรรมนักตื้อปี 2 | คดีฆาตกรรมบ้านพักต่างอากาศแฝด 3ปี 2 | ปฏิบัติการขบวนการนักสืบเยาวชนปี 2 | คดีฆาตกรรมยมทูตจินในปี 2 | คดีฆาตกรรมบริษัทเงินกู้ปี 2 | โคนันปะทะจอมโจรคิด (ตอนแรก)ปี 2 | โคนันปะทะจอมโจรคิด (ตอนจบ)ปี 2 | คดีฆาตกรรมต่อเนื่องในบ้านเศรษฐี (ตอนแรก)ปี 2 | คดีฆาตกรรมต่อเนื่องในบ้านเศรษฐี (ตอนจบ)ปี 2 | คดีฆาตกรรมโจรปล้นธนาคารปี 2 | คดีฆาตกรรมจิตกรพเนจรปี 2 | คดีลักพาตัวนักร้องยอดนิยม (ตอนแรก)ปี 2 | คดีลักพาตัวนักร้องยอดนิยม (ตอนจบ)ปี 2 | คดีฆาตกรรมในโรงพยาบาลปี 2 | คดีฆาตกรรมบ้านพักสกี (ตอนแรก)ปี 2 | คดีฆาตกรรมบ้านพักสกี (ตอนจบ) ปี 3 | คดีปริศนาค้นหาที่เกิดเหตุลักพาตัวปี 3 | คดีฆาตกรรมนกกระสาแทนคุณปี 3 | คดีฆาตกรรมปราสาทแดร็คคูล่า (ตอนแรก)ปี 3 | คดีฆาตกรรมปราสาทแดร็คคูล่า (ตอนจบ)ปี 3 | คดีฆาตกรรมกลิ่นหอมของดอกไม้ปี 3 | คดีโจรปล้นธนาคารเข้าโรงพยาบาลปี 3 | คดีฆาตกรรมหฤโหดนักเดินเขา (ตอนแรก)ปี 3 | คดีฆาตกรรมหฤโหดนักเดินเขา (ตอนจบ)ปี 3 | คดีฆาตกรรมตำนานปิศาจหิมะปี 3 | คดีฆาตกรรมวันเดทของโคโกโร่ปี 3 | เมื่อยอดนักสืบจนมุม! กับคดีฆาตกรรมใหญ่ 2 คดีต่อเนื่อง (ตอนพิเศษ 2 ชั่วโมง)ปี 3 | เมื่อยอดนักสืบจนมุม! กับคดีฆาตกรรมใหญ่ 2 คดีต่อเนื่อง (ตอนพิเศษ 2 ชั่วโมง)ปี 3 | เมื่อยอดนักสืบจนมุม! กับคดีฆาตกรรมใหญ่ 2 คดีต่อเนื่อง (ตอนพิเศษ 2 ชั่วโมง)ปี 3 | เมื่อยอดนักสืบจนมุม! กับคดีฆาตกรรมใหญ่ 2 คดีต่อเนื่อง (ตอนพิเศษ 2 ชั่วโมง)ปี 3 | คดีฆาตกรรมไวน์แห่งการอำลาปี 3 | คดีฆาตกรรมช่างปั้นดินเผาชื่อดัง (ตอนแรก)ปี 3 | คดีฆาตกรรมช่างปั้นดินเผาชื่อดัง (ตอนจบ)ปี 3 | คดีความทรงจำของรักครั้งแรก (ตอนแรก)ปี 3 | คดีความทรงจำของรักครั้งแรก (ตอนจบ)ปี 3 | คดีฆาตกรรมดาราหลังย้อนยุค (ตอนแรก)ปี 3 | คดีฆาตกรรมดาราหลังย้อนยุค (ตอนจบ)ปี 3 | คดีแก๊งค์โจรในคฤหาสน์ปริศนา (ตอนแรก)ปี 3 | คดีแก๊งค์โจรในคฤหาสน์ปริศนา (ตอนจบ)ปี 3 | คดีฆาตกรรมในภาพเด็ดปี 3 | คดีปริศนามนุษย์ดาวตัวตุ่น (ตอนแรก)ปี 3 | คดีปริศนามนุษย์ดาวตัวตุ่น (ตอนจบ)ปี 3 | คดีการไล่ล่าของขบวนการนักสืบเยาวชนปี 3 | คดีฆาตกรรมในโรงเรียนสอนทำอาหาร (ตอนแรก)ปี 3 | คดีฆาตกรรมในโรงเรียนสอนทำอาหาร (ตอนจบ)ปี 3 | 7 เรื่องประหลาดของโรงเรียนประถมเทย์ตันปี 3 | คดีฆาตกรรมบนชายหาดสีขาวปี 3 | คดีฆาตกรรมนักดำน้ำ (ตอนแรก)ปี 3 | คดีฆาตกรรมนักดำน้ำ (ตอนจบ)ปี 3 | คดีการหายตัวของนักเขียนนิยายสืบสวน (ตอนแรก)ปี 3 | คดีการหายตัวของนักเขียนนิยายสืบสวน (ตอนจบ)ปี 3 | คดีฆาตกรรมต่อเนื่องแห่งนานิวะ (ตอนพิเศษ 1 ชั่วโมง)ปี 3 | คดีฆาตกรรมต่อเนื่องแห่งนานิวะ (ตอนพิเศษ 1 ชั่วโมง)ปี 3 | คดีฆาตกรรมหน้ากากไยบะปี 3 | คดีฆาตกรรมฮันนี่ค็อกเทลปี 3 | คดีห้องอาบน้ำที่ปิดล็อก (ตอนแรก)ปี 3 | คดีห้องอาบน้ำที่ปิดล็อก (ตอนจบ)ปี 3 | คดีลักพาตัวสาวพยากรณ์อากาศปี 3 | คดีฆาตกรรมมือปืนปริศนา (ตอนแรก)ปี 3 | คดีฆาตกรรมมือปืนปริศนา (ตอนจบ)ปี 3 | คดีฆาตกรรมคณะละครเร่ (ตอนแรก)ปี 3 | คดีฆาตกรรมคณะละครเร่ (ตอนจบ)ปี 3 | คดีปล้นเงินพันล้านขององค์กรชุดดำปี 3 | ผู้หญิงที่มาจากองค์กรชุดดำ กับคดีฆาตกรรมอาจารย์มหาวิทยาลัย (ตอนพิเศษ 2 ชั่วโมง)ปี 3 | ผู้หญิงที่มาจากองค์กรชุดดำ กับคดีฆาตกรรมอาจารย์มหาวิทยาลัย (ตอนพิเศษ 2 ชั่วโมง)ปี 3 | ผู้หญิงที่มาจากองค์กรชุดดำ กับคดีฆาตกรรมอาจารย์มหาวิทยาลัย (ตอนพิเศษ 2 ชั่วโมง)ปี 3 | ผู้หญิงที่มาจากองค์กรชุดดำ กับคดีฆาตกรรมอาจารย์มหาวิทยาลัย (ตอนพิเศษ 2 ชั่วโมง)ปี 3 | คดีขู่ฆ่าหมู่ในสนามกีฬา (ตอนแรก)ปี 3 | คดีขู่ฆ่าหมู่ในสนามกีฬา (ตอนจบ) ปี 4 | คดีฆาตกรรมคนรักมายากล (ภาคคดี)ปี 4 | คดีฆาตกรรมคนรักมายากล (ภาคสงสัย)ปี 4 | คดีฆาตกรรมคนรักมายากล (ภาคไขคดี)ปี 4 | คดีตามหาอาวุธที่หายไปปี 4 | คดีสำรวจปราสาทโบราณ (ตอนแรก)ปี 4 | คดีสำรวจปราสาทโบราณ (ตอนจบ)ปี 4 | คดีฆาตกรรมการฉายภาพยนตร์ครั้งสุดท้าย (ตอนแรก)ปี 4 | คดีฆาตกรรมการฉายภาพยนตร์ครั้งสุดท้าย (ตอนจบ)ปี 4 | คดี SOS! ข้อความจากอายูมิปี 4 | คดีห้องฆาตกรรมห้องปิดตายในคืนก่อนแต่งงาน (ตอนแรก)ปี 4 | คดีห้องฆาตกรรมห้องปิดตายในคืนก่อนแต่งงาน (ตอนจบ)ปี 4 | การดูดาวที่น่าสงสัยปี 4 | โฮคุโตะเซย์หมายเลข 3 ต้นทางอุเอโนะ (ตอนแรก)ปี 4 | โฮคุโตะเซย์หมายเลข 3 ต้นทางอุเอโนะ (ตอนจบ)ปี 4 | นิยายรักตำรวจนครบาล (ตอนแรก)ปี 4 | นิยายรักตำรวจนครบาล (ตอนจบ)ปี 4 | คดีรถรางเบรกฉุกเฉินปี 4 | คดีบั้นจี้สวนสนุกปี 4 | ความจริงในคดีรถระเบิด (ตอนแรก)ปี 4 | ความจริงในคดีรถระเบิด (ตอนจบ)ปี 4 | คดีชายชราลึกลับหายตัวปี 4 | หน้าร้อนอันตรายของโซโนโกะ (ตอนแรก)ปี 4 | หน้าร้อนอันตรายของโซโนโกะ (ตอนจบ)ปี 4 | คดีห้องปิดตายกุญแจอยู่ในน้ำปี 4 | นิยายรักตำรวจนครบาลภาค 2 (ตอนแรก)ปี 4 | นิยายรักตำรวจนครบาลภาค 2 (ตอนจบ)ปี 4 | ขบวนรถไฟที่เงียบสงัดปี 4 | ตำนานอาถรรพณ์เจดีย์ห้าชั้น (ตอนแรก)ปี 4 | ตำนานอาถรรพณ์เจดีย์ห้าชั้น (ตอนจบ)ปี 4 | จิตสังหารกลางภัตตาคารกลางน้ำปี 4 | ห้องปิดตายลอยฟ้า คดีแรกของคุโด้ ชินอิจิ (ตอนแรก)ปี 4 | ห้องปิดตายลอยฟ้า คดีแรกของคุโด้ ชินอิจิ (ตอนจบ)ปี 4 | ความลับของพระจันทร์กับดวงดาวและพระอาทิตย์ (ตอนแรก)ปี 4 | ความลับของพระจันทร์กับดวงดาวและพระอาทิตย์ (ตอนจบ)ปี 4 | คดีขบวนการนักสืบเยาวชนหายตัวปี 4 | อาถรรพณ์บ้านแมงมุมที่ทตโทริ (ภาคคดี)ปี 4 | อาถรรพณ์บ้านแมงมุมที่ทตโทริ (ภาคสงสัย)ปี 4 | อาถรรพณ์บ้านแมงมุมที่ทตโทริ (ภาคปิดคดี)ปี 4 | จูบของวีนัสปี 4 | มุมอับในความมืด (ตอนแรก)ปี 4 | มุมอับในความมืด (ตอนจบ)ปี 4 | ไดอิ้งเมสเซจคืนชีพ (ตอนแรก)ปี 4 | ไดอิ้งเมสเซจคืนชีพ (ตอนจบ)ปี 4 | แผนฆ่าปีที่ 20 คดีฆาตกรรมต่อเนื่อง ซิมโฟนี่หมายเลข 1 (ตอนพิเศษ1)ปี 4 | แผนฆ่าปีที่ 20 คดีฆาตกรรมต่อเนื่อง ซิมโฟนี่หมายเลข 1 (ตอนพิเศษ2)ปี 4 | แผนฆ่าปีที่ 20 คดีฆาตกรรมต่อเนื่อง ซิมโฟนี่หมายเลข 1 (ตอนพิเศษ3)ปี 4 | แผนฆ่าปีที่ 20 คดีฆาตกรรมต่อเนื่อง ซิมโฟนี่หมายเลข 1 (ตอนพิเศษ4)ปี 4 | ชายที่ถูกฆ่า 4 ครั้งปี 4 | การเผชิญหน้าอีกครั้งกับองค์กรชุดดำ (ภาคไฮบาระ)ปี 4 | การเผชิญหน้าอีกครั้งกับองค์กรชุดดำ (ภาคโคนัน)ปี 4 | การเผชิญหน้าอีกครั้งกับองค์กรชุดดำ (ภาคไขคดี)ปี 4 | คดีรถบรรทุกพุ่งชนร้านกาแฟ ปี 5 | บทเพลงยามค่ำคืนแห่งจิตสังหารสีแดง (ตอนแรก)ปี 5 | บทเพลงยามค่ำคืนแห่งจิตสังหารสีแดง (ตอนจบ)ปี 5 | ความลับของประตูบานที่ 9ปี 5 | ใบเสร็จอันตรายปี 5 | หน้ากากต้องสาปกำลังหัวเราะอย่างเลือดเย็น (ตอนพิเศษ 1 ชั่วโมง)ปี 5 | หน้ากากต้องสาปกำลังหัวเราะอย่างเลือดเย็น (ตอนพิเศษ 1 ชั่วโมง)ปี 5 | ยอดนักสืบถูกฆาตกรรม (ตอนแรก)ปี 5 | ยอดนักสืบถูกฆาตกรรม (ตอนจบ)ปี 5 | เสียงปืนปริศนาที่คำรามในความมืดปี 5 | การคืนชีพที่เดิมพันด้วยชีวิต (ขบวนการนักสืบในถ้ำ)ปี 5 | การคืนชีพที่เดิมพันด้วยชีวิต (ยอดนักสืบบาดเจ็บสาหัส)ปี 5 | การคืนชีพทีเดิมพันด้วยชีวิต (ทางเลือกที่ 3)ปี 5 | การคืนชีพที่เดิมพันด้วยชีวิต (อัศวินชุดดำ)ปี 5 | การคืนชีพที่เดิมพันด้วยชีวิต (ชินอิจิที่กลับมา)ปี 5 | การคืนชีพที่เดิมพันด้วยชีวิต (สถานที่แห่งคำมั่นสัญญา)ปี 5 | กล่องเพลงที่เปี่ยมด้วยความหมาย (ตอนแรก)ปี 5 | กล่องเพลงที่เปี่ยมด้วยความหมาย (ตอนจบ)ปี 5 | อาวุธสังหารล่องหน การสันนิษฐานครั้งแรกของรันปี 5 | กับดักซุปเปอร์คาร์ (ตอนแรก)ปี 5 | กับดักซุปเปอร์คาร์ (ตอนจบ)ปี 5 | ผู้ต้องสงสัย โมริ โคโกโร่ (ตอนแรก)ปี 5 | ผู้ต้องสงสัย โมริ โคโกโร่ (ตอนจบ)ปี 5 | ผู้โดยสารคนที่10 (ตอนแรก)ปี 5 | ผู้โดยสารคนที่10 (ตอนจบ)ปี 5 | ปีกของอิคารอสสีดำ (ตอนแรก)ปี 5 | ปีกของอิคารอสสีดำ (ตอนจบ)ปี 5 | นิยายรักตำรวจนครบาล ภาค3 (ตอนแรก)ปี 5 | นิยายรักตำรวจนครบาล ภาค3 (ตอนจบ)ปี 5 | การสันนิษฐานที่สมบูรณ์แบบเกินไปปี 5 | ทางเข้าเขาวงกต ความพิโรธของเทวรูปขนาดยักษ์ (ตอนพิเศษ 1 ชั่วโมง)ปี 5 | ทางเข้าเขาวงกต ความพิโรธของเทวรูปขนาดยักษ์ (ตอนพิเศษ 1 ชั่วโมง)ปี 5 | ความลับของกิจการที่รุ่งเรืองปี 5 | คดีรถตกเขาที่ภูเขาริวจินปี 5 | เรือนกลางน้ำแห่งตำนานสระเบญจรงค์ (ตอนแรก)ปี 5 | เรือนกลางน้ำแห่งตำนานสระเบญจรงค์ (ตอนจบ)ปี 5 | เห็ดกับหมีและขบวนการนักสืบเยาชน (ตอนแรก)ปี 5 | เห็ดกับหมีและขบวนการนักสืบเยาชน (ตอนจบ)ปี 5 | คดีปริศนาในห้องย้อนยุคปี 5 | เบย์ออฟเดอะรีเวนจ์ (ตอนแรก)ปี 5 | เบย์ออฟเดอะรีเวนจ์ (ตอนจบ)ปี 5 | ความลับของเมงุเระที่ถูกผนึกไว้ (ตอนแรก)ปี 5 | ความลับของเมงุเระที่ถูกผนึกไว้ (ตอนจบ)ปี 5 | รวมพลยอดนักสืบ คุโด้ ชินอิจิ ปะทะ จอมโจรคิด (ตอนพิเศษ 2 ชั่วโมง)ปี 5 | รวมพลยอดนักสืบ คุโด้ ชินอิจิ ปะทะ จอมโจรคิด (ตอนพิเศษ 2 ชั่วโมง)ปี 5 | รวมพลยอดนักสืบ คุโด้ ชินอิจิ ปะทะ จอมโจรคิด (ตอนพิเศษ 2 ชั่วโมง)ปี 5 | รวมพลยอดนักสืบ คุโด้ ชินอิจิ ปะทะ จอมโจรคิด (ตอนพิเศษ 2 ชั่วโมง)ปี 5 | ผู้จ้างวานที่มีแต่ความเท็จ (ตอนแรก)ปี 5 | ผู้จ้างวานที่มีแต่ความเท็จ (ตอนจบ)ปี 5 | และแล้วนางเงือกก็หายไป (ภาคคดี)ปี 5 | และแล้วนางเงือกก็หายไป (ภาคสันนิษฐาน)ปี 5 | และแล้วนางเงือกก็หายไป (ภาคไขปริศนา)ปี 5 | กับดักเกมต่อสู้ (ตอนแรก)ปี 5 | กับดักเกมต่อสู้ (ตอนจบ) ปี 6 | คดีฆาตกรรมในห้องเรียนเครื่องปั้น (ตอนแรก)ปี 6 | คดีฆาตกรรมในห้องเรียนเครื่องปั้น (ตอนจบ)ปี 6 | ผู้โดยสารปริศนา (ตอนแรก)ปี 6 | ผู้โดยสารปริศนา (ตอนจบ)ปี 6 | คดีตกจากแมนชั่นปี 6 | หลักฐานที่ไม่หายไป (ตอนแรก)ปี 6 | หลักฐานที่ไม่หายไป (ตอนจบ)ปี 6 | ห้องเก็บไวน์ที่ปิดตายปี 6 | ทัวร์พิศวงนันกิชิราฮามะ (ตอนแรก)ปี 6 | ทัวร์พิศวงนันกิชิราฮามะ (ตอนจบ)ปี 6 | คดี 3K ที่โอซาก้า (ตอนแรก)ปี 6 | คดี 3K ที่โอซาก้า (ตอนจบ)ปี 6 | คดีคุมตัวผู้ต้องหาในชินดันเซ็น (ตอนแรก)ปี 6 | คดีคุมตัวผู้ต้องหาในชินดันเซ็น (ตอนจบ)ปี 6 | วิกฤติของเก็นตะปี 6 | โมริ โคโกโร่ตัวปลอม (ตอนแรก)ปี 6 | โมริ โคโกโร่ตัวปลอม (ตอนจบ)ปี 6 | เสียงปืนในคฤหาสน์ทานตะวันปี 6 | ปริศนาที่ติดอยู่ในร่างแห (ตอนแรก)ปี 6 | ปริศนาที่ติดอยู่ในร่างแห (ตอนจบ)ปี 6 | หลักฐานในป่าแห่งการเยียวยาปี 6 | ความลับของเหล่าไอด้อล (ตอนแรก)ปี 6 | ความลับของเหล่าไอด้อล (ตอนจบ)ปี 6 | โศกนาฏกรรมที่คอกม้า OKปี 6 | โจรเรียกค่าไถ่ในภาพวาดปี 6 | นิยายรักตำรวจนครบาล ภาค 4 (ตอนแรก)ปี 6 | นิยายรักตำรวจนครบาล ภาค 4 (ตอนจบ)ปี 6 | แข่งต่อโคลง 14 บท ที่มัตสึเอะทามะสิคุริ (ตอนแรก)ปี 6 | แข่งต่อโคลง 14 บท ที่มัตสึเอะทามะสิคุริ (ตอนจบ)ปี 6 | โทษทัณฑ์ประหลาดแบบนี้ก็มีด้วยปี 6 | บุรุษผู้มาจากชิคาโก้ (ตอนแรก)ปี 6 | บุรุษผู้มาจากชิคาโก้ (ตอนจบ)ปี 6 | ภัตตาคารที่สั่นคลอนปี 6 | ตำนานสยองในคืนหิมะตก (ตอนแรก)ปี 6 | ตำนานสยองในคืนหิมะตก (ตอนจบ)ปี 6 | โอซาก้าดับเบิ้ลมิสทรี่ นักดาบแห่งนานิวะกับปราสาทเจ้าพิภพ (ตอนพิเศษ1)ปี 6 | โอซาก้าดับเบิ้ลมิสทรี่ นักดาบแห่งนานิวะกับปราสาทเจ้าพิภพ (ตอนพิเศษ2)ปี 6 | โอซาก้าดับเบิ้ลมิสทรี่ นักดาบแห่งนานิวะกับปราสาทเจ้าพิภพ (ตอนพิเศษ3)ปี 6 | โอซาก้าดับเบิ้ลมิสทรี่ นักดาบแห่งนานิวะกับปราสาทเจ้าพิภพ (ตอนพิเศษ4)ปี 6 | ศึกในศาล คิซากิปะทะโคโกโร่ (ตอนแรก)ปี 6 | ศึกในศาล คิซากิปะทะโคโกโร่ (ตอนจบ)ปี 6 | ความจริงของวันวาเลนไทน์ (ภาคคดี)ปี 6 | ความจริงของวันวาเลนไทน์ (ภาคสืบสวน)ปี 6 | ความจริงของวันวาเลนไทน์ (ภาคไขคดี)ปี 6 | สิ่งเตือนความทรงจำจากคดีฆาตกรรม (ตอนแรก)ปี 6 | สิ่งเตือนความทรงจำจากคดีฆาตกรรม (ตอนจบ)ปี 6 | ชื่อย่อที่รีบซุกซ่อน (ตอนแรก)ปี 6 | ชื่อย่อที่รีบซุกซ่อน (ตอนจบ)ปี 6 | คดีคุณยายเจ้าปัญหาหายตัวปี 6 | ความจริงของบ้านผีสิง (ตอนแรก)ปี 6 | ความจริงของบ้านผีสิง (ตอนจบ)ปี 6 | คดีสมุดประจำตัวตำรวจหาย ปี 7 | ครูสอนภาษาอังกฤษปะทะยอดนักสืบตะวันตก (ตอนแรก)ปี 7 | ครูสอนภาษาอังกฤษปะทะยอดนักสืบตะวันตก (ตอนจบ)ปี 7 | ฮูลิแกนในเขาวงกต (ตอนแรก)ปี 7 | ฮูลิแกนในเขาวงกต (ตอนจบ)ปี 7 | เหล่าพยานตัวน้อยปี 7 | ปริศนาในสวนหินน้ำไหล (ตอนแรก)ปี 7 | ปริศนาในสวนหินน้ำไหล (ตอนจบ)ปี 7 | เดจาวูในสายฝนของไชน่าทาวน์ (ตอนแรก)ปี 7 | เดจาวูในสายฝนของไชน่าทาวน์ (ตอนจบ)ปี 7 | คุโด้ ชินอิจิกับคดีในนิวยอร์ก (ภาคคดี)ปี 7 | คุโด้ ชินอิจิกับคดีในนิวยอร์ก (ภาคสืบสวน)ปี 7 | คุโด้ ชินอิจิกับคดีในนิวยอร์ก (ภาคปิดคดี)ปี 7 | มิสึฮิโกะในป่าวงกต (ตอนแรก)ปี 7 | มิสึฮิโกะในป่าวงกต (ตอนจบ)ปี 7 | เจ้าหญิงแห่งเกาะร้างกับปราสาทมังกร (ภาคคดี)ปี 7 | เจ้าหญิงแห่งเกาะร้างกับปราสาทมังกร (ภาคสืบสวน)ปี 7 | เจ้าหญิงแห่งเกาะร้างกับปราสาทมังกร (ภาคปิดคดี)ปี 7 | ลูกสแมชแห่งความรักและการตัดสินใจ (ตอนแรก)ปี 7 | ลูกสแมชแห่งความรักและการตัดสินใจ (ตอนจบ)ปี 7 | ตกปลามรณะบนเรือยาคาตะปี 7 | ศึกในศาลภาค 2 คิซากิ ปะทะ คุโจ (ตอนแรก)ปี 7 | ศึกในศาลภาค 2 คิซากิ ปะทะ คุโจ (ตอนจบ)ปี 7 | คัมมงไคเคียว (สะพานข้ามทะเล) แห่งมิตรภาพกับจิตสังหาร (ตอนแรก)ปี 7 | คัมมงไคเคียว (สะพานข้ามทะเล) แห่งมิตรภาพกับจิตสังหาร (ตอนจบ)ปี 7 | ขบวนพาเหรดของความดีและความชั่ว (ตอนแรก)ปี 7 | ขบวนพาเหรดของความดีและความชั่ว (ตอนจบ)ปี 7 | ผู้ตายที่หวลกลับมาปี 7 | กรมตำรวจสั่นคลอน ตัวประกัน 12 ล้านคน (ตอนพิเศษ 2 ชั่วโมง)ปี 7 | กรมตำรวจสั่นคลอน ตัวประกัน 12 ล้านคน (ตอนพิเศษ 2 ชั่วโมง)ปี 7 | กรมตำรวจสั่นคลอน ตัวประกัน 12 ล้านคน (ตอนพิเศษ 2 ชั่วโมง)ปี 7 | กรมตำรวจสั่นคลอน ตัวประกัน 12 ล้านคน (ตอนพิเศษ 2 ชั่วโมง)ปี 7 | ผู้ต้องสงสัยที่มองไม่เห็น (ตอนแรก)ปี 7 | ผู้ต้องสงสัยที่มองไม่เห็น (ตอนจบ)ปี 7 | หลักฐานไร้เสียงที่หลงเหลืออยู่ (ตอนแรก)ปี 7 | หลักฐานไร้เสียงที่หลงเหลืออยู่ (ตอนจบ)ปี 7 | การติดต่อกับองค์กรชุดดำ (ภาคเจรจา)ปี 7 | การติดต่อกับองค์กรชุดดำ (ภาคสะกดรอย)ปี 7 | การติดต่อกับองค์กรชุดดำ (ภาคชี้เป็นชี้ตาย)ปี 7 | ตุ๊กตาฮินะกลางแสงสนธยา (ตอนแรก)ปี 7 | ตุ๊กตาฮินะกลางแสงสนธยา (ตอนจบ)ปี 7 | จุดชมวิวที่รั้วผุพังปี 7 | สถานที่ซึ่งแดดส่องถึงปี 7 | ฮีโร่สวมหน้ากากที่แสนโสมม (ตอนแรก)ปี 7 | ฮีโร่สวมหน้ากากที่แสนโสมม (ตอนจบ)ปี 7 | กล่องซิการ์แห่งโชคลาภ (ตอนแรก)ปี 7 | กล่องซิการ์แห่งโชคลาภ (ตอนจบ)ปี 7 | วิชานินจาสร้างหลักฐานที่อยู่ปี 7 | รถคนร้ายลักพาตัวที่หายไป (ตอนแรก)ปี 7 | รถคนร้ายลักพาตัวที่หายไป (ตอนจบ)ปี 7 | ฮัตโตริ เฮย์จิ เข้าตาจน! (ตอนแรก)ปี 7 | ฮัตโตริ เฮย์จิ เข้าตาจน! (ตอนจบ) ปี 8 | ม้าสีแดงในเปลวเพลิง (ภาคคดี)ปี 8 | ม้าสีแดงในเปลวเพลิง (ภาคสืบสวน)ปี 8 | ม้าสีแดงในเปลวเพลิง (ภาคปิดคดี)ปี 8 | ปริศนาเบิร์ธเดย์ไวน์ปี 8 | มิตรภาพที่ไม่สามารถซื้อได้ด้วยเงิน (ตอนแรก)ปี 8 | มิตรภาพที่ไม่สามารถซื้อได้ด้วยเงิน (ตอนจบ)ปี 8 | แกงเผ็ดที่น่าสงสัย (ตอนแรก)ปี 8 | แกงเผ็ดที่น่าสงสัย (ตอนจบ)ปี 8 | ปริ๊นเซสที่คล้ายกัน (ตอนแรก)ปี 8 | ปริ๊นเซสที่คล้ายกัน (ตอนจบ)ปี 8 | ความลับของห้องแล็ปฯ โทโตะ (ตอนแรก)ปี 8 | ความลับของห้องแล็ปฯ โทโตะ (ตอนจบ)ปี 8 | เบื้องหลังคดีคนตกสถานีรถไฟปี 8 | รถปอร์เช่ทั้ง 4 คัน (ตอนแรก)ปี 8 | รถปอร์เช่ทั้ง 4 คัน (ตอนจบ)ปี 8 | ความลับที่ซ่อนในห้องสุขา (ตอนแรก)ปี 8 | ความลับที่ซ่อนในห้องสุขา (ตอนจบ)ปี 8 | เจ้าสาวแห่งฮุสเท่นบอสช์ (ตอนแรก)ปี 8 | เจ้าสาวแห่งฮุสเท่นบอสช์ (จบ)ปี 8 | กับดักในร้านสะดวกซื้อ (ตอนแรก)ปี 8 | กับดักในร้านสะดวกซื้อ (ตอนจบ)ปี 8 | ปะทะองค์กรชุดดำ ปริศนาคูณสองในคืนเดือนเพ็ญ (ตอนพิเศษ 1)ปี 8 | ปะทะองค์กรชุดดำ ปริศนาคูณสองในคืนเดือนเพ็ญ (ตอนพิเศษ 2)ปี 8 | ปะทะองค์กรชุดดำ ปริศนาคูณสองในคืนเดือนเพ็ญ (ตอนพิเศษ 3)ปี 8 | ปะทะองค์กรชุดดำ ปริศนาคูณสองในคืนเดือนเพ็ญ (ตอนพิเศษ 4)ปี 8 | ปะทะองค์กรชุดดำ ปริศนาคูณสองในคืนเดือนเพ็ญ (ตอนพิเศษ 5)ปี 8 | ค้นหาเครื่องหมายที่ติดอยู่ที่ก้น (ตอนแรก)ปี 8 | ค้นหาเครื่องหมายที่ติดอยู่ที่ก้น (ตอนจบ)ปี 8 | ความรัก วิญญาณและมรดกโลก (ตอนแรก)ปี 8 | ความรัก วิญญาณและมรดกโลก (ตอนจบ)ปี 8 | โทรศัพท์มือถือที่ถูกลืมไว้ (ตอนแรก)ปี 8 | โทรศัพท์มือถือที่ถูกลืมไว้ (ตอนจบ)ปี 8 | โศกนาฏกรรมของการแข่งตกปลา (ตอนแรก)ปี 8 | โศกนาฏกรรมของการแข่งตกปลา (ตอนจบ)ปี 8 | ผู้จ้างวานตัวน้อย (ตอนแรก)ปี 8 | ผู้จ้างวานตัวน้อย (ตอนจบ)ปี 8 | มายากลกลางหาวของจอมโจรคิด (ตอนแรก)ปี 8 | มายากลกลางหาวของจอมโจรคิด (ตอนจบ)ปี 8 | คนรักคือภาพลวงตาของฤดูใบไม้ผลิปี 8 | นิยายรักตำรวจนครบาล ภาค 5 (ตอนแรก)ปี 8 | นิยายรักตำรวจนครบาล ภาค 5 (ตอนจบ)ปี 8 | ตัวด้วงแห่งฤดูใบไม้ผลิอันน่าฉงนปี 8 | เรื่องอาถรรพ์ของโรงเรียนเทตัน (ตอนแรก)ปี 8 | เรื่องอาถรรพ์ของโรงเรียนเทตัน (ตอนจบ)ปี 8 | อีกาในเมืองหลวงปี 8 | คดีซิงโครนิซิตี้ (ตอนแรก)ปี 8 | คดีซิงโครนิซิตี้ (ตอนจบ)ปี 8 | โศกนาฏกรรมบนทำนบกันคลื่น (ตอนแรก)ปี 8 | โศกนาฏกรรมบนทำนบกันคลื่น (ตอนจบ)ปี 8 | บ้านขนมของแม่มดปี 8 | คดีปริศนาของชายผู้โชคดีปี 8 | แผ่นเกมที่หนีไป ปี 9 | ทางเดินที่พูดไม่ได้ (ตอนแรก)ปี 9 | ทางเดินที่พูดไม่ได้ (ตอนจบ)ปี 9 | กับดักแมงมุมพิษปี 9 | รหัสลับของดวงดาวและบุหรี่ (ตอนแรก)ปี 9 | รหัสลับของดวงดาวและบุหรี่ (ตอนจบ)ปี 9 | ไทม์ลิมิตคือบ่ายสามโมงปี 9 | ทัวร์ไขปริศนาโมโมทาโร่ (ตอนแรก)ปี 9 | ทัวร์ไขปริศนาโมโมทาโร่ (ตอนจบ)ปี 9 | คดีฟุริโซเดะในบ่อน้ำแร่กลางหิมะ (ตอนแรก)ปี 9 | คดีฟุริโซเดะในบ่อน้ำแร่กลางหิมะ (ตอนจบ)ปี 9 | โชว์สืบสวนของใคร (ตอนแรก)ปี 9 | โชว์สืบสวนของใคร (ตอนจบ)ปี 9 | ปาฏิหาริย์แห่งโคชิเอน ไม่ยอมแพ้ปิศาจที่มองไม่เห็น (ตอนพิเศษ2ชั่วโมง)ปี 9 | ปาฏิหาริย์แห่งโคชิเอน ไม่ยอมแพ้ปิศาจที่มองไม่เห็น (ตอนพิเศษ2ชั่วโมง)ปี 9 | ปาฏิหาริย์แห่งโคชิเอน ไม่ยอมแพ้ปิศาจที่มองไม่เห็น (ตอนพิเศษ2ชั่วโมง)ปี 9 | ปาฏิหาริย์แห่งโคชิเอน ไม่ยอมแพ้ปิศาจที่มองไม่เห็น (ตอนพิเศษ2ชั่วโมง)ปี 9 | เป้าหมาย คือ โมริ โคโกโร่ !ปี 9 | เสียงที่ไม่เข้ากันของสตราดีวาริอุส (เพลงโหมโรง)ปี 9 | เสียงที่ไม่เข้ากันของสตราดีวาริอุส (เพลงท่อนกลาง)ปี 9 | เสียงที่ไม่เข้ากันของสตราดีวาริอุส (เพลงส่งท้าย)ปี 9 | โคโกโร่เมามายที่ซัสสึมะ (ตอนแรก)ปี 9 | โคโกโร่เมามายที่ซัสสึมะ (ตอนจบ)ปี 9 | นิยายรักตำรวจนครบาล ภาค 6 (ตอนแรก)ปี 9 | นิยายรักตำรวจนครบาล ภาค 6 (ตอนจบ)ปี 9 | ปริศนาความสูง 20 เซนติเมตรปี 9 | คดีที่น่าจะใช่การลักพาตัวปี 9 | การผจญภัยในบ้านร้างแสนพิลึก (ภาคผนึก)ปี 9 | การผจญภัยในบ้านร้างแสนพิลึก (ภาคกลไก)ปี 9 | การผจญภัยในบ้านร้างแสนพิลึก (ภาคตัดสินใจ)ปี 9 | น้ำแกงที่ทั้งเผ็ด ขม และหวานปี 9 | การจ้างวานจากครอบครัวพิลึก (ตอนแรก)ปี 9 | การจ้างวานจากครอบครัวพิลึก (ตอนจบ)ปี 9 | สิ่งที่รันคาใจปี 9 | คดีโจรปล้นเพชร (ตอนแรก)ปี 9 | คดีโจรปล้นเพชร (ตอนจบ)ปี 9 | คฤหาสน์นางฟ้าที่น่าพิศวง (ตอนแรก)ปี 9 | คฤหาสน์นางฟ้าที่น่าพิศวง (ตอนจบ)ปี 9 | ชายผู้ไปตามรถพยาบาลปี 9 | ข้อสันนิษฐานมายากลของโคนันและเฮจิ (ภาควางกับดัก)ปี 9 | ข้อสันนิษฐานมายากลของโคนันและเฮจิ (ภาคคฤหาสน์)ปี 9 | ข้อสันนิษฐานมายากลของโคนันและเฮจิ (ภาคไขปริศนา)ปี 9 | การแสดงบนเวทีและการลักพาตัว (ตอนแรก)ปี 9 | การแสดงบนเวทีและการลักพาตัว (ตอนจบ)ปี 9 | รหัสลับของประตูศาลเจ้า (ตอนแรก)ปี 9 | รหัสลับของประตูศาลเจ้า (ตอนจบ)\"ปี 9 | ปริศนาอาชญากรรมครึ่งเดียวปี 9 | ชมรมนักสืบเยาวชนกับนกสีฟ้าปี 9 | วิญญาณร้ายในวันอับโชค (ภาคคดี)ปี 9 | วิญญาณร้ายในวันอับโชค (ภาคสงสัย)ปี 9 | วิญญาณร้ายในวันอับโชค (ภาคไขปริศนา)ปี 9 | บ้านที่มีห้องใต้หลังคาแห่งเมืองเบกะปี 9 | ดาบของยามาตะ โนะ โอโรจิ (ตอนแรก)ปี 9 | ดาบของยามาตะ โนะ โอโรจิ (ตอนจบ) ปี 10 | รักครั้งแรกสีใบแปะก๊วย (ตอนแรก)ปี 10 | รักครั้งแรกสีใบแปะก๊วย (ตอนจบ)ปี 10 | ขบวนการนักสืบเยาวชนกับหนอนแก้วสี่พี่น้องปี 10 | เมลรูปถ่ายจากตัวตลกปี 10 | แบล็คอิมแพ็ค วินาทีที่อยู่ในเงื้อมมือองค์กร (ตอนพิเศษ 1)ปี 10 | แบล็คอิมแพ็ค วินาทีที่อยู่ในเงื้อมมือองค์กร (ตอนพิเศษ 2)ปี 10 | แบล็คอิมแพ็ค วินาทีที่อยู่ในเงื้อมมือองค์กร (ตอนพิเศษ 3)ปี 10 | แบล็คอิมแพ็ค วินาทีที่อยู่ในเงื้อมมือองค์กร (ตอนพิเศษ 4)ปี 10 | แบล็คอิมแพ็ค วินาทีที่อยู่ในเงื้อมมือองค์กร (ตอนพิเศษ 5)ปี 10 | จดหมายรักถึงรันปี 10 | ทางไปโรงเรียนที่เป็นความลับสุดยอด (ตอนแรก)ปี 10 | ทางไปโรงเรียนที่เป็นความลับสุดยอด (ตอนจบ)ปี 10 | สองคนที่ไม่อาจกลับไปเป็นเหมือนเดิม (ตอนแรก)ปี 10 | สองคนที่ไม่อาจกลับไปเป็นเหมือนเดิม (ตอนจบ)ปี 10 | นิยายรักตำรวจนครบาล ภาค 7 (ตอนแรก)ปี 10 | นิยายรักตำรวจนครบาล ภาค 7 (ตอนจบ)ปี 10 | เด็กประหลาดชื่อโคนันปี 10 | ผลงานของยอดสุนัขคูร์ปี 10 | การสัมภาษณ์ขบวนการนักสืบเยาวชน (ตอนแรก)ปี 10 | การสัมภาษณ์ขบวนการนักสืบเยาวชน (ตอนจบ)ปี 10 | สัญญาเมื่อ 4 ปีก่อนของอุเอโตะ อายะ กับ ชินอิจิปี 10 | ตามรอยจากเมลเรื่องปลาปี 10 | และแล้วก็ไม่เหลือใครอีกเลยปี 10 | สุดยอดสตั๊นท์แมนปี 10 | เสียงร้องครั้งสุดท้ายปี 10 | ชายผู้ถูกขวางด้วยโครงเหล็กปี 10 | ถอนหายใจเก็บหอย (ตอนแรก)ปี 10 | ถอนหายใจเก็บหอย (ตอนจบ)ปี 10 | ความลับของรัสเซียน บลูปี 10 | หน้าต่างที่ถูกปิดตาย (ตอนแรก)ปี 10 | หน้าต่างที่ถูกปิดตาย (ตอนจบ)ปี 10 | คดีปลาซัมมะของเมงูโระปี 10 | นิยายรักตำรวจนครบาล ภาคพิธีวิวาห์ปลอม (ตอนแรก)ปี 10 | นิยายรักตำรวจนครบาล ภาคพิธีวิวาห์ปลอม (ตอนจบ)ปี 10 | อุบาย ปะทะ มายากล (ตอนแรก)ปี 10 | อุบาย ปะทะ มายากล (ตอนจบ)ปี 10 | ปีศาจแห่งคอมปิระ (ตอนแรก)ปี 10 | ปีศาจแห่งคอมปิระ (ตอนจบ)ปี 10 | รอบสื่อมวลชนแห่งมิตรภาพและความผูกพันปี 10 | บทสรุปกลับหัว (ตอนแรก)ปี 10 | บทสรุปกลับหัว (ตอนจบ)ปี 10 | นิยายสืบสวนที่ผมรักปี 10 | ผ้าเช็ดหน้าสีแดงของโซโนโกะ (ตอนแรก)ปี 10 | ผ้าเช็ดหน้าสีแดงของโซโนโกะ (ตอนจบ)ปี 10 | ชายเจ้าระเบียบผู้แปลกประหลาดปี 10 | ปฏิบัติการครั้งใหญ่ของ ป.1 ห้อง B!ปี 10 | หนึ่งหน้าที่หายไปปี 10 | เงาขององค์กรชุดดำ (ภาคพยานตัวน้อย)ปี 10 | เงาขององค์กรชุดดำ (ภาคแสงไฟพิศวง)ปี 10 | เงาขององค์กรชุดดำ (ภาคงานพิเศษที่น่าสงสัย)ปี 10 | เงาขององค์กรชุดดำ (ภาคดาวตกไข่มุก)ปี 10 | ตุ๊กตาหิมะที่ไม่แตก (ตอนแรก)ปี 10 | ตุ๊กตาหิมะที่ไม่แตก (ตอนจบ) ปี 11 | คดีประหลาดที่ริมบ่อปี 11 | 4 ภาพเขียนชื่อดังกับจอมโจรคิด (ตอนแรก)ปี 11 | 4 ภาพเขียนชื่อดังกับจอมโจรคิด (ตอนจบ)ปี 11 | รถเช่าที่ควบคุมไม่ได้ปี 11 | การผจญภัยของหนูน้อยชินอิจิ (ตอนแรก)ปี 11 | การผจญภัยของหนูน้อยชินอิจิ (ตอนจบ)ปี 11 | ความรักของทนายคิซากิ เอริปี 11 | กรังด์ปรีซ์ โชคร้ายปี 11 | ท่ายิงประตูไม้ตายของเก็นตะ (ตอนแรก)ปี 11 | ท่ายิงประตูไม้ตายของเก็นตะ (ตอนจบ)ปี 11 | ความจริง 30 นาทีปี 11 | 3 วันกับ ฮัตโตริ เฮย์จิ (ตอนพิเศษ 2 ชั่วโมง)ปี 11 | 3 วันกับ ฮัตโตริ เฮย์จิ (ตอนพิเศษ 2 ชั่วโมง)ปี 11 | 3 วันกับ ฮัตโตริ เฮย์จิ (ตอนพิเศษ 2 ชั่วโมง)ปี 11 | 3 วันกับ ฮัตโตริ เฮย์จิ (ตอนพิเศษ 2 ชั่วโมง)ปี 11 | หลักฐานที่อยู่สีเหลืองปี 11 | มีดของแม่มดภูเขา (ตอนแรก)ปี 11 | มีดของแม่มดภูเขา (ตอนจบ)ปี 11 | ตำรวจที่หายไปปี 11 | ที่อยู่ของรูปถ่ายสีดำ (ตอนแรก)ปี 11 | ที่อยู่ของรูปถ่ายสีดำ (ตอนจบ)ปี 11 | มาเนคิเนโกะ (แมวกวัก) จากขวาไปซ้ายปี 11 | นิยายรักตำรวจนครบาล 8 แหวนของซาโต้ (ตอนแรก)ปี 11 | นิยายรักตำรวจนครบาล ภาค 8 แหวนของซาโต้ (ตอนจบ)ปี 11 | ปีศาจร้ายที่สถานีโทรทัศน์ (ตอนพิเศษ 1 ชั่วโมง)ปี 11 | ปีศาจร้ายที่สถานีโทรทัศน์ (ตอนพิเศษ 1 ชั่วโมง)ปี 11 | ศึกในศาลภาค 3 พยานที่เห็นเหตุการณ์คืออัยการ (ตอนพิเศษ 1 ชั่วโมง)ปี 11 | ศึกในศาลภาค 3 พยานที่เห็นเหตุการณ์คืออัยการ (ตอนพิเศษ 1 ชั่วโมง)ปี 11 | ฮัตโตริ เฮย์จิ ปะทะ คุโด้ ชินอิจิ แข่งคลี่คลายคดีที่ลานสกี (ตอนพิเศษ 1 ชั่วโมง)ปี 11 | ฮัตโตริ เฮย์จิ ปะทะ คุโด้ ชินอิจิ แข่งคลี่คลายคดีที่ลานสกี (ตอนพิเศษ 1 ชั่วโมง)ปี 11 | ดำปะทะแดงเดือด (จุดเริ่มต้น)ปี 11 | ดำปะทะแดงเดือด (สัมพันธ์ทางสายเลือด)ปี 11 | ดำปะทะแดงเดือด (เสียงร้อง)ปี 11 | ดำปะทะแดงเดือด (ยมทูต)ปี 11 | ดำปะทะแดงเดือด (หลับสนิท)ปี 11 | ดำปะทะแดงเดือด (การบุกรุก)ปี 11 | ดำปะทะแดงเดือด (ตื่นจากภวังค์)ปี 11 | ดำปะทะแดงเดือด (ความปั่นป่วน)ปี 11 | ดำปะทะแดงเดือด (พรางตา)ปี 11 | ดำปะทะแดงเดือด (คำสั่งเสีย)ปี 11 | ดำปะทะแดงเดือด (ข้อสงสัย)ปี 11 | ดำปะทะแดงเดือด (ความบริสุทธิ์)ปี 11 | ดำปะทะแดงเดือด (เสี่ยงตาย)ปี 11 | ดำปะทะแดงเดือด (พลีชีพ)ปี 11 | คำให้การของทนาย คิซากิ เอริ (ตอนแรก)ปี 11 | คำให้การของทนาย คิซากิ เอริ (ตอนจบ)ปี 11 | มุมอับในร้านคาราโอเกะ (ตอนแรก)ปี 11 | มุมอับในร้านคาราโอเกะ (ตอนจบ)ปี 11 | สีแดง ขาว เหลืองและขบวนการนักสืบเยาวชนปี 11 | โคนันกับปริศนารหัสซ้อนปี 11 | ประลองการสืบคดี ระหว่างชินอิจิ กับ โอกิยะ สึบารุปี 11 | การทำนายที่แหลกเป็นเสี่ยงๆปี 11 | แรงอาฆาตอยู่ในกลิ่นกาแฟ (ตอนแรก)ปี 11 | แรงอาฆาตอยู่ในกลิ่นกาแฟ (ตอนจบ) ปี 12 | Teleportation Magic ของจอมโจรคิด (ตอนพิเศษ 1 ชั่วโมง)ปี 12 | Teleportation Magic ของจอมโจรคิด (ตอนพิเศษ 1 ชั่วโมง)ปี 12 | ฟุรินคะซัน นักรบชุดเกราะในเขาวงกต (ตอนพิเศษ 1 ชั่วโมง)ปี 12 | ฟุรินคะซัน นักรบชุดเกราะในเขาวงกต (ตอนพิเศษ 1 ชั่วโมง)ปี 12 | ฟุรินคะซัน ศึกตัดสินระหว่างเงาและสายฟ้าปี 12 | ทัวร์ปริศนาปฏิรูปสมัยเมจิ (ภาคสืบสวน)ปี 12 | ทัวร์ปริศนาปฏิรูปสมัยเมจิ (ภาคไขคดี)ปี 12 | การตอบโต้ของไวน์แดงปี 12 | ฆาตกรคือ คุโด้ ชินอิจิ (ตอนพิเศษ 1 ชั่วโมง)ปี 12 | ฆาตกรคือ คุโด้ ชินอิจิ (ตอนพิเศษ 1 ชั่วโมง)ปี 12 | ตัวจริงของชินอิจิ และน้ำตาของรัน (ตอนพิเศษ 1 ชั่วโมง)ปี 12 | ตัวจริงของชินอิจิ และน้ำตาของรัน (ตอนพิเศษ 1 ชั่วโมง)ปี 12 | เรื่องที่อยากถามจริงจริงปี 12 | ดอกไม้ไฟสีฟ้าแห่งความแค้น (ตอนแรก)ปี 12 | ดอกไม้ไฟสีฟ้าแห่งความแค้น (ตอนจบ)ปี 12 | ของฝากจากคนร้ายตัวจริงปี 12 | ความคิดชั่วร้ายที่แฝงอยู่ในละครหน้ากากปี 12 | ปริศนาที่ไม่อ่อนไหว (ตอนแรก)ปี 12 | ปริศนาที่ไม่อ่อนไหว (ตอนจบ)ปี 12 | ตัวจริงของตำนานเมือง (ตอนแรก)ปี 12 | ตัวจริงของตำนานเมือง (ตอนจบ)ปี 12 | แผลเป็นจากรักแรกปี 12 | แผลเป็นที่เรียกหาอดีตปี 12 | แผลใหม่และชายที่ผิวปากปี 12 | แผลเก่าและจิตวิญญาณของตำรวจปี 12 | ความลับของภาพชื่อดังที่หายไปปี 12 | จอมโจรคิดปะทะสุดยอดตู้เซฟ (ตอนแรก)ปี 12 | จอมโจรคิดปะทะสุดยอดตู้เซฟ (ตอนจบ)ปี 12 | มรดกแด่ผู้โง่เขลาปี 12 | วันที่โมริ โคโกโร่เลิกเป็นนักสืบ (ตอนแรก)ปี 12 | วันที่โมริ โคโกโร่เลิกเป็นนักสืบ (ตอนจบ)ปี 12 | โขดหินอิคาคุที่ปลาหายไป (ตอนแรก)ปี 12 | โขดหินอิคาคุที่ปลาหายไป (ตอนจบ)ปี 12 | มือที่เล่นเพลงผิดคีย์ปี 12 | แม่มดในม่านหมอก (ตอนแรก)ปี 12 | แม่มดในม่านหมอก (ตอนจบ)ปี 12 | สองวันกับคนร้าย (วันที่หนึ่ง)ปี 12 | สองวันกับคนร้าย (วันที่สอง)ปี 12 | ปริศนาซูชิจานเวียน (ตอนแรก)ปี 12 | ปริศนาซูชิจานเวียน (ตอนจบ)ปี 12 | คนร้ายคือคุณพ่อของเก็นตะ (ตอนแรก)ปี 12 | คนร้ายคือคุณพ่อของเก็นตะ (ตอนจบ)ปี 12 | ณ ห้องสอบปากคำปี 12 | ทัวร์ปริศนานกกระเรียน (ภาคการสืบสวนของรัน)ปี 12 | ทัวร์ปริศนานกกระเรียน (ภาคตามรอยฮารุนะ)ปี 12 | สี่แยกอันตรายปี 12 | สองคนอันตรายปี 12 | คฤหาสน์แห่งความตายและกำแพงสีแดง (ภาคเยี่ยมเยือนสามครั้ง)ปี 12 | คฤหาสน์แห่งความตายและกำแพงสีแดง (ภาคสิ่งที่อยู่ในกำมือ)ปี 12 | คฤหาสน์แห่งความตายและกำแพงสีแดง (ภาคขงเบ้งคนตาย)ปี 12 | คฤหาสน์แห่งความตายและกำแพงสีแดง (ภาคอุบายเมืองร้าง)ปี 12 | การลักพาตัวสีรุ้ง ปี 13 | ขบวนการนักสืบเยาวชน ปะทะ กลุ่มโจรปล้นธนาคาร (ภาคแตกตื่น)ปี 13 | ขบวนการนักสืบเยาวชน ปะทะ กลุ่มโจรปล้นธนาคาร (ภาคเงียบสงบ)ปี 13 | พยานที่ไม่เห็นเหตุการณ์ปี 13 | คู่หูคือคุณซานต้าปี 13 | คดีฆาตกรรมในบ่อน้ำร้อนกลางแจ้งปี 13 | สารวัตรชิราโทริ ความทรงจำของกลีบดอกซากุระ (ตอนแรก)ปี 13 | สารวัตรชิราโทริ ความทรงจำของกลีบดอกซากุระ (ตอนจบ)ปี 13 | อาชญากรรมที่มีโอกาสศูนย์เปอร์เซ็นที่จะเกิดขึ้นปี 13 | การต่อสู้ชิงขุมทรัพย์ในโกดังปริศนา (ตอนแรก)ปี 13 | การต่อสู้ชิงขุมทรัพย์ในโกดังปริศนา (ตอนจบ)ปี 13 | เครื่องรางแห่งความอายที่หายไป (ตอนแรก)ปี 13 | เครื่องรางแห่งความอายที่หายไป (ตอนจบ)ปี 13 | หลักฐานที่อยู่จากชุดสีดำ (ตอนแรก)ปี 13 | หลักฐานที่อยู่จากชุดสีดำ (ตอนจบ)ปี 13 | ความจริงจากแสงหิ่งห้อยปี 13 | วิกฤติเรียกหาโดยลางสังหรณ์สีแดงปี 13 | ข้อเสนอสีดำทั้งสิบสามปี 13 | ไทม์ลิมิตสีดำที่เข้ามาใกล้ปี 13 | เป้าหมายสีแดงที่สั่นเครือปี 13 | ค่ำคืนที่ซอมบี้ตายปี 13 | ความรักของคุณครูโคบายาชิปี 13 | สารวัตร ชิราโทริอกหักปี 13 | ซากุระแห่งรักข้ามกาลเวลาปี 13 | เขากิเลนที่หายไปในความมืดปี 13 | จอมโจรคิด ปะทะ ชมรมนักสืบเยาวชนปี 13 | กับดักบนสวนผักชั้นดาดฟ้าปี 13 | วันเกิดที่เลวร้ายที่สุด (ตอนแรก)ปี 13 | วันเกิดที่เลวร้ายที่สุด (ตอนจบ)ปี 13 | บ้านที่มีพิพิธภัณฑ์สัตว์น้ำปี 13 | ลิงคุมาเดะและพวกวิ่งราว (ตอนแรก)ปี 13 | ลิงคุมาเดะและพวกวิ่งราว (ตอนจบ)ปี 13 | ทัวร์เจ็ดสิ่งมหัศจรรย์ ใน ฮิโรชิม่า และ มิยาจิม่า (ภาคมิยาจิม่า)ปี 13 | ทัวร์เจ็ดสิ่งมหัศจรรย์ ใน ฮิโรชิม่า และ มิยาจิม่า (ภาคฮิโรชิม่า)ปี 13 | หลักฐานที่อยู่ที่ร่วงลงมาปี 13 | ฉากห้องปิดตายไอน้ำ (ตอนแรก)ปี 13 | ฉากห้องปิดตายไอน้ำ (ตอนจบ)ปี 13 | ผู้รักษาความยุติธรรมปี 13 | ความฝันของคับปะ (ตอนแรก)ปี 13 | ความฝันของคับปะ (ตอนจบ)ปี 13 | ปีศาจที่ซ่อนอยู่ในคอร์ตเทนนิสปี 13 | คดีสองห้องปิดตายคนทรงเจ้า (ห้องปิดตายแรก)ปี 13 | คดีสองห้องปิดตายคนทรงเจ้า (ห้องปิดตายที่สอง)ปี 13 | คดีสองห้องปิดตายคนทรงเจ้า (เปิดห้องปิดตาย)ปี 13 | ศึกในศาลภาค4 ลูกขุนผู้ชี้ขาดคือโคบายาชิ สึมิโกะ (ตอนแรก)ปี 13 | ศึกในศาลภาค4 ลูกขุนผู้ชี้ขาดคือโคบายาชิ สึมิโกะ (ตอนจบ)ปี 13 | วันไวท์เดย์แห่งการทรยศ (ตอนแรก)ปี 13 | วันไวท์เดย์แห่งการทรยศ (ตอนจบ)ปี 13 | เหยื่อคือคุโด้ ชินอิจิปี 13 | ปราสาทอินุบุชิ กับสุนัขเพลิงปิศาจ (บทเปลวไฟปีศาจ)ปี 13 | ปราสาทอินุบุชิ กับสุนัขเพลิงปิศาจ (บทรอยเท้า)ปี 13 | ปราสาทอินุบุชิ กับสุนัขเพลิงปิศาจ (บทเจ้าหญิง)ปี 13 | ความลับที่บันทึกบรรเลง (ตอนแรก)ปี 13 | ความลับที่บันทึกบรรเลง (ตอนจบ) ปี 14 | คัมภีร์ของโฮล์ม (ลูกศิษย์ของโฮล์ม)ปี 14 | คัมภีร์ของโฮล์ม (รักเป็น 0)ปี 14 | คัมภีร์ของโฮล์ม (ซาตาน)ปี 14 | คัมภีร์ของโฮล์ม (ไขรหัส)ปี 14 | คัมภีร์ของโฮล์ม (ราชินีแห่งคอร์ดหญ้า) ปี 14 | คัมภีร์ของโฮล์ม (0 คือการเริ่มต้น)ปี 14 | สถานการณ์ฉุกเฉิน 252 (ตอนแรก)ปี 14 | สถานการณ์ฉุกเฉิน 252 (ตอนจบ)ปี 14 | จดหมายวิดีโอแห่งรักแรกปี 14 | ห้องผ่าตัดแห่งเสียงกรีดร้อง (ตอนแรก)ปี 14 | ห้องผ่าตัดแห่งเสียงกรีดร้อง (ตอนจบ)ปี 14 | ศึกชิงสมบัติซากาโมโตะ เรียวมะ ระหว่างโคนันกับคิด (ตอนแรก)ปี 14 | ศึกชิงสมบัติซากาโมโตะ เรียวมะ ระหว่างโคนันกับคิด (ตอนจบ)ปี 14 | คดีการถ่ายทำโฆษณาภาพยนตร์ (ตอนแรก)ปี 14 | คดีการถ่ายทำโฆษณาภาพยนตร์ (ตอนจบ)ปี 14 | นาฬิกาดอกไม้ผู้รู้เห็นเหตุการณ์ปี 14 | ใบมีดแห่งผู้คุมกาลเวลา (ตอนแรก)ปี 14 | ใบมีดแห่งผู้คุมกาลเวลา (ตอนจบ)ปี 14 | จุดเกิดเหตุคือร้านรูหนูปี 14 | โปรดระวังในการไดเอ็ต ปี 14 | คดีรายการชั้นเรียนที่อยากเข้าเรียนที่สุดในโลก (ตอนแรก)ปี 14 | คดีรายการชั้นเรียนที่อยากเข้าเรียนที่สุดในโลก (ตอนจบ)ปี 14 | ไขปริศนา ณ วังใบไม้แดง (ตอนแรก) ปี 14 | ไขปริศนา ณ วังใบไม้แดง (ตอนจบ) ปี 14 | ทัวร์ 8 ภาพสเก็ตช์ในความทรงจำ (ภาคโอกายามะ)ปี 14 | ทัวร์ 8 ภาพสเก็ตช์ในความทรงจำ (ภาคคุราชิกิ)ปี 14 | เล่นไพ่คารุตะในสถานการณ์อันตราย (ตอนแรก)ปี 14 | เล่นไพ่คารุตะในสถานการณ์อันตราย (ตอนจบ)ปี 14 | ราเม็งที่อร่อยจนถึงตาย (ตอนแรก)ปี 14 | ราเม็งที่อร่อยจนถึงตาย (ตอนจบ)ปี 14 | การแข่งไขคดีที่โรงแรมผีสิง (ตอนแรก)ปี 14 | การแข่งไขคดีที่โรงแรมผีสิง (ตอนจบ)ปี 14 | คดีบุกยึดสำนักงานนักสืบ (จลาจล)ปี 14 | คดีบุกยึดสำนักงานนักสืบ (ซุ่มยิง)ปี 14 | คดีบุกยึดสำนักงานนักสืบ (ปล่อยตัว)ปี 14 | โคนัน ปะทะ เฮย์จิ ศึกดวลสองนักสืบตะวันออกตะวันตก (ตอนพิเศษ1 ชั่วโมง)ปี 14 | โคนัน ปะทะ เฮย์จิ ศึกดวลสองนักสืบตะวันออกตะวันตก (ตอนพิเศษ1 ชั่วโมง)ปี 14 | ยาพิษและดีไซน์ลวงตา (EYE)ปี 14 | ยาพิษและดีไซน์ลวงตา (S)ปี 14 | ยาพิษและดีไซน์ลวงตา (ยาพิษ)ปี 14 | ยาพิษและดีไซน์ลวงตา (ภาพลวงตา)ปี 14 | เว็บไซต์วิดีโอของด็อกเตอร์ (ตอนแรก)ปี 14 | เว็บไซต์วิดีโอของด็อกเตอร์ (ตอนจบ)ปี 14 | กับดักอันร้อนแรงของช็อกโกล่าปี 14 | การสืบสวนร่วมกันของรักครั้งแรก (ตอนแรก)ปี 14 | การสืบสวนร่วมกันของรักครั้งแรก (ตอนจบ)ปี 14 | คุณโคโกโร่เป็นคนดี (ตอนแรก)ปี 14 | คุณโคโกโร่เป็นคนดี (ตอนจบ)ปี 14 | ตามล่าด้วงกว่างมิยามะปี 14 | ผลงานของยอดสุนัขคูร์ 2ปี 14 | ชื่อย่อ K ที่น่าสงสัยปี 14 | มือข่มขู่ในคืนฝนตก ปี 15 | คืนก่อนแต่งงาน (ตอนแรก)ปี 15 | คืนก่อนแต่งงาน (ตอนจบ)ปี 15 | สมบัติลับในหอคอยแห่งความมืด (ตอนแรก)ปี 15 | สมบัติลับในหอคอยแห่งความมืด (ตอนจบ)ปี 15 | ดนตรีรัตติกาลของเหล่านักสืบ (คดี)ปี 15 | ดนตรีรัตติกาลของเหล่านักสืบ (ลักพาตัว)ปี 15 | ดนตรีรัตติกาลของเหล่านักสืบ (สันนิษฐาน)ปี 15 | ดนตรีรัตติกาลของเหล่านักสืบ (บาร์เบิร์น)ปี 15 | แค่มิลเดียวก็ยอมไม่ได้ (ตอนแรก)ปี 15 | แค่มิลเดียวก็ยอมไม่ได้ (ตอนจบ)ปี 15 | หาดทรายที่ไร้รอยเท้าปี 15 | กองถ่ายปริศนาแห่งนางาซากิ (ภาคยุคบาคุมัตสึ)ปี 15 | กองถ่ายปริศนาแห่งนางาซากิ (ภาคยุคปัจจุบัน)ปี 15 | บทเพลงแรปโซดีต้นกระบองเพชรปี 15 | การออกอากาศความรักที่เดิมพันด้วยชีวิต (เริ่มต้นออกอากาศ)ปี 15 | การออกอากาศความรักที่เดิมพันด้วยชีวิต (สถานการณ์วิกฤติ)ปี 15 | การออกอากาศความรักที่เดิมพันด้วยชีวิต (บุกที่เกิดเหตุ)ปี 15 | ฟอง ไอน้ำ และ ควัน (ตอนแรก)ปี 15 | ฟอง ไอน้ำ และ ควัน (ตอนจบ)ปี 15 | รถที่บรรทุกระเบิดเวลาปี 15 | กับดักน้ำแข็งที่ไม่มีใครไข(ละลาย)ได้ปี 15 | ผู้หมวดทาคางิเก็บเงินได้สามสิบล้านเยนปี 15 | ข้อความจากผู้ว่าจ้างปี 15 | โคลด์เคสของคุโด้ ยูซากุ (ตอนแรก)ปี 15 | โคลด์เคสของคุโด้ ยูซากุ (ตอนจบ)ปี 15 | เส้นทางชมซากุระกลางคืนริมแม่น้ำสึมิดะ (ตอนแรก)ปี 15 | เส้นทางชมซากุระกลางคืนริมแม่น้ำสึมิดะ (ตอนจบ)ปี 15 | ขนมญี่ปุ่นของร้านเก่าแก่ที่หายไปปี 15 | กุหลาบในไร่องุ่นปี 15 | แผนการทำลายแปลงดอกไม้ปี 15 | หน้าต่างโรงเรียนสตรีปี 15 | ไม่น่าเชื่อ! คดี UFO ตกปี 15 | เงาที่เข้าใกล้ความลับของไฮบาระ (ตอนแรก)ปี 15 | เงาที่เข้าใกล้ความลับของไฮบาระ (ตอนจบ)ปี 15 | มิสเทรี่เทรนสีดำทมิฬ (รถไฟออก)ปี 15 | มิสเทรี่เทรนสีดำทมิฬ (อุโมงค์)ปี 15 | มิสเทรี่เทรนสีดำทมิฬ (ทางแยก)ปี 15 | มิสเทรี่เทรนสีดำทมิฬ (ปลายทาง)ปี 15 | โคนันในห้องปิดตายปี 15 | บาร์เบิร์นไขปริศนาปี 15 | ยอดนักสืบติดกับปี 15 | ผู้ชายที่ตกช้าปี 15 | คดีกระทบที่ยังไม่ได้ยืนยันปี 15 | ทุกคนเห็น (ตอนแรก)ปี 15 | ทุกคนเห็น (ตอนจบ)ปี 15 | ฮัตโตริ เฮย์จิ กับคฤหาสน์ผีดูดเลือด (หนึ่ง)ปี 15 | ฮัตโตริ เฮย์จิ กับคฤหาสน์ผีดูดเลือด (สอง)ปี 15 | ฮัตโตริ เฮย์จิ กับคฤหาสน์ผีดูดเลือด (สาม)ปี 15 | ฮัตโตริ เฮย์จิ กับคฤหาสน์ผีดูดเลือด (สี่)ปี 15 | ปีศาจที่เต้นรำในคฤหาสน์หน้ากากโนห์ (ตอนแรก)ปี 15 | ปีศาจที่เต้นรำในคฤหาสน์หน้ากากโนห์ (ตอนจบ)ปี 15 | วงจรของปีศาจปี 15 | ความปั่นป่วนของตั๋วพรีเมียม ปี 16 | ทัวร์ปริศนาแห่งไฟและน้ำ (ภาคอะโซะ)ปี 16 | ทัวร์ปริศนาแห่งไฟและน้ำ (ภาคคุมาโมโตะ)ปี 16 | บริการส่งของที่หวานและเย็น (ตอนแรก)ปี 16 | บริการส่งของที่หวานและเย็น (ตอนจบ)ปี 16 | จอมโจรคิดกับบลัชเมอร์เมด (ตอนแรก)ปี 16 | จอมโจรคิดกับบลัชเมอร์เมด (ตอนจบ)ปี 16 | เมล์โชคดีที่เรียกหาโชคร้ายปี 16 | กล่องสมบัติที่อัดแน่นไปด้วยผลไม้ (ตอนแรก)ปี 16 | กล่องสมบัติที่อัดแน่นไปด้วยผลไม้ (ตอนจบ)ปี 16 | เพชร และ ภาพวาด และ ยอดนักแสดงหญิงปี 16 | ฟิกเกอร์ที่สมบูรณ์แบบเกินไปปี 16 | เพื่อนบ้านข้างที่เกิดเหตุคือแฟนเก่า (ตอนแรก)ปี 16 | เพื่อนบ้านข้างที่เกิดเหตุคือแฟนเก่า (ตอนจบ)ปี 16 | งานเลี้ยงแต่งงานกับเสียงปืนสองนัดปี 16 | \"ความทรงจำของโจดี้และกับดักในงานชมดอกซากุระ (ตอนพิเศษ 1 ชั่วโมง)ปี 16 | \"ความทรงจำของโจดี้และกับดักในงานชมดอกซากุระ (ตอนพิเศษ 1 ชั่วโมง)ปี 16 | บัตรเชิญแนบรหัสลับปี 16 | ความลับของรูปปั้นโมริ โคโกโร่ปี 16 | ทางเดินเล่นที่น่าสงสัยปี 16 | โคโกโร่ในบาร์ (ตอนแรก)ปี 16 | โคโกโร่ในบาร์ (ตอนจบ)ปี 16 | ห้องน้ำที่รันหมดสติด้วยเหมือนกัน (ตอนแรก)ปี 16 | ห้องน้ำที่รันหมดสติด้วยเหมือนกัน (ตอนจบ)ปี 16 | คำสัญญากับนักเตะเจลีคปี 16 | ความสำเร็จ 2 ครั้งที่เกิดขึ้นโดยบังเอิญปี 16 | ผู้ต้องสงสัยคือเคียวโงคุ มาโคโตะ (ตอนแรก)ปี 16 | ผู้ต้องสงสัยคือเคียวโงคุ มาโคโตะ (ตอนจบ)ปี 16 | จอมโจรคิดปะทะเคียวโงคุ มาโคโตะ (ตอนแรก)ปี 16 | จอมโจรคิดปะทะเคียวโงคุ มาโคโตะ (ตอนจบ)ปี 16 | นิยายรักตำรวจนครบาล (สารภาพ)ปี 16 | นิยายรักตำรวจนครบาล (ความจริง)ปี 16 | ผู้ชายที่ถูกทะเลทรยศปี 16 | คดีแมวกวักสามสี (ตอนแรก)ปี 16 | คดีแมวกวักสามสี (ตอนจบ)ปี 16 | มุมอับในแชร์เฮ้าส์ปี 16 | โศกนาฏกรรมของสาวชุดแดง (ไอน้ำ)ปี 16 | โศกนาฏกรรมของสาวชุดแดง (วิญญาณอาฆาต)ปี 16 | โศกนาฏกรรมของสาวชุดแดง (แก้แค้น)ปี 16 | ดาราตลกที่มอบตัว (ตอนแรก)ปี 16 | ดาราตลกที่มอบตัว (ตอนจบ)ปี 16 | ตอนจบนิยายรักที่ไม่คาดคิด (ตอนแรก)ปี 16 | ตอนจบนิยายรักที่ไม่คาดคิด (ตอนจบ)ปี 16 | ทัวร์ปริศนาคากะเฮียะคุมังโงคุ (ภาคคานะซาวะ)ปี 16 | ทัวร์ปริศนาคากะเฮียะคุมังโงคุ (ภาคคากะออนเซ็น)ปี 16 | โคนันกับเฮย์จิ รหัสแห่งรัก (ตอนแรก)ปี 16 | โคนันกับเฮย์จิ รหัสแห่งรัก (ตอนจบ)ปี 16 | คดีเล่นว่าวที่แม่น้ำเทมุซึ (ตอนแรก)ปี 16 | คดีเล่นว่าวที่แม่น้ำเทมุซึ (ตอนจบ)ปี 16 | คนรักที่หายไปในพายุหิมะปี 16 | คดีการกักขังไฮบาระ ไอปี 16 | ผู้ป่วยฉุกเฉินที่ยุ่งยากปี 16 | งานน้ำชาสุดเครียด (ตอนแรก)ปี 16 | งานน้ำชาสุดเครียด (ตอนจบ) ปี 17 | คดีพิพิธภัณฑ์สัตว์น้ำของคุโด้ ชินอิจิ (ตอนแรก)ปี 17 | คดีพิพิธภัณฑ์สัตว์น้ำของคุโด้ ชินอิจิ (ตอนจบ)ปี 17 | เดอะสครีมของมุงค์ที่หายไปปี 17 | ยอดนักสืบโดนชักใย (ตอนแรก)ปี 17 | ยอดนักสืบโดนชักใย (ตอนจบ)ปี 17 | ขบวนการนักสืบเยาวชนปะทะขบวนการนักสืบผู้สูงอายุปี 17 | ภาพลวงตานางฟ้าที่หายไปปี 17 | บทนำสีแดงปี 17 | การรุกคืบสีแดงปี 17 | ทางแยกสีแดงปี 17 | การกลับมาสีแดงปี 17 | ความจริงสีแดงปี 17 | ยินดีต้อนรับสู่ชมรมสาวทอผ้าปี 17 | การแข่งขันแห่งรักของไทโคเมจิน (ตอนแรก)ปี 17 | การแข่งขันแห่งรักของไทโคเมจิน (ตอนจบ)ปี 17 | ปริศนาที่จมอยู่ในสระว่ายน้ำกลางหน้าร้อน(ตอนแรก)ปี 17 | ปริศนาที่จมอยู่ในสระว่ายน้ำกลางหน้าร้อน(ตอนจบ)ปี 17 | การพยากรณ์อากาศของราชินีปี 17 | เบกะปอง เซอร์วิสเจ็บตัวปี 17 | หมวดทาคางิหนีไปกับกุญแจมือปี 17 | ผู้พบ 3 คนแรก (ตอนแรก)ปี 17 | ผู้พบ 3 คนแรก (ตอนจบ)ปี 17 | บอดี้การ์ดโมริ โคโกโร่ปี 17 | ความลับของคุณผู้หญิงที่หายไป\n","ค้นหาข้อมูล เดอะมูฟวี่\n","เลือกเลขตอน (โคนัน เดอะมูฟวี่) โคนัน เดอะมูฟวี่ 1โคนัน เดอะมูฟวี่ 2โคนัน เดอะมูฟวี่ 3โคนัน เดอะมูฟวี่ 4โคนัน เดอะมูฟวี่ 5โคนัน เดอะมูฟวี่ 6โคนัน เดอะมูฟวี่ 7โคนัน เดอะมูฟวี่ 8โคนัน เดอะมูฟวี่ 9โคนัน เดอะมูฟวี่ 10โคนัน เดอะมูฟวี่ 11โคนัน เดอะมูฟวี่ 12โคนัน เดอะมูฟวี่ 13โคนัน เดอะมูฟวี่ 14โคนัน เดอะมูฟวี่ 15โคนัน เดอะมูฟวี่ 16โคนัน เดอะมูฟวี่ 17โคนัน เดอะมูฟวี่ 18โคนัน เดอะมูฟวี่ 19โคนัน เดอะมูฟวี่ 20โคนัน เดอะมูฟวี่ 21โคนัน เดอะมูฟวี่ 22โคนัน เดอะมูฟวี่ 23โคนัน เดอะมูฟวี่ 24โคนัน เดอะมูฟวี่ 25\n","ค้นหาข้อมูล มังงะ\n","เลือกเล่ม (มังงะ) มังงะ เล่ม 1มังงะ เล่ม 2มังงะ เล่ม 3มังงะ เล่ม 4มังงะ เล่ม 5มังงะ เล่ม 6มังงะ เล่ม 7มังงะ เล่ม 8มังงะ เล่ม 9มังงะ เล่ม 10มังงะ เล่ม 11มังงะ เล่ม 12มังงะ เล่ม 13มังงะ เล่ม 14มังงะ เล่ม 15มังงะ เล่ม 16มังงะ เล่ม 17มังงะ เล่ม 18มังงะ เล่ม 19มังงะ เล่ม 20มังงะ เล่ม 21มังงะ เล่ม 22มังงะ เล่ม 23มังงะ เล่ม 24มังงะ เล่ม 25มังงะ เล่ม 26มังงะ เล่ม 27มังงะ เล่ม 28มังงะ เล่ม 29มังงะ เล่ม 30มังงะ เล่ม 31มังงะ เล่ม 32มังงะ เล่ม 33มังงะ เล่ม 34มังงะ เล่ม 35มังงะ เล่ม 36มังงะ เล่ม 37มังงะ เล่ม 38มังงะ เล่ม 39มังงะ เล่ม 40มังงะ เล่ม 41มังงะ เล่ม 42มังงะ เล่ม 43มังงะ เล่ม 44มังงะ เล่ม 45มังงะ เล่ม 46มังงะ เล่ม 47มังงะ เล่ม 48มังงะ เล่ม 49มังงะ เล่ม 50มังงะ เล่ม 51มังงะ เล่ม 52มังงะ เล่ม 53มังงะ เล่ม 54มังงะ เล่ม 55มังงะ เล่ม 56มังงะ เล่ม 57มังงะ เล่ม 58มังงะ เล่ม 59มังงะ เล่ม 60มังงะ เล่ม 61มังงะ เล่ม 62มังงะ เล่ม 63มังงะ เล่ม 64มังงะ เล่ม 65มังงะ เล่ม 66มังงะ เล่ม 67มังงะ เล่ม 68มังงะ เล่ม 69มังงะ เล่ม 70มังงะ เล่ม 71มังงะ เล่ม 72มังงะ เล่ม 73มังงะ เล่ม 74มังงะ เล่ม 75มังงะ เล่ม 76มังงะ เล่ม 77มังงะ เล่ม 78มังงะ เล่ม 79มังงะ เล่ม 80มังงะ เล่ม 81มังงะ เล่ม 82มังงะ เล่ม 83มังงะ เล่ม 84มังงะ เล่ม 85มังงะ เล่ม 86มังงะ เล่ม 87มังงะ เล่ม 88มังงะ เล่ม 89มังงะ เล่ม 90มังงะ เล่ม 91มังงะ เล่ม 92มังงะ เล่ม 93มังงะ เล่ม 94มังงะ เล่ม 95มังงะ เล่ม 96มังงะ เล่ม 97มังงะ เล่ม 98มังงะ เล่ม 99มังงะ เล่ม 100มังงะ เล่ม 101มังงะ เล่ม 102มังงะ เล่ม 103มังงะ เล่ม 104มังงะ เล่ม 105มังงะ เล่ม 106มังงะ เล่ม 107มังงะ เล่ม 108มังงะ เล่ม 109มังงะ เล่ม 110มังงะ เล่ม 111มังงะ เล่ม 112มังงะ เล่ม 113มังงะ เล่ม 114มังงะ เล่ม 115มังงะ เล่ม 116มังงะ เล่ม 117มังงะ เล่ม 118มังงะ เล่ม 119มังงะ เล่ม 120มังงะ เล่ม 121มังงะ เล่ม 122มังงะ เล่ม 123มังงะ เล่ม 124มังงะ เล่ม 125มังงะ เล่ม 126มังงะ เล่ม 127มังงะ เล่ม 128มังงะ เล่ม 129มังงะ เล่ม 130มังงะ เล่ม 131มังงะ เล่ม 132มังงะ เล่ม 133มังงะ เล่ม 134มังงะ เล่ม 135มังงะ เล่ม 136มังงะ เล่ม 137มังงะ เล่ม 138มังงะ เล่ม 139มังงะ เล่ม 140มังงะ เล่ม 141มังงะ เล่ม 142มังงะ เล่ม 143มังงะ เล่ม 144มังงะ เล่ม 145มังงะ เล่ม 146มังงะ เล่ม 147มังงะ เล่ม 148มังงะ เล่ม 149มังงะ เล่ม 150\n","เลือกไฟล์ (มังงะ) เล่ม 1 | เชอร์ล็อก โฮมส์-ยุคเฮเซย์เล่ม 1 | นักสืบที่ตัวเล็กลงเล่ม 1 | นักสืบหลงพวกเล่ม 1 | ปล่องไฟปล่องที่ 6เล่ม 1 | คนร้ายอีกคนหนึ่งเล่ม 1 | นักสืบลับกลายนักสืบดังเล่ม 1 | นักร้องที่โชกไปด้วยเลือดเล่ม 1 | คนที่เหมือนกับคุณเล่ม 1 | ความเข้าใจผิด เล่ม 2 | สะกดรอยตามเล่ม 2 | อำพรางคดีเล่ม 2 | รูปภาพพูดได้เล่ม 2 | ชายผู้หายไปเล่ม 2 | สาวน้อยผู้น่าสงสารเล่ม 2 | ไล่ตามผู้ชายคนนั้นไป!เล่ม 2 | ผู้หญิงที่เหมือนปีศาจเล่ม 2 | บ้านผีสิงเล่ม 2 | เด็กๆที่หายไปเล่ม 2 | ฝันร้ายในห้องใต้ดิน เล่ม 3 | ตระกูลฮาตะโมโตะเล่ม 3 | ความลับในห้องลับเล่ม 3 | มรดกอยู่ที่ไหนเล่ม 3 | ล้างตระกูลเล่ม 3 | นักประดิษฐ์ในความมืดเล่ม 3 | ความฝันที่ไม่มีวันเป็นจริงเล่ม 3 | ของขวัญประหลาดเล่ม 3 | คนเดียวกันเล่ม 3 | ปริศนาวันที่ 3 สิงหาคมเล่ม 3 | เส้นยาแดงผ่าแปด เล่ม 4 | อัศวินเสื้อเกราะเล่ม 4 | ข้อความที่ทิ้งไว้ก่อนตายเล่ม 4 | ปากกาที่เขียนไม่ออกเล่ม 4 | เผชิญหน้าเล่ม 4 | ผู้ต้องสงสัย 4 คนในกรีนคาร์เล่ม 4 | 10 วินาทีสุดท้ายแห่งความสยองเล่ม 4 | รหัสลับ!!เล่ม 4 | ถอดรหัส ABCเล่ม 4 | คำตอบกับคำตอบอีกอย่างหนึ่งเล่ม 4 | ตัวจริงของปลาส่องแสง เล่ม 5 | บุรุษผู้มีผ้าพันแผลคลุมหน้าลึกลับเล่ม 5 | ผู้ตายรายแรกเล่ม 5 | เกือบตายเล่ม 5 | การลอบสังหารในความมืดเล่ม 5 | ตัวจริงของฆาตกรเล่ม 5 | คดีฆาตกรรมคาราโอเกะเล่ม 5 | ถูกฆ่าหรือฆ่าตัวตาย?เล่ม 5 | ความลับที่อยู่ในเพลงเล่ม 5 | ความไม่เข้าใจเล่ม 5 | ผู้มาเยือนลึกลับเล่ม 5 | หลบหนีและติดตาม เล่ม 6 | ความจริงใต้หน้ากากเล่ม 6 | แขกทั้งสามคน?เล่ม 6 | ข้ออ้างของ 3 คนเล่ม 6 | ปริศนาของเครื่องรับโทรศัพท์ตอบรับเล่ม 6 | คำให้การของตู้ลิ้นชักเล่ม 6 | ขบวนการนักสืบรุ่นเยาว์!เล่ม 6 | พี่น้องลึกลับเล่ม 6 | ไขปริศนาที่หายไปเล่ม 6 | ในคืนวันเทศกาลเล่ม 6 | การวางแผนที่แนบเนียน!? เล่ม 7 | หลักฐานคือรูปถ่ายเล่ม 7 | บัตรเชิญสู่เกาะซึกิคาเงะ ชิม่าเล่ม 7 | เปียโนอาถรรพ์เล่ม 7 | โน้ตเพลงที่เหลืออยู่เล่ม 7 | เบื้องหลังเปลวเพลิงเล่ม 7 | ปุ่มเลือดเล่ม 7 | ความลับของชื่อเล่ม 7 | คนรักของชินอิจิเล่ม 7 | ยอดนักสืบ รัน!!เล่ม 7 | ความเป็นความตาย เล่ม 8 | เจอจนได้เล่ม 8 | ไนท์บารอนเล่ม 8 | ไวรัสมหันตภัยเล่ม 8 | ใต้หน้ากากเล่ม 8 | น้ำตาของรันเล่ม 8 | แรงลมเล่ม 8 | ความลับของจุดที่ตกเล่ม 8 | โศกนาฏกรรมของเจ้าสาวเล่ม 8 | เลมอนทีมรณะ !?เล่ม 8 | เหตุผลต้องฆ่า เล่ม 9 | ซ่อนหาอันตรายเล่ม 9 | ตามเสียงไป!!เล่ม 9 | หา! จริงเหรอ!?เล่ม 9 | งานรวมรุ่นของโคโกโร่เล่ม 9 | สัญญาณอันตรายเล่ม 9 | ยืนตายแบบเบ็งเคเล่ม 9 | รจนาเลือกคู่เล่ม 9 | เงาทมิฬเล่ม 9 | อีกศพเล่ม 9 | ฆาตกรโรคจิต!? เล่ม 10 | อุบายเรื่องเวลาของน้ำเล่ม 10 | ยอดนักสืบแห่งตะวันตกเล่ม 10 | นักสืบ 2 คนเล่ม 10 | ยอดนักสืบแห่งตะวันออกเล่ม 10 | ยอดนักสืบแห่งตะวันออกปรากฏตัวเล่ม 10 | ร่างกายที่ร้อนเล่ม 10 | ฆาตกรใจโหดเล่ม 10 | ผู้โดยสารอีกคนเล่ม 10 | โศกนาฏกรรมพายุหิมะเล่ม 10 | คำพูดสุดท้าย เล่ม 11 | ผ้าปูโต๊ะบอกได้เล่ม 11 | การตายขณะถ่ายทอดสดเล่ม 11 | ทางลวงเล่ม 11 | โชว์สดเล่ม 11 | คนสำคัญเล่ม 11 | รอยบนอาวุธเล่ม 11 | ปริศนา 2 อย่างเล่ม 11 | หอสำนึกตนเล่ม 11 | ซากุระบนผนังเล่ม 11 | พลังลอยฟ้า เล่ม 12 | หีบสมบัติของดอกเตอร์เล่ม 12 | อาทิตย์สีดำเล่ม 12 | กรุสมบัติเล่ม 12 | เผชิญหน้าโดยบังเอิญเล่ม 12 | เป้าหมายของระเบิดเล่ม 12 | โคนันคำนวณพลาดเล่ม 12 | การรวมตัวที่มายครอฟท์เล่ม 12 | ผู้หญิงที่รู้มากเล่ม 12 | ระเบิดปริศนาเล่ม 12 | ความแตก เล่ม 13 | ตัวจริงเล่ม 13 | ผู้เห็นเหตุการณ์เล่ม 13 | ผู้ต้องสงสัยแฝด 3เล่ม 13 | สายสัมพันธ์อันแสนเศร้าเล่ม 13 | ศพที่ตกลงมาเล่ม 13 | การฆ่าตัวตายที่มีเงื่อนงำเล่ม 13 | ดอกไม้กับผีเสื้อเล่ม 13 | ฮีโร่เล่ม 13 | โศกนาฏกรรมโกเมล่าเล่ม 13 | ความทรงจำบนแผ่นฟิล์ม เล่ม 14 | รูปมันฟ้องเล่ม 14 | ตัวเลขบนโทรศัพท์เล่ม 14 | คดีเริ่มที่นี่เล่ม 14 | เค้นความจริงเล่ม 14 | ในอ้อมอกแม่เล่ม 14 | รอยยิ้มของโคนันเล่ม 14 | รอยยิ้มของยูกิโกะเล่ม 14 | อีกคนหนึ่งเล่ม 14 | การรวมตัวที่ประหลาดเล่ม 14 | แขกคนสุดท้าย เล่ม 15 | ไม่มี!?เล่ม 15 | อาวุธที่หายไปเล่ม 15 | ความจริงที่บอกเล่าด้วยน้ำตาเล่ม 15 | เสียงเหมือนกัน!?เล่ม 15 | เป้าหมายคือเล่ม 15 | ดูเอ็ทเล่ม 15 | เลียนิ้วเล่ม 15 | ดั่งเวทมนตร์เล่ม 15 | เสียงร้องของปีศาจเล่ม 15 | ผ้าพันแผลโชคเลือด เล่ม 16 | ฆาตกรผ้าขาวเล่ม 16 | ความจริงในโทรศัพท์เล่ม 16 | เปลวไฟสัมพันธ์เล่ม 16 | เรื่องประหลาดในโรงเรียนเล่ม 16 | มีคนอยู่เล่ม 16 | คู่ปรับเล่ม 16 | หายตัวเล่ม 16 | สัญชาตญาณเล่ม 16 | บทสุดท้ายเล่ม 16 | งานศิลป์ เล่ม 19 | ทำไมเล่ม 19 | นักเขียนชื่อดังหายสาบสูญเล่ม 19 | สุดยอด 1/2เล่ม 19 | อยู่ที่ฝรั่งเศสเล่ม 19 | เมืองแห่งของอร่อยเล่ม 19 | กระเป๋าของคนที่ 4เล่ม 19 | ความลับของใบขับขี่เล่ม 19 | บอลที่ถูกเล็งเล่ม 19 | ตัวประกัน 56,000 คน เล่ม 34 | เวลาแห่งการล่าแอปเปิ้ลเล่ม 34 | หนทางแห่งการตอบโต้เล่ม 34 | ราชาเสียงโห่ เล่ม 78 | Mystery Train (รถไฟออก)เล่ม 78 | Mystery Train (อุโมงค์)เล่ม 78 | Mystery Train (ชั้นหนึ่ง)เล่ม 78 | Mystery Train (ทางแยก)เล่ม 78 | Mystery Train (ทางกั้น)เล่ม 78 | Mystery Train (ปล่อยควัน)เล่ม 78 | Mystery Train (ปลายทาง)เล่ม 78 | โค้ชพิเศษเล่ม 78 | กุญแจห้องปิดตายที่หายไปเล่ม 78 | กุญแจไขปริศนาเล่ม 78 | ฟองฟู่ เล่ม 79 | กลมกลืนเล่ม 79 | ลอกคราบเล่ม 79 | ห้องปิดตายโดยสภาพเล่ม 79 | สองคนรวมเป็นหนึ่งเต็มตัวเล่ม 79 | อุบายของอาจารย์เล่ม 79 | คฤหาสน์ผีดูดเลือดเล่ม 79 | เคานต์แดร็กคูล่าเล่ม 79 | ภาพถ่ายติดวิญญาณเล่ม 79 | ห้องฝรั่งมังค่าเล่ม 79 | ครั้งหนึ่งของปรากฏการณ์เร้นลับเล่ม 79 | เหตุจูงใจของแต่ละคน\n","\n","doc 10\n","Australia India Malaysia New Zealand Pakistan Philippines Singapore العالم العربي (Arab world) الإمارات (UAE) لبنان (Lebanon) <السعودية (KSA) 日本 (Japan) 中国版 (China) 香港版 (Hong Kong) भारत (India) தமிழ்(India) മലയാളം (India) తెలుగు (India) ישראל (Israel) 한국 (Korea) 台灣版 (Taiwan) Việt Nam (Vietnam) বাংলাদেশ (Bangladesh) ไทย (Thailand)\n","Europe & Africa\n","België Belgique Botswana Čeština (Česko) Deutschland Ethiopia France Ghana Ireland Italia Kenya Magyarország Maroc Namibia Nederland Nigeria Norge Österreich Polska Portugal Schweiz Sénégal South Africa Suisse Sverige Slovensko Slovenija Tanzania Türkiye Uganda U.K. Zimbabwe مصر (Egypt) Ελλάδα (Greece) Россия (Russia) Србија (Serbia) Украина (Ukraine) Україна (Ukraine) Lietuva Latvija\n","North & South America\n","Argentina Brasil Canada English Canada Français Chile Colombia Cuba Estados Unidos México Perú U.S. Venezuela\n","\n","Global News\n","เรื่องเด่น ข่าวทั่วโลก ประเทศไทย ธุรกิจ วิทย์/เทคโนฯ บันเทิง กีฬา สุขภาพ\n","ผู้ใช้ iPhone 13, iPhone 14 หลายรายเจอปัญหาจอเขียว หลังอัปเดตเป็น iOS 16.1 iPhoneMod\n","Apple ปล่อย iOS และ iPadOS 16.1.1 ออกมาแก้ไขข้อผิดพลาด พร้อมปรับปรุงความปลอดภัย Flashfly\n","ดูเรื่องราวจากทุกช่องทางใน Google News\n","ผู้ใช้ iPhone 13, iPhone 14 หลายรายเจอปัญหาจอเขียว หลังอัปเดตเป็น iOS 16.1 บางรายต้องส่งเครื่องเคลม แต่คาดว่าเป็น Bug ของ iOS 16ผู้ใช้ iPhone 13, iPhone 14 หลายรายเจอปัญหาจอเขียว หลังอัปเดตเป็น iOS 16.1 บางรายต้องส่งเครื่องเคลม แต่คาดว่าเป็น Bug ของ iOS 16\n","ผู้ใช้ iPhone 13, iPhone 14 หลายรายเจอปัญหาจอเขียว หลังอัปเดตเป็น iOS 16.1\n","iOS 16.1.1 ได้เปิดให้ดาวน์โหลดอัปเดตแล้ววันนี้สำหรับรุ่นที่รองรับ รวมถึง iPad OS 16.1.1 ด้วยเช่นกัน ซึ่งการอัปเดตครั้งนี้มาพร้อมการแก้ปัญหาต่างๆและความปลอดภัยที่เพิ่มมากขึ้น และยังมีiOS 16.1.1 ได้เปิดให้ดาวน์โหลดอัปเดตแล้ววันนี้สำหรับรุ่นที่รองรับ รวมถึง iPad OS 16.1.1 ด้วยเช่นกัน ซึ่งการอัปเดตครั้งนี้มาพร้อมการแก้ปัญหาต่างๆและความปลอดภัยที่เพิ่มมากขึ้น และยังมี\n","iOS 16.1.1 อยากปลอดภัย รีบอัปเดต! ให้กับ iPhone และ iPad ของคุณ\n","ข่าวเกี่ยวกับ iPadOS 16.1.1 ข่าวสาร Gadget ต่างๆ App Review บทความด้าน IT\n","ข่าวเกี่ยวกับ iPadOS 16.1.1 ข่าวสาร Gadget ต่างๆ App Review บทความด้าน IT :: Techmoblog.com\n","Apple ปล่อยเฟิร์มแวร์ขนาดเล็ก iOS 16.1.1 และ iPadOS 16.1.1 เมื่อวันพุธที่ผ่านมา โดยแนะนำให้ผู้ใช้งาน iPhone และ iPad ทุกคนควรอัปเดท บันทึกการเปลี่ยนแปลงสำหรับ iOS และ iPadOS 16.1.1 มีข้อความสั้นๆ ระบุว่าเป็นการแก้ไขข้อบกพร่องและการอัปเดตความปลอดภัย\n","Apple ปล่อย iOS และ iPadOS 16.1.1 ออกมาแก้ไขข้อผิดพลาด พร้อมปรับปรุงความปลอดภัย – Flashfly Dot Net\n","มาแล้ว !! Apple ปล่อยอัปเดท iOS 16.1.1 และ iPadOS 16.1.1 แก้ปัญหาบักต่างๆ แล้ว - Apple News บทความมือถือใหม่ล่าสุด 2022ในที่สุดก็ปล่อยอัปเดทออกมาแล้วสำหรับ iOS 16.1.1 และ iPa […]\n","\n","doc 11\n","เครื่องชั่งแบบดิจิตอล เชื่อว่าเจ้าของร้านกาแฟ ร้านชาไข่มุก ร้านน้ำปั่น หรือแม้แต่ร้านเบเกอร์รี่ ต้องใช้เครื่องชั่งดิจิตอลในการชั่งตวงอยู่แล้ว และเชื่อว่าหลายคนคงอยากรู้ว่าควรเลือกซื้อแบบไหนดี ถึงจะเหมาะกับการใช้งาน หรือต้องซื้อแบบไหนถึงจะใช้ได้นาน เพื่อให้คุ้มค่าต่อการเลือกซื้อเลือกใช้\n","แน่นอนว่าเครื่องชั่งดิจิตอลนั้น นับว่าเป็นไอเทมหรืออีกหนึ่งอุปกรณ์ที่ทางร้านควรต้องมี เพราะจะช่วยให้คุณสามารถชั่งตวงส่วนผสมไ้ด้อย่างละเอียด ไม่ว่าจะเป็นของเหลว อย่างนมสด นมข้นหวาน หรือส่วนผสมอย่าง น้ำตาลทราย ผงโกโก้ การชั่งตวงส่วนผสมที่ถูกต้องจึงถือว่ามีความสำคัญมากเพราะจะให้สูตรที่คงที่ และทำให้ได้รสชาติของเครื่องดื่มที่อร่อยกลมกล่อมตามสูตรที่ถูกต้องนั่นเอง\n","วันนี้ทาง bluemocha เราจึงชวนมาทำความรู้จักกับ “เครื่องชั่งดิจิตอล” สำหรับใครที่ยังไม่คุ้นเคย และสำหรับใครที่พอรู้จักและอยากลองนำมาใช้กับร้าน ก็มาดูวิธีการเลือกซื้อ ข้อควรรู้ ว่าควรเลือก เครื่องชั่งดิจิตอลแบบไหนดี -พร้อมแล้วมาเรียนรู้ไปด้วยกันเลย\n","ทำไมต้องเลือกใช้เครื่องชั่งแบบดิจิตอล\n","– แสดงค่าชัดเจน\n","แน่นอนว่าเครื่องชั่งอนาล็อกทั่ว ๆ ไป มักจะมีเข็มเป็นตัวบอกค่าน้ำหนัก ซึ่งในอดีตถือว่าเป็นที่นิยมกันอย่างมากแต่ในปัจจุบันนี้เครื่องชั่งแบบดิจิตอลเริ่มเข้ามามีบทบาทมากขึ้นไม่ว่าจะเป็นเครื่องชั่งน้ำหนัก เครื่องชั่งอาหาร ซึ่งเพิ่มความสะดวกต่อการใช้งานมากยิ่งขึ้น เพราะจะแสดงค่าเป็นตัวเลขอย่างชัดเจน ช่วยทำให้อ่านค่าได้แม่นยำ แถมยังมีความคลาดเคลื่อนที่น้อย\n","– วัดค่าได้แม่นยำ ตัดน้ำหนักภาชนะ\n","เครื่องชั่งดิจิตอลมีความพิเศษอยู่ที่ สามารถตัดน้ำหนักของภาชนะได้ เพียงแค่วางภาชนะบนเครื่องชั่งแล้วค่อยกดเปิดเครื่อง เครื่องชั่งก้จะไม่มีการวัดค่าน้ำหนักของภาชนะ\n","หรือแม้แต่การชั่งตวงส่วนผสมที่ 1 ไปแล้ว ก็สามารถกดปุ่มเพื่อตัดค่าเดิมไปแล้วสามารถวัดค่าส่วนผสมที่ 2 ได้เลย โดยไม่ต้องเปลี่ยนภาชนะสลับไปมาให้ยุ่งยาก จึงทำให้วัดค่าส่วนผสมต่าง ๆ ได้อย่างแม่นยำ\n","– ทำความสะอาดง่าย\n","เครื่องชั่งประเภทดิจิตอลส่วนใหญ่จะผลิตมาจากสแตนเลส จึงช่วยให้ทำความสะอาดได้ง่าย เพียงแค่ใช้ผ้าสะอาดเช็ด หรือบางรุ่นยังสามารถกันน้ำได้ หากใครที่ต้องการใช้งานเครื่องชั่งกับวัตถุดิบประเภทของเหลวอยู่เป็นประจำ ก็แนะนำให้เลือกซื้อเครื่องชั่งที่กันน้ำได้\n","6 วิธีเลือกใช้ เครื่องชั่งแบบดิจิตอล\n","1. ละเอียดแม่นยำ\n","เครื่องชั่งที่ดีคือจะต้องให้ค่าที่แม่นยำ ชั่งตวงแล้วได้ปริมาณที่เท่ากันในทุกรอบของการชั่ง ช่วยให้การทำงานได้สะดวกยิ่งขึ้น\n","2. เลือกหน่วยวัดที่\n","เครื่องชั่งแบบดิจิตอลทุกยี่ห้อ ทุกรุ่น ย่อมมีหน่วยวัดที่ต่างกัน ดังนั้นควรเลือกเครื่องชั่งที่มีหน่วยวัดที่ตรงตามการใช้งาน ไม่ว่าจะเป็นหน่วยเมตริก หน่วยอิมพีเรียล เพราะตัวแลขที่แสดงค่าของหน่วยวัดแต่ละหน่วยจะมีค่าไม่เท่ากัน\n","3. ขนาดของแท่นวาง\n","ขนาดแท่นวางก็สำคัญ ต้องเลือกที่มีขนาดเหมาะสมหรือใหญ่กว่าภาชนะ หรือสิ่งของที่ต้องการใช้วัดค่า เพื่อให้สะดวกต่อการชั่งตวงและได้ค่าที่ไม่คลาดเคลื่อน\n","4. น้ำหนักเบา หยิบจับสะดวก\n","การเลือกใช้เครื่องชั่งดิจิตอล แนะนำควรเลือกใช้ที่มีน้ำหนักเบา โดยเฉพาะใครที่ต้องโยกย้าย หรือหยิบจับบ่อยครั้ง แนะนำว่าควรเลือกใช้เครื่องชั่งที่มีน้ำหนักเบา เพื่อเพิ่มความสะดวกในการทำงานมากยิ่งขึ้น\n","5. มีฟังก์ชั่นการทำงานที่หลากหลาย\n","เครื่องชั่งแม้จะยี่ห้อเดียวกันแต่คนละรุ่น ก็จะมีฟังก์ชั่นที่ต่างกัน ซึ่งหากจะเลือกซื้อเครื่องชั่งดิจิตอลแนะนำว่าควรเลือกซื้อเครื่องที่มีฟังก์ชั่นตรงตามการทำงานของคุณ โดยเครื่องที่มีฟังก์ชั่นการทำงานเยอะนอกจากเป็นเครื่องชั่ง ก็ยังมีการหักลบน้ำหนักได้ สามารถชั่งนับจำนวนได้ ก็ย่อมจะมีราคาที่สูงกว่าเครื่องทั่ว ๆ ไป\n","6. การบริการหลังการขาย\n","เครื่องชั่งแม้จะไม่ได้เป็นเครื่องใช้ไฟฟ้า แต่จำเป็นต้องมีการบำรุงรักษา ดังนั้นก่อนเลือกซื้อควรที่จะเลือกร้านที่สามารถให้คำปรึกษาการใช้งานหลังการขายได้ รวมถึงทางร้านสามารถแก้ไขปัญหาเบื้อต้น มีบริการการซ่อม แลกเปลี่ยนอะไหล่ได้อย่างไรบ้าง\n","เป็นอย่างไรกันบ้างเอ่ย พอที่จะรู้จักเครื่องชั่งดิจิตอลกันบ้างหรือยัง กับคำแนะนำที่ทาง bluemocha เรานำมาแบ่งปันกันในวันนี้ ทั้งวิธีการเลือกซื้อ เครื่องชั่งแบบดิจิตอล รวมไปถึงข้อควรรู้ว่าทำไมถึงต้องเลือกใช้เครื่องชั่งดิจิตอลนี้ ซึ่งหวังว่าทุกคนจะสามารถนำข้อมูลที่เรามาแบ่งปันกันนี้ไปเป็นข้อพิจารณา ในการตัดสินใจเลือกซื้อเลือกใช้กันได้ตามในแบบที่ต้องการ เพื่อช่วยให้การชงเครื่องดื่มของคุณสะดวกยิ่งขึ้น\n","เพื่อให้เครื่องดื่มของร้านคุณอร่อยกลมกล่อมทุกเมนู มีรสชาติคงที่เหมือนกันทุกแก้วสำหรับเมนูเครื่องดื่มนั้น ๆ ดังนั้นจึงต้องควรเลือกใช้เครื่องชั่งดิจิตอลในการชั่งตวงส่วนผสมทุกครั้งก่อนทำการชงเครื่องดื่ม หรือสำหรับใครที่ไม่อยากจะลงทุนซื้อเครื่องชั่งดิจิตอล ก็สามารถดูมาตราชั่งตวงอื่น ๆ เพื่อทดแทนหรือเปลี่ยนหน่วยในการชั่งตวงส่วนผสมได้ เพื่อให้การชงเครื่องดื่มของคุณสะดวกได้ยิ่งขึ้นตามอุปกรณ์อื่น ๆ ที่สามารถใช้แทนกันได้ ทั้งนี้สำหรับใครที่อยากให้ลูกค้าได้ลิ้มลองเครื่องดื่มสุดอร่อยของร้านคุณ กลับมาซื้อเครื่องดื่มอยู่เป็นประจำ จนมีฐานลูกค้าเดิม ๆ และมีลูกค้าใหม่ ๆ เข้าร้านอยู่เป็นประจำ บอกเลยว่าต้องมีเมนูเครื่องดื่มใหม่ ๆ เอาใจลูกค้าอยู่สม่ำเสมอ เพื่อให้ลูกค้าได้เลือกดื่มเมนูอย่างหลากหลาย ไม่เบื่อกับเมนูเดิม ๆ\n","ซึ่งใครที่อยากจะได้ใบชา ผงชง สำหรับชงเครื่องดื่มก็สามารถเลือกใช้ใบชาของโรงคั่วชา bluemocha ได้เลย เพราะเป็นใบชาคุณภาพดี ที่นำมาผ่านกระบวนการผลิตที่ได้มาตรฐาน จนทำให้ใบชามีกลิ่นหอม ชงแล้วได้รสชาติที่เข้มข้น ไม่ฝาด แถมยังมีใบชาให้เลือกเยอะมาก กว่า 30 รายการเลยทีเดียว ไม่ว่าจะเป็น ใบชาเขียวอบแห้ง ใบชาแดงอัสสัม ใบชาไต้หวันแท้\n","ผงมัทฉะญี่ปุ่น ผงโกโก้แท้ และอื่น ๆ อีกมากมาย คลิกดูใบชาทั้งหมด\n","นอกจากนี้ทาง bluemocha เรายังมีเคล็ดลับดี ๆ ที่เกี่ยวกับร้านกาแฟ ร้านชาไข่มุก มีเทคนิคในการต้มชาในการชงชาอีกเยอะแยะมากมาย ทั้งการทำท็อปปิ้งเครื่องดื่มด้วยตนเอง อย่าง การตีวิปครีมแบบกล่อง การทำฟรุตสลัดผลไม้สด การทำไข่มุก หรือวิธีการเก็บเมล็ดกาแฟ วิธีแก้ปัญหากาแฟไม่เข้มข้น เพื่อให้ได้กาแฟที่หอมเข้มข้น หรือแม้แต่วิธีการเลือกซื้อเครื่องตีฟองนม เครื่องปั่นแบบมือถือ แปรงชงชาเขียว หัวบีบวิปครีม แพ็กเกจจิ้งใส่เครื่องดื่มต่าง ๆ อุปกรณ์ที่ช่วยในการชงเครื่องดื่มอีกหลาย ๆ ไอเทม ตลอดจนไปถึงการเพิ่มยอดขายด้วยวิธีต่าง ๆ อย่างการทำโปรโมชั่นร้านกาแฟไม่ให้ขาดทุน การขายผ่านบริการ Food Delivery การชงชา 4 ลิตรสำหรับใส่ขวดขาย การทำเต้าฮวย การทำสังขยา ซึ่งเรายังมีเทคนิคอื่น ๆ อีกมากมาย คลิกดูบทความเพิ่มเติม\n","\n","doc 12\n","ทานตะวันบานสะพรั่ง “เจ้าหญิงผู้ติดดิน” พระองค์ติ๊ด ทรงมุ่งมั่น “พลิกผืนนา” ด้วยความพอเพียง ตามรอยในหลวง ร.๙ - ข่าวไทย\n","หน้าแรก\n","ข่าวด่วน\n","บันเทิง\n","Home Article ทานตะวันบานสะพรั่ง “เจ้าหญิงผู้ติดดิน” พระองค์ติ๊ด ทรงมุ่งมั่น “พลิกผืนนา” ด้วยความพอเพียง ตามรอยในหลวง ร.๙\n","ทานตะวันบานสะพรั่ง “เจ้าหญิงผู้ติดดิน” พระองค์ติ๊ด ทรงมุ่งมั่น “พลิกผืนนา” ด้วยความพอเพียง ตามรอยในหลวง ร.๙\n","Khunang April 05, 2019 0 comments\n","Share:\n","Facebook\n","Twitter\n","Google+\n","Pinterest\n","พระเจ้าหลานเธอ พระองค์เจ้าอทิตยาทรกิติคุณ หรือ พระองค์ติ๊ด ทรงพระกรุณาโปรดเกล้าฯให้มีการจัดสร้างศูนย์การเรียนรู้ทางการเกษตรส่วนพระองค์ ภายใต้แนวคิดปรัชญาเศรษฐกิจพอเพียงขึ้นที่หมู่บ้านระไซร์ จังหวัดสุรินทร์\n","พื้นที่แห่งนี้ มีพระดำริให้จัดสร้างเป็นศูนย์การเรียนรู้ทางการเกษตรส่วนพระองค์ ที่หมู่บ้านระไซร์ จังหวัดสุรินทร์ โดยปัจจุบันใช้ชื่อว่า “ศูนย์เรียนรู้การเกษตรอทิตยาทร” ที่นี่ไม่ได้มีแต่นาข้าวและพืชผักทางการเกษตรเท่านั้น พระองค์ทรงมีสายพระเนตรที่กว้างไกลในการที่จะพัฒนาพื้นที่การเรียนรู้ทางการเกษตรให้เป็นแหล่งท่องเที่ยวด้วย จึงได้มีพระดำริให้ปลูกต้นทานตะวันหลังนาในช่วงฤดูท่องเที่ยวขึ้น\n","ไม่ใช่จะมีเพียงแต่พืชผักทางการเกษตรและอาหารแปรรูปต่างๆ ที่พระองค์มีพระดำริให้เผยแพร่ความรู้แก่ชาวบ้านเท่านั้น ล่าสุดพระองค์ยังคงสานต่อพระกรณียกิจเพื่อสร้างอาชีพให้แก่ชาวบ้าน ด้วยการให้ปลูกพืชหลังนาช่วงฤดูท่องเที่ยวขึ้น ซึ่งก็คือ ต้นทานตะวัน เพื่อดึงดูดนักท่องเที่ยวให้เข้ามาเยี่ยมชม โดยปัจจุบันศูนย์การเรียนรู้การเกษตรอทิตยาทรนั้นเหลืองอร่ามไปด้วยดอกทานตะวันนับหมื่นต้น กลายเป็นอีกหนึ่งพื้นที่พักผ่อนสำหรับผู้มาเยือน\n","ณ หมู่บ้านระไซร์ จังหวัดสุรินทร์ ซึ่งที่นี่ยังมีสินค้าแปรรูปมากมาย ทั้งพืชผลทางการเกษตรแปรรูป ผ้าไหม ผ้าพันคอ เครื่องเงิน รวมทั้งเสื้อยืดและแก้วเซรามิกพิมพ์ลายที่พระองค์ติ๊ดทรงออกแบบ เพื่อนำรายได้ร่วมสมทบทุนในกิจกรรมของศูนย์เรียนรู้การเกษตรอทิตยาทร\n","ข้อมูลและภาพ จาก praew\n","Share:\n","Facebook\n","Twitter\n","Google+\n","Pinterest\n","No comments\n","Subscribe to: Post Comments ( Atom )\n","Featured Post\n","พรุ่งนี้น้ำมันปรับขึ้นพรวด เยอะมาก..!!\n","**วันที่ 24 สิงหาคม 2565 เพจแจ้งเตือนราคาน้ำมัน ได้โพสต์ปรับราคาน้ำมันขึ้นแล้ว - โซฮอล์ +0.80 บาท - E85 +0.50 บาท มีผลตั้งแต่วันที่ 25 สิงหา...\n","\n","doc 13\n","หากเราพิจารณากันในลักษณะของส่วนประสมของสินค้า คงไม่ต่างกันมาก คือ มีอาหารจานด่วน (Fast food) และเครื่องดื่ม (Beverage) ผสมผสานกับโกรเซอรี (Grocery) แต่ดีกรีของส่วนผสมอาจจะต่างกัน ทั้งนี้ขึ้นอยู่กับการจัดตำแหน่ง (Positioning) และกลุ่มลูกค้าเป้าหมาย (Target Customer) ของร้านค้าปลีกนั้นๆ\n","มีพื้นที่ขายประมาณ 50 – 200 ตารางเมตร\n","ร้านสะดวกซื้อ หรือ คอนวีเนียนสโตร์ (Convenience Store: CVS) และมินิมาร์ท (Minimart) เป็นร้านค้าที่ให้บริการต่อลูกค้าที่ต้องการความสะดวก และความรวดเร็ว จำหน่ายสินค้าอุปโภคบริโภคที่จำเป็นต่อชีวิตประจำวันซึ่งมีจำนวน SKU ประมาณ 2,000 – 3,000 SKU ในแต่ละร้าน รวมทั้งจำหน่ายเครื่องดื่มและอาหารประเภท พร้อมทาน\n","ร้านสะดวกซื้อ มีจุดเด่นในเรื่อง “ทำเลที่ตั้ง” ที่จะอยู่ในแหล่งชุมชนหรือในทำเลที่มีจำนวนผู้สัญจรผ่านไป-มามาก\n","หรือในปั๊มน้ำมัน นอกจากเรืองทำเลแล้ว ยังอำนวยความสะดวกให้แก่ลูกค้าในเรื่อง “เวลาในการให้บริการ”\n","โดยส่วนใหญ่จะเปิดให้บริการ 24 ชั่วโมง และยังให้ความสะดวกในการเลือกซื้อสินค้า แม้จะมีสินค้าไม่หลากหลายเท่า Supermarket แต่มีวิธีการ “จัดเรียงสินค้า(Display)” ให้หาง่าย ให้ความรวดเร็วในการชำระเงิน ลูกค้าของร้านสะดวกซื้อส่วนใหญ่เป็นลูกค้าประจำ ที่มีที่พักหรือที่ทำงานไม่ไกลจากร้านหรือลูกค้าที่เข้าไปเติมน้ำมันในปั้มน้ำมัน\n","ร้านสะดวกซื้อเน้นการให้บริการประกอบกับลูกค้าเป็นลูกค้าประจำเป็นส่วนใหญ่\n","ดังนั้นการให้บริการของร้านสะดวกซื้อจึงมีลักษณะแบบบริการตนเอง อบอุ่น และเป็นมิตร\n","[ad-336×280]\n","ค้าปลีกร้านสะดวกซื้อ\n","About me\n","นักเขียน เจ้าของพ็อกเก็ตบุ๊ก 3 เล่ม [Biz View 361 กระตุกต่อมคิดมองธุรกิจมุมใหม่, ปั่นฟรีคิกพลิกไอเดีย, จิบความคิดสะกิดไอเดีย] คอลัมน์นิสต์ประจำนิตยสาร SME Thailand และ SME K-Inspired แขกรับเชิญรายการธุรกิจติดโอกาส ช่อง Springnews\n","lastest posts\n","โปรโมชั่นให้ได้ผล มิถุนายน 6, 2021\n","ครัวซองต์ฮิตได้อย่างไร พฤษภาคม 22, 2021\n","อย่าแค่ ‘ขายของ’ พฤษภาคม 13, 2021\n","ทำไมไม่ฉีด(วัคซีน) พฤษภาคม 12, 2021\n","ลูกค้าหลักต้องรักษาให้ดีกว่าขาประจำ พฤษภาคม 11, 2021\n","Top Posts & Pages\n","Convenience Store\n","Private brand หรือ House brand\n","Supermarket\n","กำเนิด 7-Eleven : ภาคแรก \"Seven the Begin\"\n","เอากองฟางมาทำโรงแรม\n","facebook\n","facebook\n","ค้นหาสำหรับ:\n","all posts\n","all posts เลือกเดือน มิถุนายน 2021 พฤษภาคม 2021 เมษายน 2021 กุมภาพันธ์ 2021 มกราคม 2021 ธันวาคม 2020 สิงหาคม 2020 พฤษภาคม 2020 ตุลาคม 2019 กุมภาพันธ์ 2019 มกราคม 2019 พฤศจิกายน 2018 กรกฎาคม 2018 มิถุนายน 2018 พฤษภาคม 2018 เมษายน 2018 กุมภาพันธ์ 2018 มกราคม 2018 สิงหาคม 2017 กรกฎาคม 2017 มิถุนายน 2017 พฤษภาคม 2017 เมษายน 2017 มีนาคม 2017 กุมภาพันธ์ 2017 มกราคม 2017 ธันวาคม 2016 พฤศจิกายน 2016 ตุลาคม 2016 กันยายน 2016 สิงหาคม 2016 กรกฎาคม 2016 มิถุนายน 2016 พฤษภาคม 2016 เมษายน 2016 กุมภาพันธ์ 2016 มกราคม 2016 ธันวาคม 2015 ตุลาคม 2015 กันยายน 2015 สิงหาคม 2015 กรกฎาคม 2015 เมษายน 2015 มีนาคม 2015 มกราคม 2015 พฤศจิกายน 2014 ตุลาคม 2014 กันยายน 2014 สิงหาคม 2014 กรกฎาคม 2014 มิถุนายน 2014 พฤษภาคม 2014 เมษายน 2014 มกราคม 2014 สิงหาคม 2013 มิถุนายน 2013 พฤษภาคม 2013 มีนาคม 2013 กุมภาพันธ์ 2013 มกราคม 2013 ธันวาคม 2012 พฤศจิกายน 2012 ตุลาคม 2012 กันยายน 2012 สิงหาคม 2012 กรกฎาคม 2012 มิถุนายน 2012 พฤษภาคม 2012 เมษายน 2012 มีนาคม 2012 กุมภาพันธ์ 2012 มกราคม 2012 ธันวาคม 2011 พฤศจิกายน 2011 ตุลาคม 2011 กันยายน 2011 สิงหาคม 2011 กรกฎาคม 2011 มิถุนายน 2011 พฤษภาคม 2011 เมษายน 2011 มีนาคม 2011 กุมภาพันธ์ 2011 มกราคม 2011 ธันวาคม 2010 พฤศจิกายน 2010 ตุลาคม 2010 กันยายน 2010 สิงหาคม 2010 กรกฎาคม 2010 มิถุนายน 2010 พฤษภาคม 2010 เมษายน 2010 มีนาคม 2010 กุมภาพันธ์ 2010 มกราคม 2010 ธันวาคม 2009 พฤศจิกายน 2009 ตุลาคม 2009 กันยายน 2009 สิงหาคม 2009 กรกฎาคม 2009 มิถุนายน 2009 พฤษภาคม 2009 เมษายน 2009 มีนาคม 2009 กุมภาพันธ์ 2009 มกราคม 2009 ธันวาคม 2008 พฤศจิกายน 2008 ตุลาคม 2008 กันยายน 2008 สิงหาคม 2008 กรกฎาคม 2008 มิถุนายน 2008 พฤษภาคม 2008 เมษายน 2008 มีนาคม 2008 กุมภาพันธ์ 2008 มกราคม 2008 ธันวาคม 2007 พฤศจิกายน 2007 ตุลาคม 2007 กันยายน 2007 สิงหาคม 2007 กรกฎาคม 2007 มิถุนายน 2007 พฤษภาคม 2007 เมษายน 2007 มีนาคม 2007 กุมภาพันธ์ 2007 มกราคม 2007 ธันวาคม 2006 พฤศจิกายน 2006 ตุลาคม 2006 กันยายน 2006\n","\n","doc 14\n","จงให้มากกว่าที่ผู้รับต้องการ และทำอย่างหน้าชื่นตาบาน จงพูดกับคนที่ถึงแม้จะอายุน้อยกว่า แต่เขาก็มีความสำคัญเท่ากัน จงอย่าเชื่อทุกอย่างที่ได้ยิน ใช้ทั้งหมดที่มี และนอนเท่าที่อยาก จะนอน เมื่อกล่าวคำว่า \"ฉันรักเธอ\" จงหมายความตามนั้นจริง\n","\n","doc 15\n","ข้อความนี้ถูกเขียนใน ไฮไลท์ฟุตบอล และติดป้ายกำกับ ลีกเอิง ฝรั่งเศษ, ไฮไลท์ฟุตบอล บน ตุลาคม 30, 2022 โดย editor\n","\n","doc 16\n","footballbetting Sports News, Opinion, Scores, Schedules, FIFA World Cup Qatar 2022, Super Bowl, World Juniors , Formula 1\n","Bk8 Latest Sports News, Comment & Analysis The News\n","Bk8 Sport: Football, Rugby, Cricket, F1, Golf & more\n","Hello world!\n","Home/Tag: พรีเมียร์ลีก อังกฤษ\n","ไบร์ทตัน เตรียมยื่นสัญญาใหม่ กูกูเรย่า กันท่า เรือใบ\n","July 10, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on ไบร์ทตัน เตรียมยื่นสัญญาใหม่ กูกูเรย่า กันท่า เรือใบ\n","สื่อเจ้าดังของแดนผู้ดีอย่าง เดลี่ เมล เปิดเผยรายงานว่า ไบรท์ตัน อยู่ในช่วงที่เตรียมพิจารณาสำหรับการต่อสัญญาใหม่กับ มาร์ก กูกูเรย่า แบ็กซ้ายตัวเก่งเพื่อกันท่า เรือใบสีฟ้า แมนเชสเตอร์ ซิตี้ ที่กำลังตกเป็นข่าวพัวพัน\n","Read More »\n","หงส์แดง ไร้เงา เดวีส์ ทัวร์ปรี-ซีซั่น สื่อคาด เตรียมย้าย\n","July 10, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on หงส์แดง ไร้เงา เดวีส์ ทัวร์ปรี-ซีซั่น สื่อคาด เตรียมย้าย\n","เบน เดวี่ส์ เซ็นเตอร์แบ็คชาวอังกฤษจากค่าย หงส์แดง ลิเวอร์พูล ไม่ได้ปรากฏตัวในทีมชุดออกทัวร์ปรีซีซั่นที่ออกเดินทางสู่ประเทศไทย เมื่อวันอาทิตย์ที่ 10 กรกฎาคมที่ผ่านมา\n","Read More »\n","สิงห์ คุย เรือใบ ต่อเนื่อง ขอซื้อ อาเก้ อีกราย\n","July 10, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on สิงห์ คุย เรือใบ ต่อเนื่อง ขอซื้อ อาเก้ อีกราย\n","สิงโตน้ำเงิน เชลซี ตกเป็นข่าวว่ายังคงไม่หยุดเจรจากับ เรือใบสีฟ้า แมนเชสเตอร์ ซิตี้ หลังจากมีรายงานว่ากำลังลุยต่อเนื่องเพื่อขอซื้อ นาธาน อาเก้ เข้ามาร่วมทีม\n","Read More »\n","ปีศาจแดง สอบถาม PSG โอกาส เซ็น ปาเรเดส\n","July 10, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on ปีศาจแดง สอบถาม PSG โอกาส เซ็น ปาเรเดส\n","ปีศาจแดง แมนเชสเตอร์ ยูไนเต็ด ตกเป็นข่าวได้ทำการส่งเรื่องไปสอบถาม ปารีส แซงต์ แชร์กแมง เกี่ยวโอกาสในการเซ็นสัญญากับ เลอันโดร ปาเรเดส ตามรายงานจากสื่อดังอย่าง เลกิ๊ป\n","Read More »\n","เมอร์สัน แนะ วอร์ด-เพราส์ ย้ายไปทีมใหญ่หาความสำเร็จ\n","July 10, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on เมอร์สัน แนะ วอร์ด-เพราส์ ย้ายไปทีมใหญ่หาความสำเร็จ\n","พอล เมอร์สัน อดีตห้องเครื่องของ อาร์เซน่อล ออกโรงให้สัมภาษณ์แนะนำไปยัง เจมส์ วอร์ด-เพราส์ เพลย์เมกเกอร์ตัวความหวังจาก เซาธ์แฮมป์ตัน ให้เลือกย้ายไปอยู่กับสโมสรที่มีโอกาสประสบความสำเร็จมากกว่าในอนาคต\n","Read More »\n","HERE WE GO ! เชลซี จ่อได้ตัว สเตอร์ลิ่ง เซ็นยาว 2027\n","July 10, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on HERE WE GO ! เชลซี จ่อได้ตัว สเตอร์ลิ่ง เซ็นยาว 2027\n","ราฮีม สเตอร์ลิง แนวรุกทีมชาติอังกฤษของ เรือใบสีฟ้า แมนเชสเตอร์ ซิตี้ ใกล้ได้ย้ายไปร่วมทัพ เชลซี สมใจแล้ว หลังจากล่าสุดกำลังเข้ารับการตรวจร่างกาย และจรดปากกาเซ็นสัญญาถึงปี 2027 โดยมีตัวเลือกขยายเพิ่มได้อีกปี\n","Read More »\n","บรูโน่ เปลี่ยนมาใช้ เบอร์ 8, มาลาเซีย เลือก เบอร์12\n","July 8, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on บรูโน่ เปลี่ยนมาใช้ เบอร์ 8, มาลาเซีย เลือก เบอร์12\n","บรูโน่ แฟร์นันด์ส เพลย์เมกเกอร์ตัวเก่งจากค่าย ปีศาจแดง แมนเชสเตอร์ ยูไนเต็ด ได้ทำการเปลี่ยนหมายเลขเสื้อไปใส่หมายเลข 8 ลงสนามในซีวั่นหน้า\n","Read More »\n","ผีแดง เล็ง บร็อบบีย์ ศิษย์เก่า เทน ฮาก\n","July 8, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on ผีแดง เล็ง บร็อบบีย์ ศิษย์เก่า เทน ฮาก\n","ปีศาจแดง แมนเชสเตอร์ ยูไนเต็ด ตกเป็นข่าวได้กระโดดร่วมวงเพื่อขอแย่งตัว ไบรอัน บร็อบบีย์ แนวรุกอนาคตไกลลูกน้องเก่าของ เอริก เทน ฮาก จากค่าย อาแจ็กซ์\n","Read More »\n","เทน ฮาก กระตุ้น ผีแดง เร่งคว้าตัว มาร์ตีเนซ โดยด่วน\n","July 8, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on เทน ฮาก กระตุ้น ผีแดง เร่งคว้าตัว มาร์ตีเนซ โดยด่วน\n","เอริก เทน ฮาก กุนซือไฟแรงแห่งศึก พรีเมียร์ลีก อังกฤษ กำลังส่งสัญญาณไปยังทีมซื้อขายของสโมสร แมนเชสเตอร์ ยูไนเต็ด ว่าต้องเร่งดำเนินการดึงตัว ลีซานโดร มาร์ตีเนซ มาครองให้ได้โดยเร็วที่สุด\n","Read More »\n","ผีแดง เป็นเศร้า เดอ ลิกซ์ เลือกแล้วสถานีถัดไป\n","July 8, 2022 กีฬา, พรีเมียร์ลีก, ฟุตบอล Comments Off on ผีแดง เป็นเศร้า เดอ ลิกซ์ เลือกแล้วสถานีถัดไป\n","ปีศาจแดง แมนเชสเตอร์ ยูไนเต็ด ตกเป็นข่าวโดนเอเยนต์ของทาง มัทไธส์ เดอ ลิกต์ ตอบปัดกลับมาทันทีหลังจากติดต่อสอบถามสถานการณ์ของนักเตะ\n","\n","doc 17\n","Home / Shop / วัสดุเสริมสำหรับงานปักจักร / ไหมปักแบรนด์ Madeira / ไหมปักโพลีเอสเตอร์ สีล้วน 2500ม. / ไหมปัก Madeira 2500m. สี 1986\n","ไหมปัก Madeira 2500m. สี 1986\n","฿129.00\n","ไหมปักโพลีเอสเตอร์ ยี่ห้อ Madeira จากประเทศเยอรมนี คุณภาพสูง ปักง่าย งานสวย เส้นไหมเรียบเงา ไม่ขาดง่าย\n","มีสินค้าอยู่ 2\n","จำนวน ไหมปัก Madeira 2500m. สี 1986 ชิ้น\n","หยิบใส่ตะกร้า\n","รหัสสินค้า: AT-MED-PL1986 หมวดหมู่: ไหมปักโพลีเอสเตอร์ สีล้วน 2500ม. ป้ายกำกับ: ด้ายปัก, ด้ายโพลีเอสเตอร์, ไหมปัก\n","\n","doc 18\n","เทียบ 4 คอนโดมิเนียมหรู บนทำเลย่านสาทร ราคาต่อตร.ม.ไม่ต่ำกว่า 2 แสนบาท [ 125 Sathorn / The Reserve Sathorn / Tait Sathorn 12 / Anil Sathorn 12 ] | thinkofliving.com\n","ลงทะเบียนเข้าสู่ระบบ\n","คอนโด\n","บ้าน\n","รีวิวโครงการ\n","รีวิวทำเล\n","ข่าว\n","คู่มือซื้อขาย\n","ไอเดียตกแต่ง\n","ข้อมูลงานอีเว้นท์\n","คอนโด\n","บ้าน\n","รีวิวโครงการ\n","พรีวิวโครงการใหม่\n","รีวิว\n","Point of view\n","รีวิวทำเล\n","ย่าน\n","รถไฟฟ้า\n","ข่าว\n","ข่าวอสังหาฯ\n","ข่าวทั่วไป\n","คู่มือซื้อขาย\n","ซื้อ - ขาย\n","สินเชื่อ\n","การลงทุน\n","ไอเดียตกแต่ง\n","ออกแบบ - ตกแต่ง\n","วัสดุและการต่อเติม\n","ดูแล - ซ่อมแซม\n","ข้อมูลงานอีเว้นท์\n","ค้นหา\n","ลงทะเบียนเข้าสู่ระบบ\n","Home/รีวิวโครงการ/\n","เทียบ 4 คอนโดมิเนียมหรู บนทำเลย่านสาทร ราคาต่อตร.ม.ไม่ต่ำกว่า 2 แสนบาท [ 125 Sathorn / The Reserve Sathorn / Tait Sathorn 12 / Anil Sathorn 12 ]\n","บทความ โดย : Nutchaya.K | ตุลาคม 7, 2022 | คอนโด\n","ทำเลที่ตั้ง\n","รายละเอียดโครงการ\n","บทสรุป\n","“สาทร…” แค่ชื่อย่านก็สัมผัสได้ถึงความ High – End สมกับเป็นศูนย์กลางทางเศรษฐกิจของประเทศ หรือ Real CBD แห่งกรุงเทพมหานคร ( Central Business District ) เพราะว่าในย่านนี้เป็นแหล่งรวมสำนักงานใหญ่ของบริษัทชั้นนำในประเทศ โรงแรมระดับ 5 ดาว สถานฑูตต่างๆ สถานพยาบาล สถานศึกษาชื่อดัง ห้างสรรพสินค้าและสวนสาธารณะขนาดใหญ่ ที่สำคัญเพื่อจะรองรับประชากรที่เปลี่ยนผ่านถึง 70,000 คน/วัน “สาทร” จึงเป็นอีกย่านที่รวมการคมนาคมไว้อย่างหลากหลาย และด้วยกิจกรรมที่เกิดขึ้นมากมายในย่านนี้ ทำให้ “สาทร” สามารถเรียกตัวเองว่าเป็น One – Stop Service Location ได้เลยทีเดียวค่ะ\n","ทำไมต้องคอนโดมิเนียมย่านสาทร…?\n","อย่างที่ทราบกันดีว่าย่านสาทรเป็นทำเลในฝันของชาวออฟฟิศและใครอีกหลายๆคน เพราะเป็นแหล่งความอุดมสมบูรณ์ที่ครบครัน ทั้งการเดินทางก็สะดวกสบาย สำหรับใครที่ใช้ชีวิตอยู่ในย่านนี้ การเลือกที่อยู่อาศัยอย่างคอนโดก็สามารถช่วยย่นระยะเวลาและช่วยแก้ปัญหาการจราจรที่ติดมาก ( ! ) บนถนนสาทรไปได้เลยค่ะ ซึ่งโดยส่วนใหญ่ที่พักอาศัยในย่านนี้จะเป็นคอนโดมิเนียมระดับ Luxury – Ultimate เรียกได้ว่าเปิดตัวแต่ละครั้งเรียกความสนใจได้ไม่น้อยเลยทีเดียว และวันนี้เราจะพาไปชม 4 โครงการที่เปิดตัวมาในราคาต่อตร.ม.ใกล้เคียงกันคือ 240,000 – 265,000 บาท / ตร.ม.\n","สำหรับใครที่กำลังมองหาที่อยู่อาศัยบนทำเลศักยภาพใจกลางเมือง จะต้องไม่พลาดกับ 4 โครงการดังนี้\n","125 Sathorn จาก PMT Property ราคาเริ่มต้น 5.9 – 53.5 ล้านบาท*\n","The Reserve Sathorn จาก Pruksa Real Estate ราคาเริ่มต้น 12.9 – 42 ล้านบาท*\n","Tait Sathorn 12 จาก Raimon Land ราคาเริ่มต้น 9 – 36 ล้านบาท*\n","Anil Sathorn 12 จาก Grand Unity Development ราคาเริ่มต้น 15.9 – 32 ล้านบาท*\n","ซึ่งนอกจากความ Luxury บนทำเล Prime Area แล้ว โครงการเหล่านี้จะมีจุดเด่นและข้อแตกต่างที่น่าสนใจอะไรอีกบ้าง ไปติดตามกันได้เลยค่ะ\n","ทำเลที่ตั้ง\n","ทั้ง 3 โครงการตั้งอยู่บนถนนสาทร ซึ่งเป็นถนนสายสำคัญที่อยู่ใจกลางเมือง และยังสามารถเชื่อมต่อกับถนนใหญ่ๆได้อีกหลายสาย ทั้งถนนพระราม 4 , ถนนสีลม , ถนนนราธิวาสฯ และถนนเจริญกรุง เรียกได้ว่าเป็นย่าน Main Road ของเมืองหลวงเลยทีเดียวค่ะ นอกจากนี้ยังอยู่ใกล้กับจุดขึ้น – ลงทางด่วน ทั้งทางพิเศษศรีรัชและทางด่วนเฉลิมมหานคร ทำให้การเดินทางค่อนข้างสะดวก แต่ก็แลกมาด้วยการจราจรที่หนาแน่นในบางช่วงเวลานะคะ\n","คอนโดติดถนนใหญ่ – จะมีอยู่ 2 แห่งด้วยกันคือ Anil Sathorn 12 จะตั้งอยู่หน้าซอยสาทร 12 ติดกับถนนสาทร – เหนือ และ 125 Sathorn ตั้งอยู่ติดถนนสาทร – ใต้ ส่วน Tait Sathorn 12 อยู่ถัดเข้าไปในซอยเช่นเดียวกับ The Reserve Sathorn โดยมีระยะทางที่สามารถเดินเข้าออกได้อย่างสบายๆ ส่วนตัวผู้เขียนคิดว่ายังไม่แตกต่างกันเท่าไร แต่หากพูดถึงการใช้รถสาธารณะร่วมด้วยแล้ว คอนโดฝั่งถนนสาทร – เหนือจะได้เปรียบกว่ามากๆ\n","ซึ่งการเดินทางด้วยรถสาธารณะย่านสาทร จะใช้รถไฟฟ้าสายสีเขียวเข้มที่ตัดผ่านกลางย่านเป็นหลัก โดยมี BTS สถานีศาลาแดงเป็นจุด Interchange ไป MRT สายสีลมได้ และ BTS ช่องนนทรีที่เชื่อมกับ BRT สาทร จากแผนที่จะเห็นว่า เส้นทางของรถไฟฟ้าจะคู่ขนานไปกับถนนสาทร – เหนือ ก่อนตัดผ่านไปทางถนนนราธิวาสฯ เพื่อเข้าสู่ย่านสีลม ดังนั้นฝั่งถนนสาทร – ใต้ จะมีรถไฟฟ้าที่ใช้บริการได้ใกล้สุดคือสถานีช่องนนทรีค่ะ\n","เดินทางง่ายที่สุด – ยกให้ Anil Sathorn 12 เพราะเป็นโครงการที่อยู่ติดทั้งถนนใหญ่และรถไฟฟ้าสถานีเซนต์หลุยส์ ทั้งยังสามารถใช้ซอยสาทร 12 เดินทะลุไปยังถนนสีลมได้ด้วย ซึ่งจุดเด่นในข้อนี้ Tait Sathorn 12 ก็ถือว่าได้ประโยชน์รองลงมา เพราะห่างจากถนนสาทร – เหนือประมาณ 180 เมตรค่ะ ส่วน 125 Sathorn และ The Reserve Sathorn ก็สามารถเดินมาใช้รถไฟฟ้าสถานีช่องนนทรีกับ MRT ลุมพินีได้นะคะ แต่ระยะทางเมื่อเทียบกันจะไกลกว่า โดย The Reserve Sathorn อยู่ในซอยสวนพลู ห่างจากถนนสาทร – ใต้ ประมาณ 80 เมตร ซึ่งใกล้กับ MRT ลุมพินีมากกว่า\n","รายละเอียดโครงการ\n","ทั้ง 4 โครงการ เป็นคอนโดมิเนียม High Rise บนทำเลถนนสาทร มีทั้งที่สร้างเสร็จแล้วและอยู่ในระหว่างการก่อสร้าง จากตารางเทียบรายละเอียดโครงการ ก็อาจจะพอให้หลายๆคนสามารถมองเห็นข้อแตกต่างได้บ้างแล้ว ซึ่งในวันนี้เราก็จะมาเจาะลึกถึงจุดเด่น ว่าโครงการไหนจะเหมาะกับใครบ้างกันค่ะ\n","ความสะดวกครบครัน เหมาะกับครอบครัว\n","Anil Sathorn 12 โครงการระดับ Super Luxury ตัวแรกจาก Grand Unity ตั้งอยู่ติดถนนสาทร – เหนือและรถไฟฟ้าสถานีเซนต์หลุยส์ นอกจากความโดดเด่นในเรื่องทำเล มาตรฐานการออกแบบอาคารก็ถือว่าตอบโจทย์ความ Luxury ด้วยการช่วยยกระดับคุณภาพชีวิตของผู้พักอาศัยให้ได้อยู่ในสิ่งแวดล้อมของอาคารที่ดีต่อสุขภาพ ตามหลักของ Well Building Standard เป็นมาตรฐานจาก International WELL Building Institute (IWBI) ประเทศสหรัฐอเมริกา ซึ่งจะประกอบไปด้วยปัจจัยที่สำคัญต่อสุขภาพ 7 ชนิด\n","Air คุณภาพอากาศที่บริสุทธิ์\n","Water คุณภาพน้ำดื่มน้ำใช้\n","Nourishment สุขภาวะด้านโภชนาการ\n","Light การออกแบบแสงสว่างที่เหมาะสม\n","Fitness สุขภาพความแข็งแรงของร่างกาย\n","Comfort ความรู้สึกสบาย\n","Mind ความสุขทางใจ\n","โดย Anil Sathorn 12 นี้ก็เป็นคอนโดมิเนียมแห่งแรกในประเทศไทยที่ผ่านมาตรฐานนี้ค่ะ\n","สำหรับจุดเด่นของโครงการ จะพูดถึง “ความสะดวกครบครัน เหมาะกับครอบครัว ” ทั้งเรื่องแนวคิดการออกแบบที่เหมาะสมสำหรับสมาชิกทุกเพศทุกวัย ทำเลที่เดินทางได้อย่างสะดวกสบาย ความอุดมสมบูรณ์ที่เดินเข้าถึงได้ง่าย สำหรับคนใช้รถ ก็มีที่จอดไว้รองรับถึง 110% ทำเลอยู่ในย่านออฟฟิศเหมาะกับวัยทำงาน ใกล้โรงเรียนชื่อดังหลายแห่ง อย่าง โรงเรียนกรุงเทพคริสเตียน , โรงเรียนเซนต์โยเซฟ คอนแวนต์ , โรงเรียนอัสสัมชัญแผนกประถม ในครอบครัวที่มีบุตรหลาน ก็เดินทางมารับ – ส่งได้ง่าย หรือน้องมัธยมที่โตหน่อย ก็สามารถกลับบ้านเองได้ เรียกว่าสะดวกครบจบที่เดียวจริงๆค่ะ\n","ซึ่งโครงการ Anil Sathorn 12 ก็สร้างเสร็จแล้วเรียบร้อย ราคาเริ่มต้น 15.9 ล้านบาท* และวันนี้เราจะขอนำภาพบรรยากาศตอนเปิดตัวมาให้ชมกันก่อนนะคะ บอกได้เลยว่า Facilities โครงการนี้ สมกับเป็นระดับ Super Luxury ทีเดียวค่ะ\n","Previous\n","Next\n","1\n","2\n","3\n","4\n","5\n","6\n","7\n","8\n","9\n","10\n","11\n","12\n","13\n","14\n","15\n","Image 1/15\n","ภาพจำลองบรรยากาศ : Anil Sathorn 12\n","Previous\n","Next\n","1/15\n","ภาพจำลองบรรยากาศ : Anil Sathorn 12\n","ใครที่สนใจสามารถอ่านรีวิวฉบับเต็มก่อนไปแวะชมโครงการได้ที่ >>> Anil สาทร 12 คอนโด High Rise ติดถนนสาทร ระดับ SUPER LUXURY ตัวแรกจาก Grand Unity [รีวิวฉบับที่ 1870]\n","แล้วติดตามรีวิวตึกเสร็จจาก ThinkofLiving ได้เร็วๆนี้\n","ดีไซน์ล้ำ พื้นที่เอาใจคนรักสัตว์\n","Tait Sathorn 12 คอนโดมิเนียมแบรนด์ใหม่จาก ไรมอน แลนด์ จำกัด (มหาชน) และบริษัท โตเกียว ทาเทโมโนะ เจาะกลุ่มทำเล Luxury อีกครั้งหลังจากเปิดตัว The Estelle Phrom Phong คอนโดหรูใกล้รถไฟฟ้าสถานีพร้อมพงษ์ไปก่อนหน้า โดยจุดเด่นของโครงการนี้เห็นได้ชัดจากรูปทรงของอาคารที่เป็น Iconic Slope ดูโดดเด่นไม่แพ้ตึกมหานครที่อยู่ใกล้ๆกันเลยนะคะ ทั้งยังจัดเต็มด้วย Sky Facilities 5 ชั้นบนสุดของอาคาร ที่สามารถมองเห็นวิวได้โดยรอบ\n","และอีกความน่าสนใจของโครงการนี้เลยก็คือ เป็นคอนโดมิเนียมย่านสาทรที่สามารถเลี้ยงสัตว์ได้ เรียกว่าตอบโจทย์ความเป็น “บ้าน” ให้กับคนรุ่นใหม่ ที่อยากจะมีพื้นที่ไว้ให้สมาชิกตัวเล็กๆได้ใช้ชีวิตร่วมกันนะคะ และด้วยความเป็นโครงการแบบ Pet Friendly นี้ ก็แน่นอนว่าจะต้องมี Facilities ที่เอาใจคนรักสัตว์อยู่แล้ว ซึ่งจะอยู่ที่ชั้น 1 โดยเป็น Pet Lawn หรือสวนที่ด้านหลังโครงการไว้ให้เราสามารถพาสัตว์เลี้ยงมาวิ่งเล่น ยืดเส้นยืดสาย ปลดปล่อยพลังงานกันได้แบบเต็มที่เลย\n","ส่วนตัวผู้เขียนมองว่า Tait Sathorn 12 มีการมองกลุ่มเป้าหมายชัดเจน คือเป็นพื้นที่สำหรับคนที่ต้องการเลี้ยงสัตว์ ซึ่งสำหรับคนที่ไม่ชอบก็อาจจะไม่เหมาะเท่าไรนะคะ เพราะถึงแม้ว่าจะเลี้ยงอยู่แค่ภายในห้อง ไม่ได้ออกมาใช้พื้นที่ส่วนกลางร่วมกัน แต่ปัญหาเรื่องความเป็นส่วนตัว กลิ่นและเสียงรบกวน ก็อาจจะกระทบจนกลายเป็นปัญหาในระยะยาวได้\n","ทั้งนี้ก็ขึ้นอยู่กับความชอบและไลฟ์สไตล์ของแต่ละคนเลยค่ะ ส่วนเรื่องที่เทคะแนนให้เต็มๆก็คือดีไซน์ที่มีความพิถีพิถันทั้งภายนอกและภายในอาคาร ซึ่งราคาเริ่มต้นของโครงการนี้จะอยู่ที่ 9 ล้านบาท* โดยภาพรวมบรรยากาศจะเป็นยังไงบ้าง ลองไปรับชมกันได้เลยค่ะ\n","Previous\n","Next\n","1\n","2\n","3\n","4\n","5\n","6\n","Image 1/6\n","ภาพจำลองบรรยากาศ : Tait Sathorn 12\n","Previous\n","Next\n","1/6\n","ภาพจำลองบรรยากาศ : Tait Sathorn 12\n","สามารถอ่านรีวิวฉบับเต็มต่อได้ที่ >>> Tait Sathorn 12 คอนโด High Rise เลี้ยงสัตว์ได้ในซอยสาทร 12 ใกล้รถไฟฟ้าสถานีเซนต์หลุยส์ 180 เมตร จาก Raimon Land [Walk-in รีวิว]\n","หรูหรา เป็นส่วนตัวในระดับพรีเมียม\n","The Reserve Sathorn คอนโดมิเนียมระดับ Luxury ในซอยสวนพลู ห่างจากถนนสาทร – ใต้เพียง 80 เมตร สะท้อนความหรูหราด้วยสไตล์การแตกแต่งแบบ Modern Colonial ผสมผสานไลฟ์สไตล์ของคนเมืองรุ่นใหม่เข้ากับกลิ่นอายความเป็นไทยที่มีบรรยากาศของอาคารตะวันตกจากชุมชนดั้งเดิม ซึ่ง The Reserve Sathorn ก็ถือว่าถ่ายทอดเอกลักษณ์เหล่านี้ออกมาได้เป็นอย่างดี มีการใช้วัสดุอย่างหินอ่อนมาตกแต่งพื้นที่ส่วนกลางและส่วนพักอาศัย ทำให้ได้ความรู้สึก High End มากขึ้นไปอีก ซึ่งก็ถือเป็นจุดเด่นของแบรนด์ The Reserve จาก Pruksa เลยนะคะ สำหรับราคาเริ่มต้นจะอยู่ที่ 12.9 ล้านบาท*\n","โดยโครงการนี้เน้นความเป็นส่วนตัวมากๆ เพราะมีเพื่อนบ้านอยู่แค่ 134 ยูนิตเองนะคะ และแต่ละชั้นก็ได้จัดทางเดินให้เป็นแบบ Single Corridor ซึ่งทั้งชั้นก็มีแค่ 8 ยูนิตเท่านั้น แต่ถึงแม้ว่าจำนวนยูนิตจะไม่มากเมื่อเทียบกับโครงการอื่น แต่ Facilities ภายในก็ถือว่าจัดมาให้แบบเกินคุ้มเลยทีเดียวค่ะ\n","ซึ่ง Main Facilities ของโครงการจะอยู่ที่ชั้น 29 – 30 ยกตัวอย่างเช่น Exclusive Gym ส่วนออกกำลังกายที่สามารถเชื่อมต่อได้กับ Yoga & Boxing Studio และ Function Highlight โครงการอย่าง Crystal Lounge ห้องรับรองที่ถูกล้อมรอบด้วยกระจกขนาดใหญ่ คล้ายกับอยู่ภายใน Crystal และอีก 1 จุดที่พลาดไม่ได้เลยก็คือ Colonial Themal Pool สระน้ำอุ่นระบบเกลือแบบกลางแจ้งบนชั้น Rooftop ที่ประกอบด้วย Jacuzzi ทั้งหมด 5 จุด แยกความเป็นส่วนตัวด้วยสวนคั่นกลาง สามารถว่ายน้ำไปและชมวิวใจกลางสาทรได้แบบเต็มที่เลยค่ะ\n","Previous\n","Next\n","1\n","2\n","3\n","4\n","5\n","6\n","7\n","8\n","9\n","10\n","11\n","12\n","Image 1/12\n","รีวิวตึกเสร็จ : The Reserve Sathorn\n","Previous\n","Next\n","1/12\n","รีวิวตึกเสร็จ : The Reserve Sathorn\n","สามารถอ่านรีวิวฉบับเต็มต่อได้ที่ >>> รีวิวตึกเสร็จ The Reserve Sathorn คอนโด High Rise ย่านสาทร ในซอยสวนพลู ยูนิตน้อยเป็นส่วนตัว จาก พฤกษา [รีวิวฉบับที่ 2369]\n","ราคาในฝันบนทำเลสาทร\n","125 Sathorn อีกหนึ่งโครงการระดับ Luxury ที่อยู่ติดถนนสาทร – ใต้ ทั้งยังเป็นโครงการขนาดใหญ่ที่มีจำนวนยูนิตถึง 755 ยูนิตเลยทีเดียว ซึ่งความน่าสนใจของโครงการนี้คือตัว Package ที่เปิดตัวมาด้วยราคาเริ่มต้น 5.9 ล้านบาท* เรียกได้ว่าเป็น Rare Item ในย่านสาทรเลยนะคะ เพราะด้วยศักยภาพของทำเลการจะทำ Product ออกมาให้คุ้มค่ากับราคาที่ดินตรงนี้ถือว่ายากมาก ราคาเริ่มต้นที่ออกมาจึงไม่ค่อยต่ำกว่า 7 – 8 ล้านบาท* ซึ่งความแตกต่างก็อยู่ที่พื้นที่ใช้สอยนั่นเอง\n","โดยรูปแบบห้องที่น่าสนใจก็คือ 1 Bedroom ที่มีขนาด 28.55 – 43.70 ตร.ม. ในราคาเริ่มต้น 5.9 ล้านบาท* ถ้าเทียบกับคอนโดมิเนียมทั่วไปในย่านอื่น ขนาด 28.55 ตร.ม. ก็ถือเป็นไซส์มาตรฐานที่อยู่คนเดียวได้แบบสบายๆนะคะ แต่ถ้าเทียบกับโครงการในย่านสาทรส่วนใหญ่ขนาดห้องเริ่มต้นจะอยู่ที่ 40 ตร.ม.ขึ้นไปค่ะ โดยพอมาลองเทียบแปลนในห้องจากทั้ง 4 โครงการดูแล้วก็พบว่า การจัดฟังก์ชันและสัดส่วนการใช้งานค่อนข้างใกล้เคียงกัน รูปแบบการขายก็เป็น Fully Fitted เหมือนกัน ทำให้รู้สึกว่าขนาดพื้นที่ใช้สอยและราคาของ 125 Sathorn ดูจะคุ้มค่าและเป็นตัวเลือกที่น่าสนใจมากเลยค่ะ\n","แต่ก็ยังมีจุดที่ผู้ซื้อจะต้องชั่งใจก่อนเลือกนะคะ อย่างเรื่องวิวของห้อง 1 Bedroom ที่อาจจะต้องเห็นระเบียงของห้องตรงข้ามแทน ด้วยรูปทรงของอาคารที่แยกเป็น 2 Tower และพื้นที่จอดรถที่มีเพียง 57% ซึ่งก็ถือว่าน้อยไปสักหน่อย สำหรับโครงการที่ต้องใช้รถยนต์ส่วนตัวในการเดินทางเป็นหลัก แต่หากใครคิดว่าจุดสำคัญคือการได้อยู่คอนโดในย่านสาทรและสามารถใช้ส่วนของ Facilities แบบ Luxury เป็นการชดเชยได้ ก็เข้าไปดูรายละเอียดที่น่าสนใจ ก่อนจะจับจองไว้สักห้องได้เลยค่ะ\n","Previous\n","Next\n","1\n","2\n","3\n","4\n","5\n","6\n","7\n","8\n","9\n","Image 1/9\n","ภาพจำลองบรรยากาศ : 125 Sathorn\n","Previous\n","Next\n","1/9\n","ภาพจำลองบรรยากาศ : 125 Sathorn\n","สามารถอ่านรีวิวฉบับเต็มต่อได้ที่ >>> 125 Sathorn (125 สาทร) คอนโดหรูเปิดใหม่ ติดถนนสาทร เริ่ม 5.9 ล้านบาท จาก PMT Property [รีวิวฉบับที่ 2393]\n","บทสรุป\n","โดยทั้ง 4 โครงการ ผู้เขียนมองว่ามีความน่าสนใจและจุดแข็งที่แตกต่างกันอย่างชัดเจน\n","คอนโดสร้างเสร็จพร้อมอยู่ – Anil Sathorn 12 / The Reserve Sathorn\n","คอนโดติดถนนใหญ่ – Anil Sathorn 12 / 125 Sathorn\n","คอนโดใกล้รถไฟฟ้า (สถานีเซนต์หลุยส์ ) – Anil Sathorn 12 / Tait Sathorn 12\n","คอนโดยูนิตน้อย เป็นส่วนตัวมาก – The Reserve Sathorn\n","คอนโด Pet Friendly – Tait Sathorn 12\n","คอนโดราคาเอื้อมถึงได้ – 125 Sathorn\n","สำหรับ 125 Sathorn จะเน้นความเป็นราคาที่สามารถจับต้องได้ เพื่อขยายฐานกลุ่มผู้ซื้อที่มีความต้องการอยากได้ที่พักอาศัยย่านสาทร ซึ่งโดยปกติแล้วก็ถือว่าเป็นขนาดเริ่มต้นต่ำสุดในย่านที่หาได้ยากในคอนโดระดับ Luxury แล้วนะคะ ส่วน The Reserve Sathorn ที่ตั้งอยู่ในทำเลใกล้กันบนถนนสาทร – ใต้ จะมีความได้เปรียบมากกว่าในเรื่องจำนวนยูนิตที่เป็นส่วนตัว และพื้นที่จอดรถที่ได้ถึง 100% เหมาะกับโครงการที่ต้องใช้รถยนต์ในการเดินทางเป็นหลักค่ะ\n","ส่วน Tait Sathorn 12 เป็นคอนโดที่เน้นดีไซน์ โดยมีเป้าหมายที่ชัดเจนคือกลุ่มคนรุ่นใหม่ ที่เน้นการใช้ชีวิตอยู่บ้านมากขึ้น Facilities จึงจัดเต็มมาให้ถึง 5 ชั้น เพื่อรองรับไลฟ์สไตล์ที่หลากหลาย รวมถึงการเป็นคอนโดมิเนียมแบบ Pet Friendly ที่กำลังเป็นกระแสนิยมอยู่ในขณะนี้เลย ส่วน Anil Sathorn 12 จัดอยู่ในระดับพรีเมียมสมเป็นคอนโด Super Luxury ทั้งทำเลอยู่ติดถนนสาทรและรถไฟฟ้า อยู่ใกล้แหล่งความอุดมสมบูรณ์ในย่านสาทร – สีลม – เจริญกรุง ถูกใจวิถีชีวิตคนเมืองที่เน้นเรื่องความสะดวกสบายไปเลยค่ะ\n","หากมีโครงการไหนที่น่าสนใจ หรืออยากจะให้ข้อมูลเพิ่มเติม ก็สามารถทิ้ง Comment ไว้ที่ด้านล่างได้เลยค่ะ ขอบคุณสำหรับการติดตามในวันนี้ แล้วพบกับ Content ดีๆได้อีกที่ think of living นะคะ 🙂\n","0\n","อ่านเพิ่มเติม\n","แชร์เนื้อหา:\n","125 SATHORN\n","ANIL Sathorn 12\n","Condominium Review\n","Review\n","Tait sathorn 12\n","The Reserve Sathorn\n","คอนโดย่านสาทร\n","ถนนสาทร\n","รีวิวคอนโด\n","Nutchaya.K\n","ดูทั้งหมด 31 จาก Nutchaya.K\n","จบจากคณะสถาปัตยกรรมศาสตร์ ลาดกระบัง ทำงานและเรียนรู้ทักษะการออกแบบในฐานะสถาปนิก 3 ปี หวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนนะคะ ยินดีรับคำแนะนำและแลกเปลี่ยนประสบการณ์ใหม่ๆเสมอค่ะ :)\n","เพิ่มเติม\n","0 แสดงความคิดเห็น\n","วิดีโอ แนะนำ\n","รีวิวโครงการ\n","BoomTharis | รีวิว Me-i Avenue บ้าน 40 ล้านที่สร้างตามหลักฮวงจุ้ยทั้งหลัง!?\n","วิดีโอ โดย: Sopita P. | อีก 15 วัน | บ้าน\n","บริษัท คิดเรื่องอยู่ จำกัด (ผู้ประกอบการของ thinkofliving.com) จะไม่รับผิดชอบ หรือรับผิดต่อเนื้อหา หรือความไม่ถูกต้องใดๆในข้อมูลที่ให้ไว้ ณ ที่นี้ ดังนั้นผู้ใช้ข้อมูลจะถูกร้องขอให้ตรวจสอบข้อมูลอย่างเป็นอิสระกับผู้พัฒนาอสังหาริมทรัพย์ (Developer) ก่อนที่จะทำการตัดสินใจใดๆที่เกี่ยวข้องกับอสังหาริมทรัพย์ที่ปรากฎอยู่ ณ ที่นี้ บริษัท คิดเรื่องอยู่ จำกัด กรรมการ พนักงาน ตัวแทนและผู้แทนอื่นๆ จะไม่รับผิดชอบต่อการดำเนินการใดๆ ต้นทุน / ค่าใช้จ่าย / ความสูญเสียที่เกิดขึ้นแก่คุณ\n","\n","doc 19\n","เว็บไซต์นี้ใช้คุกกี้เพื่อวัตถุประสงค์ในการปรับปรุงประสบการณ์ของผู้ใช้ให้ดีขึ้น ท่านสามารถศึกษารายละเอียดเพิ่มเติมเกี่ยวกับประเภทคุกกี้ที่เราจัดเก็บ เหตุผลในการใช้คุกกี้ และวิธีการได้ใน นโยบายคุกกี้ และ คำแถลงเกี่ยวกับนโยบายส่วนบุคคลของเรา\n","การ\n","ยอมรับ\n","การตั้งค่าความเป็นส่วนตัว\n","×\n","คุกกี้ที่จำเป็นต่อการใช้งาน (Strictly Necessary Cookies)\n","เปิดใช้งานตลอดเวลา\n","คุกกี้ประเภทนี้มีความจำเป็นต่อการให้บริการเว็บไซต์ของ กรมพัฒนาฝีมือแรงงาน เพื่อให้ท่านสามารถ เข้าใช้งานในส่วนต่าง ๆ ของเว็บไซต์ได้ รวมถึงช่วยจดจำข้อมูลที่ท่านเคยให้ไว้ผ่านเว็บไซต์ การปิด การใช้งานคุกกี้ประเภทนี้จะ ส่งผลให้ท่านไม่สามารถใช้บริการในสาระสำคัญของกรมพัฒนาฝีมือแรงงาน ซึ่งจำเป็นต้องเรียกใช้คุกกี้ได้\n","คุกกี้เพื่อการวิเคราะห์และประเมินผลใช้งาน (Performance Cookies)\n","คุกกี้ประเภทนี้ช่วยให้ กรมพัฒนาฝีมือแรงงาน เห็นการปฏิสัมพันธ์ของผู้ใช้งานในการใช้บริการเว็บไซต์ ของ สพธอ. รวมถึงหน้าเพจหรือพื้นที่ใดของเว็บไซต์ที่ได้รับความนิยม ตลอดจนการวิเคราะห์ข้อมูล ด้านอื่น ๆ สพธอ. ยังใช้ข้อมูลนี้เพื่อการปรับปรุงการทำงานของเว็บไซต์ และเพื่อเข้าใจพฤติกรรม ของผู้ใช้งาน อย่างไรก็ดี ข้อมูลที่คุกกี้นี้เก็บรวบรวมจะเป็นข้อมูลที่ไม่สามารถระบุตัวตนได้ และนำมา ใช้วิเคราะห์ทางสถิติเท่านั้น การปิดการใช้งานคุกกี้ประเภทนี้จะส่งผลให้ กรมพัฒนาฝีมือแรงงาน ไม่สามารถทราบปริมาณผู้เข้าเยี่ยมชมเว็บไซต์ และไม่สามารถประเมินคุณภาพการให้บริการได้\n","\n"]}]},{"cell_type":"code","source":["!pip install transformers \n","from transformers import AutoTokenizer\n","\n","t5_tokenizer = AutoTokenizer.from_pretrained(\"google/mt5-base\")\n","def len_tokenized(text):\n"," return len(t5_tokenizer(text)[\"input_ids\"])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":495,"referenced_widgets":["3f626cb4922249aeba4021c875d1734e","ee91bb3176ec4a6085e855b00b4dac4c","db00d004ed32496d861a0ecb0e8b8d40","66069d1ec18c42bd92e71d9a69c9677a","7674f31544864e63a6bc4b592249c04d","7a650cc1bcf841ddb57f19eec183a460","fb731c9ac53440f1afd3790cb56d36ee","f2592ae026d849b3b82f86a0bc231b5d","ca12be2b8ba5452dba77e26e8b1949a6","cab20ea43f8b4025ad21988fee2c836d","6cf636ed6d5640f99e16d80f1516ec52","4d3a56e34a634fc3aaae717e177a8aaf","ef69334a669a41cf98b56967b320501e","0f552552ae76476eb073aa21a1e9d2d5","6c9be2ae05714b5788294077e685672d","5d4c929b03044ef3924cb45578e09441","76c362a033384c049256f39532d1c462","af450da8a1e64c4ba8ed24c35e9e6b56","78647a3e1f544182899e93ba41729f2a","42ebbecd93cb4c28b1b124528574eab9","cbb4151ada7f40f7a9ac52bce1d90e82","5959a304279e48dc95526b667cd9785b","735703cd69254029b25f5db5847295b4","88616920fc3242de8941ed75200798b9","937fddb414c64f3ea9a67c169a4ec186","8a61cbd79fd744acb6cfefe4a73f30b6","4ed80032f22743e0bcc8b31aa4d5659f","6dd6a6a6b4834183a2411f9d5b4670af","3fbd4f170fdf416fa29f72bb9acc2569","e5314e34ed75496dab56ccff3b31cfde","99850141d4824a04a9f436e53af2608c","a5105f20616c49d8b70c7fbe52d4327a","e0d5bfdbe7e34c51bf91f6b6d9a4a5bf","a5ee3ba316f345f4ad0aa30eb61ee9b0","f3f9caef1bfe46dab167aa070313344a","6a366fd60aed497db80684a1c5c277b8","f46a301ce7af4056b437667568906608","088709794ed448908137d429026c8e76","8aa460fa88d0403a9b516f23629d328c","c317607ed6c74631b68b0c00bdfc5beb","54ae26b703864fc68f64a6e642c734c0","487c6ff76a4e455b8709392fff926486","c228bcc401c74da5b091145073575246","40b02d60f3ae4eb08ad6953a22c3d095"]},"id":"JiATlDSKe5SU","executionInfo":{"status":"ok","timestamp":1682710399851,"user_tz":-420,"elapsed":14468,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"a4cb1851-cc93-4ae6-b4df-4f4dfc091f46"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Requirement already satisfied: transformers in /usr/local/lib/python3.10/dist-packages (4.28.1)\n","Requirement already satisfied: huggingface-hub<1.0,>=0.11.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.14.1)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n","Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.24.3)\n","Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n","Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n","Requirement already satisfied: tokenizers!=0.11.3,<0.14,>=0.11.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (0.13.3)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n","Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (2023.4.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.11.0->transformers) (4.5.0)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n"]},{"output_type":"display_data","data":{"text/plain":["Downloading (…)okenizer_config.json: 0%| | 0.00/376 [00:00\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmeta
00กฎหมายไทยห้ามการพนันทุกรูปแบบ ยกเว้นหวยไทยและก...{'warc_headers': {'warc-record-id': '<urn:uuid...
1212pornhub thai | หนังโป๊ PORN หนังXXX หี หนังAV ...{'warc_headers': {'warc-record-id': '<urn:uuid...
1515นากาตะเป็นประธานของบริษัทเอเจนซี่โฆษณาที่นานาม...{'warc_headers': {'warc-record-id': '<urn:uuid...
1717เว็บ เครดิตฟรี ยืนยันเบอร์ FUN88 เว็บคาสิโนสด ...{'warc_headers': {'warc-record-id': '<urn:uuid...
2323ฟุตบอลโลกปี 2022 กำลังใกล้เข้ามาอย่างรวดเร็ว แ...{'warc_headers': {'warc-record-id': '<urn:uuid...
............
139982139982รีวิวเกมสล็อต Fish Hunter Yao Qian Sun สล็อตยิ...{'warc_headers': {'warc-record-id': '<urn:uuid...
139985139985UFABETลิ้ง ไม่ว่าจะเป็นการสมัคร แทงบอลออนไลน์s...{'warc_headers': {'warc-record-id': '<urn:uuid...
139989139989เว็บคาสิโน คาสิโนในเพนซิลเวเนียและหนังสือกีฬาข...{'warc_headers': {'warc-record-id': '<urn:uuid...
139994139994เทคนิค แทงบอลออนไลน์ ถ้าความนิยมในการเลือกเข้า...{'warc_headers': {'warc-record-id': '<urn:uuid...
139996139996จัดอันดับ สุดยอดเว็บไซต์พนันออนไลน์ รวมเว็บพนั...{'warc_headers': {'warc-record-id': '<urn:uuid...
\n","

32807 rows × 3 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":9}]},{"cell_type":"markdown","source":["# LDA"],"metadata":{"id":"A9iR9mWSJTQb"}},{"cell_type":"code","source":["f=open(\"/content/drive/MyDrive/Openthaigpt/stopwords.txt\",\"r\")\n","\n","stopwords = [line.strip() for line in f.readlines()]\n","\n","f.close()"],"metadata":{"id":"8HBYaPGbMTKq"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import gensim\n","from gensim import corpora\n","from gensim.models import LdaModel\n","from pythainlp.tokenize import word_tokenize\n","import re\n","import os\n","tqdm.pandas()\n","\n","def preprocess_text(text):\n"," text = text.lower()\n"," text = text.replace(\"\\n\",\"\")\n"," text = text.replace(\"\\t\",\"\")\n"," text = re.sub(\"[^a-zA-Zก-๙๐-๙ ]\",\"\",text)\n"," tokenized_text = word_tokenize(text)\n"," return [w for w in tokenized_text if w not in stopwords and len(w)>1]"],"metadata":{"id":"k6N4am2seTlh"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["tokenized_doc = df[\"text\"].progress_apply(preprocess_text)\n","\n","\n","dictionary_path = \"/content/drive/MyDrive/Openthaigpt/lda_dict_oscar2023\"\n","check_file = os.path.isfile(dictionary_path)\n","\n","if not check_file:\n"," dictionary = corpora.Dictionary(tokenized_doc)\n"," dictionary.save(dictionary_path)\n","else :\n"," dictionary=corpora.Dictionary.load(\"filename\")\n","\n","\n","corpus = [dictionary.doc2bow(doc) for doc in tokenized_doc]\n","\n","num_topics = 30\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"wsGJGJLUytKH","outputId":"e645c062-b751-462b-a2b1-2957c9051472","executionInfo":{"status":"ok","timestamp":1680900358636,"user_tz":-420,"elapsed":1677274,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}}},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 50001/50001 [26:46<00:00, 31.12it/s]\n"]}]},{"cell_type":"code","source":["lda_model = LdaModel(corpus=corpus, id2word=dictionary, num_topics=num_topics , passes=20, iterations=100,random_state=1)\n"],"metadata":{"id":"ZUog67zjpEAo"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["for topic in lda_model.print_topics():\n"," print(topic)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"5yaccnLoK9DR","executionInfo":{"status":"ok","timestamp":1680904040417,"user_tz":-420,"elapsed":8,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"def08ec4-8121-45f7-a295-7508caa070cf"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["(5, '0.086*\"บา\" + 0.085*\"คา\" + 0.084*\"ร่า\" + 0.065*\"ออนไลน์\" + 0.054*\"เว็บ\" + 0.028*\"บอล\" + 0.027*\"สล็อต\" + 0.026*\"คาสิโน\" + 0.025*\"sa\" + 0.024*\" \"')\n","(14, '0.014*\" \" + 0.011*\"การสอน\" + 0.009*\"อุบลราชธานี\" + 0.009*\"การศึกษา\" + 0.007*\"ระบบ\" + 0.006*\"ไทย\" + 0.006*\"จัดการ\" + 0.006*\"ศรี\" + 0.005*\"พร\" + 0.005*\"ยา\"')\n","(3, '0.073*\"บอล\" + 0.044*\" \" + 0.024*\"ทีม\" + 0.020*\"ฟุตบอล\" + 0.016*\"ลีก\" + 0.011*\"วันนี้\" + 0.011*\"วิเคราะห์\" + 0.009*\"สด\" + 0.009*\"ทีเด็ด\" + 0.008*\"ราคา\"')\n","(0, '0.023*\" \" + 0.020*\"บ้าน\" + 0.019*\"จังหวัด\" + 0.017*\"รถ\" + 0.012*\"เมือง\" + 0.009*\"ไทย\" + 0.008*\"อบ\" + 0.008*\"ยก\" + 0.007*\"อำเภอ\" + 0.006*\"เชียงใหม่\"')\n","(24, '0.039*\"พระ\" + 0.027*\"วัด\" + 0.022*\" \" + 0.010*\"ท่าน\" + 0.009*\"ทรง\" + 0.007*\"ไทย\" + 0.007*\"ปี\" + 0.007*\"มหา\" + 0.007*\"องค์\" + 0.006*\"สมเด็จ\"')\n","(12, '0.331*\" \" + 0.015*\"เกมส์\" + 0.014*\"สนุก\" + 0.013*\"กระทู้\" + 0.010*\"แนะนำ\" + 0.009*\"แจ้ง\" + 0.009*\"no\" + 0.008*\" \" + 0.007*\"ติชม\" + 0.006*\"other\"')\n","(4, '0.086*\"แปล\" + 0.046*\"ภาษา\" + 0.034*\"วีซ่า\" + 0.023*\"รับรอง\" + 0.018*\"ประเทศ\" + 0.018*\"เอกสาร\" + 0.016*\"เอกสารราชการ\" + 0.014*\"แขวง\" + 0.013*\"จังหวัด\" + 0.012*\"ยื่น\"')\n","(20, '0.040*\"the\" + 0.033*\" \" + 0.033*\"and\" + 0.030*\"to\" + 0.029*\"of\" + 0.020*\"in\" + 0.018*\" \" + 0.014*\"for\" + 0.012*\"on\" + 0.011*\"at\"')\n","(18, '0.033*\" \" + 0.012*\"เช็ค\" + 0.012*\"ฟาย\" + 0.012*\"ฟี\" + 0.011*\"พัสดุ\" + 0.009*\"ข้อมูล\" + 0.008*\"ดี\" + 0.007*\"เค\" + 0.007*\"แผนที่\" + 0.006*\"รี่\"')\n","(16, '0.058*\"ภาษา\" + 0.037*\" \" + 0.025*\"ภาษาเยอรมัน\" + 0.019*\"หน่วย\" + 0.018*\"ญี่ปุ่น\" + 0.017*\"เรียน\" + 0.016*\"ภาษาอังกฤษ\" + 0.014*\"กา\" + 0.012*\"นา\" + 0.010*\"อ่าน\"')\n","(21, '0.057*\" \" + 0.017*\"เครื่อง\" + 0.013*\"ราคา\" + 0.009*\"บด\" + 0.009*\"อุปกรณ์\" + 0.008*\"สำหรับ\" + 0.008*\"รถ\" + 0.008*\"ใช้\" + 0.007*\"ไฟฟ้า\" + 0.007*\"รุ่น\"')\n","(2, '0.046*\"ข้อมูล\" + 0.033*\"เว็บไซต์\" + 0.029*\"ใช้\" + 0.027*\"ท่าน\" + 0.024*\"คุกกี้\" + 0.022*\"สามารถ\" + 0.016*\"บริการ\" + 0.014*\"ส่วนบุคคล\" + 0.011*\"เกี่ยวกับ\" + 0.011*\"นโยบาย\"')\n","(17, '0.140*\"หนัง\" + 0.085*\"ดู\" + 0.035*\"ไทย\" + 0.034*\"ออนไลน์\" + 0.027*\" \" + 0.027*\"ใหม่\" + 0.024*\"ฟรี\" + 0.019*\"ซี\" + 0.018*\"ย์\" + 0.014*\"hd\"')\n","(13, '0.027*\"เย็ด\" + 0.026*\"หี\" + 0.018*\"คลิป\" + 0.017*\"หนังโป๊\" + 0.015*\"สาว\" + 0.015*\"ควย\" + 0.012*\"ไทย\" + 0.010*\"เสียว\" + 0.010*\"น้อง\" + 0.008*\"จน\"')\n","(15, '0.066*\"the\" + 0.037*\"cookies\" + 0.029*\"to\" + 0.027*\"cookie\" + 0.020*\"is\" + 0.020*\"consent\" + 0.019*\"of\" + 0.017*\"website\" + 0.015*\" \" + 0.014*\"for\"')\n","(27, '0.104*\" \" + 0.094*\" \" + 0.021*\" \" + 0.014*\"sdg\" + 0.010*\" \" + 0.008*\"โปรแกรม\" + 0.007*\"สร้าง\" + 0.007*\"หน้า\" + 0.007*\"สินค้า\" + 0.006*\" \"')\n","(29, '0.056*\" \" + 0.013*\"ไทย\" + 0.013*\"ปี\" + 0.011*\"ธุรกิจ\" + 0.007*\"ใหม่\" + 0.006*\"ประเทศ\" + 0.006*\"บาท\" + 0.006*\"ล้าน\" + 0.006*\"สร้าง\" + 0.005*\"บริษัท\"')\n","(9, '0.083*\" \" + 0.008*\" \" + 0.008*\"สาขา\" + 0.008*\"การศึกษา\" + 0.007*\"โรงเรียน\" + 0.007*\"งาน\" + 0.006*\"พศ\" + 0.006*\"ประกาศ\" + 0.006*\"พัฒนา\" + 0.006*\"มหาวิทยาลัย\"')\n","(23, '0.018*\" \" + 0.012*\"อาการ\" + 0.012*\"สุขภาพ\" + 0.011*\"ยา\" + 0.011*\"ช่วย\" + 0.011*\"โรค\" + 0.011*\"ลด\" + 0.010*\"ใช้\" + 0.009*\"ร่างกาย\" + 0.008*\"สามารถ\"')\n","(1, '0.015*\" \" + 0.010*\"the\" + 0.009*\"เพลง\" + 0.006*\"feat\" + 0.005*\"เดอะ\" + 0.005*\"วง\" + 0.005*\"คอร์ด\" + 0.004*\"อร\" + 0.004*\"ร์\" + 0.004*\"ริ\"')\n"]}]},{"cell_type":"code","source":["import pyLDAvis.gensim_models as gensimvis\n","import pyLDAvis\n","\n","# Visualize the topics\n","vis = gensimvis.prepare(lda_model, corpus, dictionary)\n","pyLDAvis.display(vis)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":916},"id":"1PmQhQT9KXmN","executionInfo":{"status":"ok","timestamp":1680904230448,"user_tz":-420,"elapsed":190035,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"a511631b-adb5-45df-b3de-e973fbf4031c"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/pyLDAvis/_prepare.py:243: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only.\n"," default_term_info = default_term_info.sort_values(\n"]},{"output_type":"execute_result","data":{"text/plain":[""],"text/html":["\n","\n","\n","\n","
\n",""]},"metadata":{},"execution_count":12}]},{"cell_type":"code","source":["stopwords[-1]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":90},"id":"F0ph70yncbXZ","executionInfo":{"status":"ok","timestamp":1680904230449,"user_tz":-420,"elapsed":22,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"5b70152f-af2f-4156-ecf2-34f67aab06ed"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":["'เธอ'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":13}]},{"cell_type":"code","source":["docs_topic = []\n","\n","for i in tqdm(range(len(df))):\n","\n"," topics = lda_model.get_document_topics(corpus[i])\n","\n"," top_topic = max(topics, key=lambda x: x[1])\n"," docs_topic.append(top_topic[0])"],"metadata":{"id":"SyBQjjmnRZWp","executionInfo":{"status":"ok","timestamp":1680904360650,"user_tz":-420,"elapsed":130217,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"24353d52-5726-4a6f-cf33-f55a5d0f3163"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n","100%|██████████| 50001/50001 [02:11<00:00, 379.54it/s]\n"]}]},{"cell_type":"code","source":["df[\"docs_topic\"] = docs_topic"],"metadata":{"id":"ZelYyzD0SJp5","executionInfo":{"status":"ok","timestamp":1680904360650,"user_tz":-420,"elapsed":19,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"663f5414-e804-43bf-9c67-f7c8343c93e2"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}]},{"cell_type":"code","source":["df[\"docs_topic\"].unique()"],"metadata":{"id":"Qz9rPLMzTIAX","executionInfo":{"status":"ok","timestamp":1680904360651,"user_tz":-420,"elapsed":17,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"ee824694-4a13-4158-e807-9debeaf13051"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":["array([11, 24, 29, 26, 6, 0, 21, 3, 13, 15, 19, 9, 4, 27, 20, 2, 22,\n"," 17, 7, 23, 28, 8, 25, 12, 16, 18, 5, 10, 1, 14])"]},"metadata":{},"execution_count":16}]},{"cell_type":"code","source":["df[df[\"text\"].str.contains(\"อวัยวะเพศ\")]"],"metadata":{"id":"aPbA-hgeSg5D","colab":{"base_uri":"https://localhost:8080/","height":696},"executionInfo":{"status":"ok","timestamp":1680904362039,"user_tz":-420,"elapsed":1403,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"ea1a7de8-0ddb-4346-fdf2-65a2fd9913d8"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":[" id text \\\n","561 561 google.com, pub-6663105814926378, DIRECT, f08c... \n","847 847 ทัวร์เวียดนาม เริ่มต้น 5,977 ทัวร์เวียดนามราคา... \n","1157 1157 ช่วงที่อากาศร้อนแบบนี้ พัดลมก็เอาแทบไม่อยู่ เพ... \n","1218 1218 ข้อจำกัดเมื่อเข้าทำการ “รีแพร์น้องสาว” สาวๆ ทุ... \n","2787 2787 เมื่อฤดูฝนมาเยือน หมู่ไม้ต่างพร้อมใจกันแตกใบอ่... \n","... ... ... \n","48566 48566 เย็ดสาวเอเชีย สวิง xxx การกระตุก เย็ดหีญี่ปุ่น... \n","48987 48987 คุณชาย EP.10 - EP.11 | ถูกจับตามอง เทียนสารภาพ... \n","49618 49618 เว็บไซต์โดย pokpluek เกาะติดข่าวด่วนทั้งไทยและ... \n","49940 49940 european LIKE movie PG-15 rare CINEMATOGRAPHY ... \n","49983 49983 การ์ตูนโป๊ข่มขืน เด็กแว่นสาวโดนหนุ่มข้างบ้านแอ... \n","\n"," meta docs_topic \n","561 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmetadocs_topic
561561google.com, pub-6663105814926378, DIRECT, f08c...{'warc_headers': {'warc-record-id': '<urn:uuid...6
847847ทัวร์เวียดนาม เริ่มต้น 5,977 ทัวร์เวียดนามราคา...{'warc_headers': {'warc-record-id': '<urn:uuid...20
11571157ช่วงที่อากาศร้อนแบบนี้ พัดลมก็เอาแทบไม่อยู่ เพ...{'warc_headers': {'warc-record-id': '<urn:uuid...23
12181218ข้อจำกัดเมื่อเข้าทำการ “รีแพร์น้องสาว” สาวๆ ทุ...{'warc_headers': {'warc-record-id': '<urn:uuid...23
27872787เมื่อฤดูฝนมาเยือน หมู่ไม้ต่างพร้อมใจกันแตกใบอ่...{'warc_headers': {'warc-record-id': '<urn:uuid...6
...............
4856648566เย็ดสาวเอเชีย สวิง xxx การกระตุก เย็ดหีญี่ปุ่น...{'warc_headers': {'warc-record-id': '<urn:uuid...13
4898748987คุณชาย EP.10 - EP.11 | ถูกจับตามอง เทียนสารภาพ...{'warc_headers': {'warc-record-id': '<urn:uuid...25
4961849618เว็บไซต์โดย pokpluek เกาะติดข่าวด่วนทั้งไทยและ...{'warc_headers': {'warc-record-id': '<urn:uuid...7
4994049940european LIKE movie PG-15 rare CINEMATOGRAPHY ...{'warc_headers': {'warc-record-id': '<urn:uuid...6
4998349983การ์ตูนโป๊ข่มขืน เด็กแว่นสาวโดนหนุ่มข้างบ้านแอ...{'warc_headers': {'warc-record-id': '<urn:uuid...13
\n","

133 rows × 4 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":17}]},{"cell_type":"code","source":["# df[df[\"docs_topic\"]==14][\"text\"][5231]"],"metadata":{"id":"gGYOjapqUuti","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1680904362040,"user_tz":-420,"elapsed":17,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"ac73a373-2bf3-4695-c320-bd4072070688"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]}]},{"cell_type":"code","source":["df[df[\"docs_topic\"]==17].sample(20)"],"metadata":{"id":"pWj0ev7dSoZx","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1680904362040,"user_tz":-420,"elapsed":15,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"34af4772-1f24-4ed4-995e-5283c1b1b5eb"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":[" id text \\\n","28682 28682 ดูหนังออนไลน์ เต็มเรื่อง HD ดูหนังใหม่ชนโรง 20... \n","38345 38345 The Velvet Underground(2021) ดูหนังออนไลน์ – M... \n","3939 3939 หนังออนไลน์ ซาวด์แทรค หนังพากย์ไทย หนังมาสเตอร... \n","15219 15219 ลูกสาวมาเฟีย ขอเคลียร์หัวใจ Haeundae Lovers ตอ... \n","32086 32086 Happiness Ever After (2021) แฮปปี้เนส เอเวอร์ ... \n","46787 46787 ดูหนังออนไลน์ หนังใหม่ 2022 เต็มเรื่อง คมชัด H... \n","6167 6167 บรูซ วิลลิส (Pulp Fiction) รับบทเป็นโรเบิร์ต เ... \n","23452 23452 365doohd | ดูหนังออนไลน์ ดูซีรี่ย์ - ดูหนังมาใ... \n","364 364 เว็บเรามีหนังอยู่มากมายหลายพันเรื่อง มีทั้งหนั... \n","17728 17728 ดูหนังออนไลน์ เว็บดูหนังออนไลน์ คมชัดทั้งภาพแล... \n","39183 39183 Fast And Furious 7 (2015) เร็ว…แรง ทะลุนรก 7 |... \n","27784 27784 เว็บดูหนังของเรา พร้อมเข้ามาเติมเต็มช่วงเวลาอั... \n","34805 34805 ประเภทหนัง : 2022 ซับไทย ซีรี่ย์ พากย์ไทย หนัง... \n","13474 13474 ดูหนังออนไลน์ Ant-Man 2 (2018) แอนท์-แมน และ เ... \n","20240 20240 ดูซีรี่ย์เกาหลี Love in Contract เปิดแฟ้มสัญญา... \n","21425 21425 “Moonshot” ภาพยนตร์ตลกเบาสมองที่มีการบิดเบือนต... \n","47098 47098 นักสังคมวิทยากลับเนื้อกลับตัวเดินทางไปยังเกาะห... \n","18583 18583 I Am a Superstar วุ่นรักนายซุปตาร์ ซับไทย Ep1-... \n","37891 37891 © ซีรี่ย์พากย์ไทย ซีรี่ย์พากย์ไทยแนะนํา ซีรี่ย... \n","34416 34416 WEIRD THE AL YANKOVIC STORY (2022) สำรวจทุกแง่... \n","\n"," meta docs_topic \n","28682 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmetadocs_topic
2868228682ดูหนังออนไลน์ เต็มเรื่อง HD ดูหนังใหม่ชนโรง 20...{'warc_headers': {'warc-record-id': '<urn:uuid...17
3834538345The Velvet Underground(2021) ดูหนังออนไลน์ – M...{'warc_headers': {'warc-record-id': '<urn:uuid...17
39393939หนังออนไลน์ ซาวด์แทรค หนังพากย์ไทย หนังมาสเตอร...{'warc_headers': {'warc-record-id': '<urn:uuid...17
1521915219ลูกสาวมาเฟีย ขอเคลียร์หัวใจ Haeundae Lovers ตอ...{'warc_headers': {'warc-record-id': '<urn:uuid...17
3208632086Happiness Ever After (2021) แฮปปี้เนส เอเวอร์ ...{'warc_headers': {'warc-record-id': '<urn:uuid...17
4678746787ดูหนังออนไลน์ หนังใหม่ 2022 เต็มเรื่อง คมชัด H...{'warc_headers': {'warc-record-id': '<urn:uuid...17
61676167บรูซ วิลลิส (Pulp Fiction) รับบทเป็นโรเบิร์ต เ...{'warc_headers': {'warc-record-id': '<urn:uuid...17
2345223452365doohd | ดูหนังออนไลน์ ดูซีรี่ย์ - ดูหนังมาใ...{'warc_headers': {'warc-record-id': '<urn:uuid...17
364364เว็บเรามีหนังอยู่มากมายหลายพันเรื่อง มีทั้งหนั...{'warc_headers': {'warc-record-id': '<urn:uuid...17
1772817728ดูหนังออนไลน์ เว็บดูหนังออนไลน์ คมชัดทั้งภาพแล...{'warc_headers': {'warc-record-id': '<urn:uuid...17
3918339183Fast And Furious 7 (2015) เร็ว…แรง ทะลุนรก 7 |...{'warc_headers': {'warc-record-id': '<urn:uuid...17
2778427784เว็บดูหนังของเรา พร้อมเข้ามาเติมเต็มช่วงเวลาอั...{'warc_headers': {'warc-record-id': '<urn:uuid...17
3480534805ประเภทหนัง : 2022 ซับไทย ซีรี่ย์ พากย์ไทย หนัง...{'warc_headers': {'warc-record-id': '<urn:uuid...17
1347413474ดูหนังออนไลน์ Ant-Man 2 (2018) แอนท์-แมน และ เ...{'warc_headers': {'warc-record-id': '<urn:uuid...17
2024020240ดูซีรี่ย์เกาหลี Love in Contract เปิดแฟ้มสัญญา...{'warc_headers': {'warc-record-id': '<urn:uuid...17
2142521425“Moonshot” ภาพยนตร์ตลกเบาสมองที่มีการบิดเบือนต...{'warc_headers': {'warc-record-id': '<urn:uuid...17
4709847098นักสังคมวิทยากลับเนื้อกลับตัวเดินทางไปยังเกาะห...{'warc_headers': {'warc-record-id': '<urn:uuid...17
1858318583I Am a Superstar วุ่นรักนายซุปตาร์ ซับไทย Ep1-...{'warc_headers': {'warc-record-id': '<urn:uuid...17
3789137891© ซีรี่ย์พากย์ไทย ซีรี่ย์พากย์ไทยแนะนํา ซีรี่ย...{'warc_headers': {'warc-record-id': '<urn:uuid...17
3441634416WEIRD THE AL YANKOVIC STORY (2022) สำรวจทุกแง่...{'warc_headers': {'warc-record-id': '<urn:uuid...17
\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":19}]},{"cell_type":"code","source":["df[df[\"docs_topic\"]==1].iloc[4][\"text\"]"],"metadata":{"id":"Yy4mG_G_Sffz","colab":{"base_uri":"https://localhost:8080/","height":90},"executionInfo":{"status":"ok","timestamp":1680904362041,"user_tz":-420,"elapsed":12,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"e517c72c-acb9-4a91-fc00-e72974dfee93"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":["'Webmaster : ครูกิตติธัช, ครูณรงค์เดช, ครูกนน, ครูภูริทัต, ครูเฉลิมพงศ์, ครูสิปปนนท์, ครูกฤติกร หวังอ้อมกลาง'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":20}]},{"cell_type":"code","source":["df[(df[\"text\"].str.contains(\"เย็ด\")) & ~(df[\"text\"].str.contains(pattern))]"],"metadata":{"id":"VtZPbegAxLUF","colab":{"base_uri":"https://localhost:8080/","height":522},"executionInfo":{"status":"ok","timestamp":1680904366807,"user_tz":-420,"elapsed":4776,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"04a6d817-7928-4ebd-cdca-3ad87e658288"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/ipykernel/ipkernel.py:283: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n"," and should_run_async(code)\n"]},{"output_type":"execute_result","data":{"text/plain":[" id text \\\n","117 117 แม่บอกว่า ไม่อยู่บ้าน 2-3 วัน ให้พี่ชายดูแลน้อ... \n","118 118 2 เพื่อนสาวขี้เงี่ยน มาหาถึงบ้าน อยากจะลองแบบ ... \n","753 753 คลิปหลุดจีน นักศึกษาจีนโชว์เสียว มีของดีแบบนี้... \n","1217 1217 IPX-811 อยากเย็ดไม่ขัดจัดหนักรุ่นน้อง Karen Ka... \n","2116 2116 สาวนางร่างบางรับงานขายหอยยืนรอฝ่ายชายเรียกเข้า... \n","... ... ... \n","44600 44600 มัธยมปลายสาวผมสั้น เจอแฟนชวนมาโรงแรม สวิงกิ้งก... \n","45235 45235 ธรรมดาแล้วผมเป็นผู้ที่ถูกใจเรื่องเซ็กส์มากมาย ... \n","47277 47277 สาวโสดชาวไทยที่มาทำงานในอเมริกา ความฝันหนึ่งคื... \n","47974 47974 คลิปโป้ น้องเมียเงี่ยนจัดเดินมาหาขอให้พี่เขยช่... \n","48603 48603 doujin, My Office Ladies, NTR, SM, Uncensored,... \n","\n"," meta docs_topic \n","117 {'warc_headers': {'warc-record-id': '\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
idtextmetadocs_topic
117117แม่บอกว่า ไม่อยู่บ้าน 2-3 วัน ให้พี่ชายดูแลน้อ...{'warc_headers': {'warc-record-id': '<urn:uuid...13
1181182 เพื่อนสาวขี้เงี่ยน มาหาถึงบ้าน อยากจะลองแบบ ...{'warc_headers': {'warc-record-id': '<urn:uuid...13
753753คลิปหลุดจีน นักศึกษาจีนโชว์เสียว มีของดีแบบนี้...{'warc_headers': {'warc-record-id': '<urn:uuid...13
12171217IPX-811 อยากเย็ดไม่ขัดจัดหนักรุ่นน้อง Karen Ka...{'warc_headers': {'warc-record-id': '<urn:uuid...13
21162116สาวนางร่างบางรับงานขายหอยยืนรอฝ่ายชายเรียกเข้า...{'warc_headers': {'warc-record-id': '<urn:uuid...13
...............
4460044600มัธยมปลายสาวผมสั้น เจอแฟนชวนมาโรงแรม สวิงกิ้งก...{'warc_headers': {'warc-record-id': '<urn:uuid...13
4523545235ธรรมดาแล้วผมเป็นผู้ที่ถูกใจเรื่องเซ็กส์มากมาย ...{'warc_headers': {'warc-record-id': '<urn:uuid...13
4727747277สาวโสดชาวไทยที่มาทำงานในอเมริกา ความฝันหนึ่งคื...{'warc_headers': {'warc-record-id': '<urn:uuid...6
4797447974คลิปโป้ น้องเมียเงี่ยนจัดเดินมาหาขอให้พี่เขยช่...{'warc_headers': {'warc-record-id': '<urn:uuid...13
4860348603doujin, My Office Ladies, NTR, SM, Uncensored,...{'warc_headers': {'warc-record-id': '<urn:uuid...13
\n","

93 rows × 4 columns

\n","
\n"," \n"," \n"," \n","\n"," \n","
\n"," \n"," "]},"metadata":{},"execution_count":21}]},{"cell_type":"markdown","source":["# Token Count"],"metadata":{"id":"t36-mHxBWYMI"}},{"cell_type":"code","source":["from transformers import AutoTokenizer \n","t5_tokenizer = AutoTokenizer.from_pretrained(\"google/mt5-base\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"i0Zr0BO3Wbe4","executionInfo":{"status":"ok","timestamp":1680163266725,"user_tz":-420,"elapsed":6879,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b514abe3-7644-40a6-c752-379aa3782b13"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.9/dist-packages/transformers/convert_slow_tokenizer.py:446: UserWarning: The sentencepiece tokenizer that you are converting to a fast tokenizer uses the byte fallback option which is not implemented in the fast tokenizers. In practice this means that the fast version of the tokenizer can produce unknown tokens whereas the sentencepiece version would have converted these unknown tokens into a sequence of byte tokens matching the original piece of text.\n"," warnings.warn(\n"]}]},{"cell_type":"code","source":["t5_tokenizer([\"หิวข้าวจังเงย\",\"งือๆ\"])[\"input_ids\"]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"3D5LfH3biOdM","executionInfo":{"status":"ok","timestamp":1680163393667,"user_tz":-420,"elapsed":870,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"2151f716-7f17-4158-ebb3-3b36258ad078"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[[259, 18604, 138504, 67641, 148184, 165860, 6200, 1],\n"," [259, 5095, 99650, 4571, 1]]"]},"metadata":{},"execution_count":4}]},{"cell_type":"code","source":["from tqdm import tqdm\n","oscar19=[]\n","token_count=0\n","i=0\n","for data in tqdm(iter(dataset)):\n"," if i%10000==1:\n"," token_count += sum([len(tokenized) for tokenized in t5_tokenizer(oscar19)[\"input_ids\"]])\n"," oscar19=[]\n","\n"," oscar19.append(data[\"text\"])\n"," i+=1\n","print(token_count)\n","print(token_count/i)"],"metadata":{"id":"tKBLCBNEiHQa"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# token เฉลี่ย 478.4516566902038\n","# row 1794110462"],"metadata":{"id":"Y0YSYtr0bxwy","executionInfo":{"status":"ok","timestamp":1680178359178,"user_tz":-420,"elapsed":953,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"e767dde1-25d7-4c98-e839-454a280d025b","colab":{"base_uri":"https://localhost:8080/"}},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["3749826"]},"metadata":{},"execution_count":12}]}]} \ No newline at end of file diff --git a/src/data/openthaigpt_pretraining_data/internet/oscar/preprocess.py b/src/data/openthaigpt_pretraining_data/internet/oscar/preprocess.py new file mode 100644 index 0000000..f2e2b88 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/oscar/preprocess.py @@ -0,0 +1,107 @@ +import re +from pythainlp.util import countthai +from .keywords import ( + DOCUMENT_REMOVAL_KEYWORDS, + PARTIAL_REMOVAL_KEYWORDS, + TH_MONTHS, + CODE_SPECIAL_CHARACTERS, +) +from typing import List, Dict +from datetime import datetime + + +def contains_document_removal_keywords(text: str) -> bool: + """ + Description : Check if an input document contains any document removal keywords. + Input text : An input document. + Output : True if the document contains the keywords. Otherwise, False + """ + + pattern = "|".join(DOCUMENT_REMOVAL_KEYWORDS) + + return bool(re.search(pattern, text)) + + +def check_ratio_bad_substring(text: str) -> bool: + """ + Description : Check if the ratio between number of keywords and length of a document + is exceeds the threshold for each groups. + + Group #1 : Name of months in Thai including abbreviations. + Group #2 : Special char that usually found in the code section. + Group #3 : Space. + Group #4 : Commar. + + Note : Thresholds of each group are from the experiment on oscar. + + Input text : An input document. + Output : True if a ratio of at least 1 group is above . Otherwise, False + """ + + n = len(text) + + if len(re.findall("|".join(TH_MONTHS), text)) / n > 0.015: + return True + + if len(re.findall("|".join(CODE_SPECIAL_CHARACTERS), text)) / n > 0.075: + return True + + if len(re.findall(" ", text)) / n > 0.13: + return True + + if len(re.findall(",", text)) / n > 0.05: + return True + return False + + +def remove_partial_keywords(text: str) -> str: + """ + Description : Remove partial removal keywords from the document. + + Input text : An input document. + Output : A document after removed keywords. + """ + + return re.sub("|".join(PARTIAL_REMOVAL_KEYWORDS), "", text) + + +def clean_text(text: str) -> str: + """ + Description : Clean an input document by these steps + + 1. Remove the whole document if + 1.1. Contains any document removal keywords (ex. porn, gamble) + 1.2. Contains too much TH months, code character, space and commar. + 1.3. The percent of thai characters is less than 50%. + 2. Remove partial removal keywords. + + Input text : An input document. + Output : A clean document ("" if the whole document should be removed). + """ + + if ( + len(text) == 0 + or contains_document_removal_keywords(text) + or check_ratio_bad_substring(text) + or countthai(text) < 50 + ): + return "" + + text = remove_partial_keywords(text).strip() + + return text + + +def clean_dataset(dataset: List[Dict[str, str]]) -> List[Dict[str, str]]: + """ + Description : Call function clean_text to process the whole dataset. + Input text : An input dataset having each element as a document in the dataset. + Output : A clean dataset. + """ + for i, data_point in enumerate(dataset): + cleaned_text = clean_text(data_point["text"]) + if cleaned_text != dataset[i]["text"]: + dataset[i]["text"] = cleaned_text + dataset[i]["updated_date"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + return [data_point for data_point in dataset if data_point["text"] != ""] diff --git a/src/data/openthaigpt_pretraining_data/internet/perplexity/.gitignore b/src/data/openthaigpt_pretraining_data/internet/perplexity/.gitignore new file mode 100644 index 0000000..c3e3eaf --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/perplexity/.gitignore @@ -0,0 +1 @@ +/core.zip diff --git a/src/data/openthaigpt_pretraining_data/internet/perplexity/README.md b/src/data/openthaigpt_pretraining_data/internet/perplexity/README.md new file mode 100644 index 0000000..80e6c37 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/perplexity/README.md @@ -0,0 +1,34 @@ +# Perplexity preprocessing code + +This folder contains codes to preprocess data using the perplexity score computed from a kenlm 5-gram language model trained on Thai wikipedia data. + +The main code is in `perplexity.py` + +The `notebook` folder contains the experiments, observations and EDA notebooks for perplexity method. + +## How does the code work ? + +1. The perplexity score of texts will be computed from the language model and taken log. + +2. The log-perplexity score will be used as a feature of DecisionTree classifier to predict if the text is garbage. + +3. After classified the amount of text, sampled set of garbage text **S** from step 2 will be sample back and add to training set to teach inappropriate terms to our LLM. Here are the detailed steps. + + - The normal distribution of log-perplexity score will be formed. + - Compute the PDF (Probability Density Function) of the each log score. + - Softmax(1-PDF) will be used as probability list for `np.choice` to sample text back. + +## Running + +The code is imported in `src/data/scripts/internet` and you can use it together with mc4 and cc100 regex code there. + +This code is not meant to be run directly. If you want to run with your custom logic please create folder in `src/data/scripts` and import the function you want. + +## Note + +- The idea of using perplexity score are originally from [Perplexed by Quality](https://arxiv.org/pdf/2212.10440.pdf). +- **_However, we decided to try another method on the score since the perplexity score and thresholding is not enough to classify bad data acoording to the observation._** +- DecisionTree classifier was train on the sampled OSCAR2023. + + + diff --git a/src/data/openthaigpt_pretraining_data/internet/perplexity/core.zip.dvc b/src/data/openthaigpt_pretraining_data/internet/perplexity/core.zip.dvc new file mode 100644 index 0000000..0382a0c --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/perplexity/core.zip.dvc @@ -0,0 +1,5 @@ +outs: +- md5: 2a926bdfe0f372d6654ea51deb59f2ae + size: 538146404 + hash: md5 + path: core.zip diff --git a/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/LinearClassifierThaisumWiki.ipynb b/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/LinearClassifierThaisumWiki.ipynb new file mode 100644 index 0000000..1fbd60d --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/LinearClassifierThaisumWiki.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"mount_file_id":"1HJ5XH33eeSSwVZHC8FortNTB-KM4LrbB","authorship_tag":"ABX9TyOM8zMrSrcxbWu1YB8lLXag"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"e8389aeb5bbd496cb216ceed0cb5fda4":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_955b43105dba4b25a0727dcd5c6443ff","IPY_MODEL_ea0afd28843f40968c70058647f2673e","IPY_MODEL_59d73e0411d34c41826319af50863d0c"],"layout":"IPY_MODEL_e1b7f04e685946ba96b531301f8a2661"}},"955b43105dba4b25a0727dcd5c6443ff":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_f2794f69efeb43b693f0fd7b1d4640dc","placeholder":"​","style":"IPY_MODEL_8c674f18591c43c5932ec6bd96f791e5","value":"Downloading builder script: 100%"}},"ea0afd28843f40968c70058647f2673e":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_70b20e86e1194884978c487af28a5cc4","max":3406,"min":0,"orientation":"horizontal","style":"IPY_MODEL_51323ad3279d4c8794751f5a60c7037d","value":3406}},"59d73e0411d34c41826319af50863d0c":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_acb5107b59844eb8b05674a5ed0147e8","placeholder":"​","style":"IPY_MODEL_027f230233974ba083f6ff948ee69e26","value":" 3.41k/3.41k [00:00<00:00, 112kB/s]"}},"e1b7f04e685946ba96b531301f8a2661":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f2794f69efeb43b693f0fd7b1d4640dc":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8c674f18591c43c5932ec6bd96f791e5":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"70b20e86e1194884978c487af28a5cc4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"51323ad3279d4c8794751f5a60c7037d":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"acb5107b59844eb8b05674a5ed0147e8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"027f230233974ba083f6ff948ee69e26":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"979c946ce5434cea9fc8a80552614b2e":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_8d11d0029d2345a8bf742da2c5c1f87b","IPY_MODEL_3eac55675cc74c5d978239e0363d8a29","IPY_MODEL_7a44270fe41e4b15a3703ef1136dcb31"],"layout":"IPY_MODEL_83957fbb5d98458bbbda8e1eb0860f49"}},"8d11d0029d2345a8bf742da2c5c1f87b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_8c4888da2f164b269e0c2045f387e4b3","placeholder":"​","style":"IPY_MODEL_8fbf385a6c4a4103892bce80270f060e","value":"Downloading metadata: 100%"}},"3eac55675cc74c5d978239e0363d8a29":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_c3eafcaa28a54914ac73d96676f49a81","max":1887,"min":0,"orientation":"horizontal","style":"IPY_MODEL_9d536ea69c014d179bbcc702d1c77eab","value":1887}},"7a44270fe41e4b15a3703ef1136dcb31":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_5faf4eefc40b4be78e9dbf514147c326","placeholder":"​","style":"IPY_MODEL_ddb87e26800b4afa973dbaf1c3998f01","value":" 1.89k/1.89k [00:00<00:00, 80.0kB/s]"}},"83957fbb5d98458bbbda8e1eb0860f49":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8c4888da2f164b269e0c2045f387e4b3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8fbf385a6c4a4103892bce80270f060e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c3eafcaa28a54914ac73d96676f49a81":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9d536ea69c014d179bbcc702d1c77eab":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"5faf4eefc40b4be78e9dbf514147c326":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ddb87e26800b4afa973dbaf1c3998f01":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"28eaa0620dbe4d5dad53a5cb66a8c025":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_237bd6ed0bcb405281fda0c5ffe3e250","IPY_MODEL_b29d86de7da247b8ad9f5c514a662b8f","IPY_MODEL_24ec4a2ba7bb4d10aa458bc397943d65"],"layout":"IPY_MODEL_5207afe70d9a45b4a09158a994fc1dd8"}},"237bd6ed0bcb405281fda0c5ffe3e250":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_7325a59844ca4e809bd87d2d5908601c","placeholder":"​","style":"IPY_MODEL_2a825c577f8b436c97340bbeb93e1330","value":"Downloading readme: 100%"}},"b29d86de7da247b8ad9f5c514a662b8f":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_fd3b275ccd044e389ce6a5b40410e922","max":13959,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ea18873a81724da4bf1e4eb356a9dd8f","value":13959}},"24ec4a2ba7bb4d10aa458bc397943d65":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_cd952e8d5d7d41659ac1045f69d20952","placeholder":"​","style":"IPY_MODEL_19ba53d746c84fd085ceaadf24d1bb0f","value":" 14.0k/14.0k [00:00<00:00, 641kB/s]"}},"5207afe70d9a45b4a09158a994fc1dd8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7325a59844ca4e809bd87d2d5908601c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2a825c577f8b436c97340bbeb93e1330":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"fd3b275ccd044e389ce6a5b40410e922":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ea18873a81724da4bf1e4eb356a9dd8f":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"cd952e8d5d7d41659ac1045f69d20952":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"19ba53d746c84fd085ceaadf24d1bb0f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6148cd4ff444416ca22ec3a7f59a949b":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_f353984353544cd88ff2116ab57d4b7a","IPY_MODEL_b4fd5bc259a84acca0f0f329a4a492cb","IPY_MODEL_2b42f0742dc144e38c9ae81e27b6a601"],"layout":"IPY_MODEL_8b655ff5bd734594a4f3cba8c318a3f1"}},"f353984353544cd88ff2116ab57d4b7a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_7f2ee0ae6b5d4d7db1a602fb3622796e","placeholder":"​","style":"IPY_MODEL_b7c385ecd7fb4da380628f15f683f281","value":"Downloading data: 100%"}},"b4fd5bc259a84acca0f0f329a4a492cb":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_ddb9e7249142457c8497e5f344ddfce3","max":647582078,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ba89e5522efa476ab97fbd9eb1a53339","value":647582078}},"2b42f0742dc144e38c9ae81e27b6a601":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2d085a93bb834de5a479273a833a8331","placeholder":"​","style":"IPY_MODEL_4cc8647f80f74be9a3b3b9467ca386e9","value":" 648M/648M [00:30<00:00, 33.8MB/s]"}},"8b655ff5bd734594a4f3cba8c318a3f1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7f2ee0ae6b5d4d7db1a602fb3622796e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b7c385ecd7fb4da380628f15f683f281":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ddb9e7249142457c8497e5f344ddfce3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ba89e5522efa476ab97fbd9eb1a53339":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"2d085a93bb834de5a479273a833a8331":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4cc8647f80f74be9a3b3b9467ca386e9":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"22daa34fc93b407da4eb2393a3c1d9cf":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_3c392f262278463cb18a2370322dcab3","IPY_MODEL_72a98963a27d491bb44c59dad25b84a8","IPY_MODEL_10b3562b11df456983034d9f06ded6e1"],"layout":"IPY_MODEL_2ba5a1a3a920413e844f4bf48e8dac19"}},"3c392f262278463cb18a2370322dcab3":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_89123d8ad6a64cf7b960cb981b381521","placeholder":"​","style":"IPY_MODEL_793e55dd1f3844abbc297223bac995d3","value":"Generating train split: 100%"}},"72a98963a27d491bb44c59dad25b84a8":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"","description":"","description_tooltip":null,"layout":"IPY_MODEL_a14d14bb6c814c0e8fd3bff1ac0100ba","max":358868,"min":0,"orientation":"horizontal","style":"IPY_MODEL_e4c2a79021384532ad365c2cc78df36a","value":358868}},"10b3562b11df456983034d9f06ded6e1":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_cd5d2f08b3c74210a73c69950fc1782e","placeholder":"​","style":"IPY_MODEL_f6f6e65c60084c7f8477b4ce020e4644","value":" 358394/358868 [01:54<00:00, 4979.87 examples/s]"}},"2ba5a1a3a920413e844f4bf48e8dac19":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":"hidden","width":null}},"89123d8ad6a64cf7b960cb981b381521":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"793e55dd1f3844abbc297223bac995d3":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"a14d14bb6c814c0e8fd3bff1ac0100ba":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e4c2a79021384532ad365c2cc78df36a":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"cd5d2f08b3c74210a73c69950fc1782e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f6f6e65c60084c7f8477b4ce020e4644":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c8c70105270b4d66a558098838c597e1":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_146c106678b24983993dc25f8edff23c","IPY_MODEL_bf118fda03164222a6a344e40f0ecb7f","IPY_MODEL_068b6ab25581434eac68bfcf59a2f132"],"layout":"IPY_MODEL_32589164874f4ff99e659c485bab6e0c"}},"146c106678b24983993dc25f8edff23c":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_eb7e6377167d424382fbcdc8834096de","placeholder":"​","style":"IPY_MODEL_1fb8802454c14f498536a85e6316413d","value":"Generating validation split: 97%"}},"bf118fda03164222a6a344e40f0ecb7f":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"","description":"","description_tooltip":null,"layout":"IPY_MODEL_f5301933a4734948a4719a1e7af03eb4","max":11000,"min":0,"orientation":"horizontal","style":"IPY_MODEL_cbba8ed30e0f46e4a4e7d5b0f39f955c","value":11000}},"068b6ab25581434eac68bfcf59a2f132":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c3cb1a386a0d4000bd2d12cd84608fcf","placeholder":"​","style":"IPY_MODEL_4bd15b611bef4c958ea71879fa0f6457","value":" 10623/11000 [00:02<00:00, 3595.58 examples/s]"}},"32589164874f4ff99e659c485bab6e0c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":"hidden","width":null}},"eb7e6377167d424382fbcdc8834096de":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1fb8802454c14f498536a85e6316413d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f5301933a4734948a4719a1e7af03eb4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"cbba8ed30e0f46e4a4e7d5b0f39f955c":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c3cb1a386a0d4000bd2d12cd84608fcf":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4bd15b611bef4c958ea71879fa0f6457":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6dcadae696ae46b885329ba8ed3131a5":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_70a0921dbfbb463aa2098c8863473695","IPY_MODEL_23453818e49c4d7193e7e8e17c937f47","IPY_MODEL_6ddce5bf86634c6ba9cc745a63f30c30"],"layout":"IPY_MODEL_60b1da72c3834d519f1d1060e6f1ae92"}},"70a0921dbfbb463aa2098c8863473695":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_8d91380fc5bc4645a715001206576795","placeholder":"​","style":"IPY_MODEL_9083a507e7134eda8c0572d9a53f0262","value":"Generating test split: 100%"}},"23453818e49c4d7193e7e8e17c937f47":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"","description":"","description_tooltip":null,"layout":"IPY_MODEL_951f67947081434faccc6b3782b6ef2f","max":11000,"min":0,"orientation":"horizontal","style":"IPY_MODEL_bbe002fcfdb243d99e1897b7a36ce93c","value":11000}},"6ddce5bf86634c6ba9cc745a63f30c30":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c811bef6759149369c7931955af7b3eb","placeholder":"​","style":"IPY_MODEL_a3f2594a45b6438aa49f6f32e5a8cd3d","value":" 11000/11000 [00:03<00:00, 2678.09 examples/s]"}},"60b1da72c3834d519f1d1060e6f1ae92":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":"hidden","width":null}},"8d91380fc5bc4645a715001206576795":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9083a507e7134eda8c0572d9a53f0262":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"951f67947081434faccc6b3782b6ef2f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bbe002fcfdb243d99e1897b7a36ce93c":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c811bef6759149369c7931955af7b3eb":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a3f2594a45b6438aa49f6f32e5a8cd3d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"e8efc9e6463d40a188f5923b34ef8413":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_8f573268f2f4465a96d387723f3e7ad9","IPY_MODEL_2f1d52adf6f94f17b7f871b9afd406b5","IPY_MODEL_069556ab254844cdb9d78831f9e02a53"],"layout":"IPY_MODEL_e292ae2332ab4c8ab8cc7fb4400e6f84"}},"8f573268f2f4465a96d387723f3e7ad9":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_05a2146c27b141cc830922963e2047c1","placeholder":"​","style":"IPY_MODEL_8b98b85ecffa4432bf930259b1605fdd","value":"100%"}},"2f1d52adf6f94f17b7f871b9afd406b5":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_888e50ef500842368f51893b94219962","max":3,"min":0,"orientation":"horizontal","style":"IPY_MODEL_fa0a53c1e4614790957bc2f0115c8c58","value":3}},"069556ab254844cdb9d78831f9e02a53":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2407584d97f8444aaefca87db4652b3b","placeholder":"​","style":"IPY_MODEL_273d1d3285bc45cab516eaf90f5c9777","value":" 3/3 [00:00<00:00, 42.25it/s]"}},"e292ae2332ab4c8ab8cc7fb4400e6f84":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"05a2146c27b141cc830922963e2047c1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8b98b85ecffa4432bf930259b1605fdd":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"888e50ef500842368f51893b94219962":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fa0a53c1e4614790957bc2f0115c8c58":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"2407584d97f8444aaefca87db4652b3b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"273d1d3285bc45cab516eaf90f5c9777":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"9db029d66ee2435092d75604930e2c1d":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_8138a4015bf54b0bbff21d53b6cbb4a3","IPY_MODEL_69cffd48f50c4b0c895b49cad0e6d40d","IPY_MODEL_9b8f483e88274ca19cc80ad1c5de443c"],"layout":"IPY_MODEL_9c396b0976c24f1aacc4227e817c940b"}},"8138a4015bf54b0bbff21d53b6cbb4a3":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_af0ff59f869b4169b879045c2de74929","placeholder":"​","style":"IPY_MODEL_f93d0f0dc05b42d89e3de98afdc1bca4","value":"Downloading builder script: 100%"}},"69cffd48f50c4b0c895b49cad0e6d40d":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_ccaea7cb4c104dc0921864643ddb237b","max":4336,"min":0,"orientation":"horizontal","style":"IPY_MODEL_86bd304dc6364188a742b0737f2e9667","value":4336}},"9b8f483e88274ca19cc80ad1c5de443c":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_d4e32bceacf04b57ad62c59550ac6a7a","placeholder":"​","style":"IPY_MODEL_9830cd074d86462c8b24f11655b94c6f","value":" 4.34k/4.34k [00:00<00:00, 105kB/s]"}},"9c396b0976c24f1aacc4227e817c940b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"af0ff59f869b4169b879045c2de74929":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f93d0f0dc05b42d89e3de98afdc1bca4":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ccaea7cb4c104dc0921864643ddb237b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"86bd304dc6364188a742b0737f2e9667":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"d4e32bceacf04b57ad62c59550ac6a7a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9830cd074d86462c8b24f11655b94c6f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"bc5c27cb2fc649819ff45119b89fc907":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_bc9a9b61d03c44eba0bc934a6751864c","IPY_MODEL_f53c9fc057314380ac05a5306abde9bf","IPY_MODEL_3c1ce62ef962448fa06c5fb507d2541d"],"layout":"IPY_MODEL_7d8fb0fa3d3f40d6bcbec9c7eabf1a97"}},"bc9a9b61d03c44eba0bc934a6751864c":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ad506fe9b9dc4a96b3ba96e7472ce697","placeholder":"​","style":"IPY_MODEL_dce8fd2b57444d86981a725aa209cbe1","value":"Downloading metadata: 100%"}},"f53c9fc057314380ac05a5306abde9bf":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_7b277925d96f460b8b701982253fb6da","max":2353,"min":0,"orientation":"horizontal","style":"IPY_MODEL_42b5a2acb94e4b3091a497e0d8a3ab89","value":2353}},"3c1ce62ef962448fa06c5fb507d2541d":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_10d8a5119bf74d4784aa2de0a22ca419","placeholder":"​","style":"IPY_MODEL_e586bf8325d24149a5ee3adc559692ea","value":" 2.35k/2.35k [00:00<00:00, 60.2kB/s]"}},"7d8fb0fa3d3f40d6bcbec9c7eabf1a97":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ad506fe9b9dc4a96b3ba96e7472ce697":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"dce8fd2b57444d86981a725aa209cbe1":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"7b277925d96f460b8b701982253fb6da":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"42b5a2acb94e4b3091a497e0d8a3ab89":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"10d8a5119bf74d4784aa2de0a22ca419":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e586bf8325d24149a5ee3adc559692ea":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"65ef903f38d0462c9c4fe031e0d80603":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_96988b47d52345368e296bfd40fdc8b2","IPY_MODEL_be5bcac8307a401b9c6bff2a17ced915","IPY_MODEL_fe608d370c954104b1e519928f4e7382"],"layout":"IPY_MODEL_529190ef72674db5a7ec5df9d56567c9"}},"96988b47d52345368e296bfd40fdc8b2":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2716e253100b479b9a7cf60b205b61d0","placeholder":"​","style":"IPY_MODEL_9ae09baac606471ca05f4463b48b6459","value":"Downloading readme: 100%"}},"be5bcac8307a401b9c6bff2a17ced915":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_340ca9c00fa94c78bf572d16f3c7c40f","max":8778,"min":0,"orientation":"horizontal","style":"IPY_MODEL_8a1c403b4bcb47649aacf3965ef9d93d","value":8778}},"fe608d370c954104b1e519928f4e7382":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_86758b7b9c47483a9d649e3ddf1c00e8","placeholder":"​","style":"IPY_MODEL_4975d27412b942dca7178fb82253b581","value":" 8.78k/8.78k [00:00<00:00, 246kB/s]"}},"529190ef72674db5a7ec5df9d56567c9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2716e253100b479b9a7cf60b205b61d0":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9ae09baac606471ca05f4463b48b6459":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"340ca9c00fa94c78bf572d16f3c7c40f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8a1c403b4bcb47649aacf3965ef9d93d":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"86758b7b9c47483a9d649e3ddf1c00e8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4975d27412b942dca7178fb82253b581":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f3d03737091d406bb6bacb81dc917e11":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_b14e06c7d5a747d79f882ff6e86afe35","IPY_MODEL_d2e2d317fbdc4c35910cdd41b5477d55","IPY_MODEL_ce88dd67fac647f286c05420bb27b6dd"],"layout":"IPY_MODEL_eb8d07c8843a42ffa40f024c91ac343f"}},"b14e06c7d5a747d79f882ff6e86afe35":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_49e4e10700f64a12800ec24e7a335502","placeholder":"​","style":"IPY_MODEL_53d38c48d33c4bdf899a3b47ac63ad13","value":"Downloading data: 100%"}},"d2e2d317fbdc4c35910cdd41b5477d55":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_acb845dab14a41fcb9550c76935e7f9a","max":2876630,"min":0,"orientation":"horizontal","style":"IPY_MODEL_55a6623828914c6fbd0da80d0d467630","value":2876630}},"ce88dd67fac647f286c05420bb27b6dd":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_254a0095590d409e9fc37c9bbcca40d8","placeholder":"​","style":"IPY_MODEL_e95a2989278f4506bd7ff2a2f22f717e","value":" 2.88M/2.88M [00:00<00:00, 20.0MB/s]"}},"eb8d07c8843a42ffa40f024c91ac343f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"49e4e10700f64a12800ec24e7a335502":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"53d38c48d33c4bdf899a3b47ac63ad13":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"acb845dab14a41fcb9550c76935e7f9a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"55a6623828914c6fbd0da80d0d467630":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"254a0095590d409e9fc37c9bbcca40d8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e95a2989278f4506bd7ff2a2f22f717e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2bd3847033d24f6a91746cb095e4923c":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_6eadf63cd2064c34baba20aa70387cbb","IPY_MODEL_fdabba97e57240ce9e6cbe92c1ea0e1b","IPY_MODEL_b91dfad9372b4a94845637c99d707eb4"],"layout":"IPY_MODEL_e0743dd8680c423d9d0ff3dd33d46258"}},"6eadf63cd2064c34baba20aa70387cbb":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_47dfbe132f2c4daa889d8e89e63585a4","placeholder":"​","style":"IPY_MODEL_9d51ecaa47a145009cf209bf244b1e13","value":"Generating train split: 96%"}},"fdabba97e57240ce9e6cbe92c1ea0e1b":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"","description":"","description_tooltip":null,"layout":"IPY_MODEL_7ac681ac605240c2ac1c4cf3fd2ded25","max":5761,"min":0,"orientation":"horizontal","style":"IPY_MODEL_985ab775c53c4363aa4e84db5f67303e","value":5761}},"b91dfad9372b4a94845637c99d707eb4":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_71a25b60911342ab8d7cb2433378a058","placeholder":"​","style":"IPY_MODEL_62641a93d9dd4290a5bbc417328ae6c8","value":" 5541/5761 [00:01<00:00, 4755.67 examples/s]"}},"e0743dd8680c423d9d0ff3dd33d46258":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":"hidden","width":null}},"47dfbe132f2c4daa889d8e89e63585a4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9d51ecaa47a145009cf209bf244b1e13":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"7ac681ac605240c2ac1c4cf3fd2ded25":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"985ab775c53c4363aa4e84db5f67303e":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"71a25b60911342ab8d7cb2433378a058":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"62641a93d9dd4290a5bbc417328ae6c8":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"23210b02f6064c53be30397510d414da":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_9ec5f4a171794346ba23ea7b521372c7","IPY_MODEL_291631b25492463a8c0f8ba380aeee13","IPY_MODEL_d1edca3ef26e46298a3af6b0313467ec"],"layout":"IPY_MODEL_d840a53a5ac345fa81cfff2feb2bfb1b"}},"9ec5f4a171794346ba23ea7b521372c7":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e51ec061a32d47e1a0243d75f2480b98","placeholder":"​","style":"IPY_MODEL_0bad69b8d44944f484e138020e1df553","value":"Generating validation split: 47%"}},"291631b25492463a8c0f8ba380aeee13":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"","description":"","description_tooltip":null,"layout":"IPY_MODEL_2efd0e9a519d461d836ab0e92f8a3dd2","max":742,"min":0,"orientation":"horizontal","style":"IPY_MODEL_6ad851cc6f2c4594bd74a5c129b0771c","value":742}},"d1edca3ef26e46298a3af6b0313467ec":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_212c4446d4424b75904b83c261e46d88","placeholder":"​","style":"IPY_MODEL_9f982380e77b4745b8ffd36336db1e61","value":" 350/742 [00:00<00:00, 2848.40 examples/s]"}},"d840a53a5ac345fa81cfff2feb2bfb1b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":"hidden","width":null}},"e51ec061a32d47e1a0243d75f2480b98":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0bad69b8d44944f484e138020e1df553":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"2efd0e9a519d461d836ab0e92f8a3dd2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6ad851cc6f2c4594bd74a5c129b0771c":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"212c4446d4424b75904b83c261e46d88":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9f982380e77b4745b8ffd36336db1e61":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3ded530e68fe46b4ab166ca822b48bb3":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_12271b71016a42678e62be557bd0e084","IPY_MODEL_54a5ad86d4fb40c6b5f08f1d8a36ad9d","IPY_MODEL_86f5733c4d1d4e399ee43fe0a89e6bae"],"layout":"IPY_MODEL_02b1ea9750d04c3aa95602f55bf140ff"}},"12271b71016a42678e62be557bd0e084":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_46f972ddf53142918b8fc9c2f83ca252","placeholder":"​","style":"IPY_MODEL_e671d0141d43479580c170bfb3d52021","value":"Generating test split: 84%"}},"54a5ad86d4fb40c6b5f08f1d8a36ad9d":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"","description":"","description_tooltip":null,"layout":"IPY_MODEL_55d7c8b6927949a5ae6dfd4718ab868f","max":739,"min":0,"orientation":"horizontal","style":"IPY_MODEL_a59d7c37050e43ff8065fa6b121f12ed","value":739}},"86f5733c4d1d4e399ee43fe0a89e6bae":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ec1f908dc19941659b13f9d220a43200","placeholder":"​","style":"IPY_MODEL_d4cc398e2e5140d9bf8860c770e33685","value":" 624/739 [00:00<00:00, 5100.46 examples/s]"}},"02b1ea9750d04c3aa95602f55bf140ff":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":"hidden","width":null}},"46f972ddf53142918b8fc9c2f83ca252":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e671d0141d43479580c170bfb3d52021":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"55d7c8b6927949a5ae6dfd4718ab868f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a59d7c37050e43ff8065fa6b121f12ed":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"ec1f908dc19941659b13f9d220a43200":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d4cc398e2e5140d9bf8860c770e33685":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"670a1a116fa94279af06ef37659a5b06":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_a5778159a69a4a169e7f5e42de0affd3","IPY_MODEL_5328f30c498a49f6b8b2cede2a0770f8","IPY_MODEL_18964171c46c4d109ca477f94e4dc8ba"],"layout":"IPY_MODEL_e945293e19364e438d519a175a9666be"}},"a5778159a69a4a169e7f5e42de0affd3":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_5f6da5bf74db4eaa8cdc48b291c304df","placeholder":"​","style":"IPY_MODEL_be6b2b9432c3439998644a792660543a","value":"100%"}},"5328f30c498a49f6b8b2cede2a0770f8":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_21c3f6eba8644a01a56de57bbad772a8","max":3,"min":0,"orientation":"horizontal","style":"IPY_MODEL_709f55d0f4d146f59923a6a455b658f8","value":3}},"18964171c46c4d109ca477f94e4dc8ba":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_1e9b8d2116ad4074aa43930f9b5891d4","placeholder":"​","style":"IPY_MODEL_4c9cfc5dd69341a699bf3cf9461359f6","value":" 3/3 [00:00<00:00, 67.79it/s]"}},"e945293e19364e438d519a175a9666be":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5f6da5bf74db4eaa8cdc48b291c304df":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"be6b2b9432c3439998644a792660543a":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"21c3f6eba8644a01a56de57bbad772a8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"709f55d0f4d146f59923a6a455b658f8":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"1e9b8d2116ad4074aa43930f9b5891d4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4c9cfc5dd69341a699bf3cf9461359f6":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"a1f38ee06c82413e9048a39dcadec01d":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_692fbc4764854e538080dd6f4445d89f","IPY_MODEL_92a9c43961254cdb9b9e67f03595a86e","IPY_MODEL_7784eb8996d94729ab6a5f4f008b7681"],"layout":"IPY_MODEL_6b23646676e74d5f81b1a033a22d8643"}},"692fbc4764854e538080dd6f4445d89f":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_1bd9d4cbc0a249b2a9fa38291c7099c1","placeholder":"​","style":"IPY_MODEL_c56634bbe96b47d38fc5fb75ffc178c0","value":"Downloading builder script: 100%"}},"92a9c43961254cdb9b9e67f03595a86e":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_c2073494b2e14961bf685efd11e3add3","max":22336,"min":0,"orientation":"horizontal","style":"IPY_MODEL_0a72d75eafff42b0901a2546c69298b4","value":22336}},"7784eb8996d94729ab6a5f4f008b7681":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_3a931b776a334803812ea4fef55be98e","placeholder":"​","style":"IPY_MODEL_882f9e7b2f914850813520937fca6f65","value":" 22.3k/22.3k [00:00<00:00, 810kB/s]"}},"6b23646676e74d5f81b1a033a22d8643":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1bd9d4cbc0a249b2a9fa38291c7099c1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c56634bbe96b47d38fc5fb75ffc178c0":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c2073494b2e14961bf685efd11e3add3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0a72d75eafff42b0901a2546c69298b4":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"3a931b776a334803812ea4fef55be98e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"882f9e7b2f914850813520937fca6f65":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"74cb47020377439783ab372fc122aa2a":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_2ac505036e004178b5038b9d9a398688","IPY_MODEL_bf941d7948204aafb67c1670fcfd9090","IPY_MODEL_a8edb396272e4ad4a227b5273bf6297c"],"layout":"IPY_MODEL_1246198ebf9c45ecba72b615ecc53466"}},"2ac505036e004178b5038b9d9a398688":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_89e00dcad13140b0b23250c22d0ca51b","placeholder":"​","style":"IPY_MODEL_d20f6e0dc8ed40b4b0b284b16e657c4a","value":"Downloading readme: 100%"}},"bf941d7948204aafb67c1670fcfd9090":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_6d40c1c3052749b2a2a3e4aa414600e1","max":37423,"min":0,"orientation":"horizontal","style":"IPY_MODEL_0fd0342dfebd4013be25fa6a030dd5de","value":37423}},"a8edb396272e4ad4a227b5273bf6297c":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_a10ac5dc407842199b2543486f2c00e3","placeholder":"​","style":"IPY_MODEL_c2a1418da0b3413498ade99938f8e706","value":" 37.4k/37.4k [00:00<00:00, 612kB/s]"}},"1246198ebf9c45ecba72b615ecc53466":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"89e00dcad13140b0b23250c22d0ca51b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d20f6e0dc8ed40b4b0b284b16e657c4a":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6d40c1c3052749b2a2a3e4aa414600e1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0fd0342dfebd4013be25fa6a030dd5de":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"a10ac5dc407842199b2543486f2c00e3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c2a1418da0b3413498ade99938f8e706":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"cells":[{"cell_type":"code","execution_count":2,"metadata":{"id":"4endNYNftwFl","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1684701837596,"user_tz":-420,"elapsed":12963,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"e4ee4e62-d3da-45d4-aae8-87ecc7695527"},"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting datasets\n"," Downloading datasets-2.12.0-py3-none-any.whl (474 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m474.6/474.6 kB\u001b[0m \u001b[31m23.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from datasets) (1.22.4)\n","Requirement already satisfied: pyarrow>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (9.0.0)\n","Collecting dill<0.3.7,>=0.3.0 (from datasets)\n"," Downloading dill-0.3.6-py3-none-any.whl (110 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.5/110.5 kB\u001b[0m \u001b[31m12.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets) (1.5.3)\n","Requirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (2.27.1)\n","Requirement already satisfied: tqdm>=4.62.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (4.65.0)\n","Collecting xxhash (from datasets)\n"," Downloading xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m212.5/212.5 kB\u001b[0m \u001b[31m20.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting multiprocess (from datasets)\n"," Downloading multiprocess-0.70.14-py310-none-any.whl (134 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.3/134.3 kB\u001b[0m \u001b[31m16.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: fsspec[http]>=2021.11.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (2023.4.0)\n","Collecting aiohttp (from datasets)\n"," Downloading aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m49.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting huggingface-hub<1.0.0,>=0.11.0 (from datasets)\n"," Downloading huggingface_hub-0.14.1-py3-none-any.whl (224 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.5/224.5 kB\u001b[0m \u001b[31m21.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from datasets) (23.1)\n","Collecting responses<0.19 (from datasets)\n"," Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (6.0)\n","Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (23.1.0)\n","Requirement already satisfied: charset-normalizer<4.0,>=2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (2.0.12)\n","Collecting multidict<7.0,>=4.5 (from aiohttp->datasets)\n"," Downloading multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.5/114.5 kB\u001b[0m \u001b[31m11.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting async-timeout<5.0,>=4.0.0a3 (from aiohttp->datasets)\n"," Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n","Collecting yarl<2.0,>=1.0 (from aiohttp->datasets)\n"," Downloading yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (268 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m268.8/268.8 kB\u001b[0m \u001b[31m22.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting frozenlist>=1.1.1 (from aiohttp->datasets)\n"," Downloading frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (149 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m149.6/149.6 kB\u001b[0m \u001b[31m15.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hCollecting aiosignal>=1.1.2 (from aiohttp->datasets)\n"," Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (3.12.0)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0.0,>=0.11.0->datasets) (4.5.0)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (1.26.15)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (2022.12.7)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->datasets) (3.4)\n","Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2.8.2)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2022.7.1)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas->datasets) (1.16.0)\n","Installing collected packages: xxhash, multidict, frozenlist, dill, async-timeout, yarl, responses, multiprocess, huggingface-hub, aiosignal, aiohttp, datasets\n","Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 datasets-2.12.0 dill-0.3.6 frozenlist-1.3.3 huggingface-hub-0.14.1 multidict-6.0.4 multiprocess-0.70.14 responses-0.18.0 xxhash-3.2.0 yarl-1.9.2\n"]}],"source":["!pip install datasets"]},{"cell_type":"code","source":["from datasets import load_dataset\n","\n","data = load_dataset(\"thaisum\")"],"metadata":{"id":"XnjYXz-5xdb_","colab":{"base_uri":"https://localhost:8080/","height":232,"referenced_widgets":["e8389aeb5bbd496cb216ceed0cb5fda4","955b43105dba4b25a0727dcd5c6443ff","ea0afd28843f40968c70058647f2673e","59d73e0411d34c41826319af50863d0c","e1b7f04e685946ba96b531301f8a2661","f2794f69efeb43b693f0fd7b1d4640dc","8c674f18591c43c5932ec6bd96f791e5","70b20e86e1194884978c487af28a5cc4","51323ad3279d4c8794751f5a60c7037d","acb5107b59844eb8b05674a5ed0147e8","027f230233974ba083f6ff948ee69e26","979c946ce5434cea9fc8a80552614b2e","8d11d0029d2345a8bf742da2c5c1f87b","3eac55675cc74c5d978239e0363d8a29","7a44270fe41e4b15a3703ef1136dcb31","83957fbb5d98458bbbda8e1eb0860f49","8c4888da2f164b269e0c2045f387e4b3","8fbf385a6c4a4103892bce80270f060e","c3eafcaa28a54914ac73d96676f49a81","9d536ea69c014d179bbcc702d1c77eab","5faf4eefc40b4be78e9dbf514147c326","ddb87e26800b4afa973dbaf1c3998f01","28eaa0620dbe4d5dad53a5cb66a8c025","237bd6ed0bcb405281fda0c5ffe3e250","b29d86de7da247b8ad9f5c514a662b8f","24ec4a2ba7bb4d10aa458bc397943d65","5207afe70d9a45b4a09158a994fc1dd8","7325a59844ca4e809bd87d2d5908601c","2a825c577f8b436c97340bbeb93e1330","fd3b275ccd044e389ce6a5b40410e922","ea18873a81724da4bf1e4eb356a9dd8f","cd952e8d5d7d41659ac1045f69d20952","19ba53d746c84fd085ceaadf24d1bb0f","6148cd4ff444416ca22ec3a7f59a949b","f353984353544cd88ff2116ab57d4b7a","b4fd5bc259a84acca0f0f329a4a492cb","2b42f0742dc144e38c9ae81e27b6a601","8b655ff5bd734594a4f3cba8c318a3f1","7f2ee0ae6b5d4d7db1a602fb3622796e","b7c385ecd7fb4da380628f15f683f281","ddb9e7249142457c8497e5f344ddfce3","ba89e5522efa476ab97fbd9eb1a53339","2d085a93bb834de5a479273a833a8331","4cc8647f80f74be9a3b3b9467ca386e9","22daa34fc93b407da4eb2393a3c1d9cf","3c392f262278463cb18a2370322dcab3","72a98963a27d491bb44c59dad25b84a8","10b3562b11df456983034d9f06ded6e1","2ba5a1a3a920413e844f4bf48e8dac19","89123d8ad6a64cf7b960cb981b381521","793e55dd1f3844abbc297223bac995d3","a14d14bb6c814c0e8fd3bff1ac0100ba","e4c2a79021384532ad365c2cc78df36a","cd5d2f08b3c74210a73c69950fc1782e","f6f6e65c60084c7f8477b4ce020e4644","c8c70105270b4d66a558098838c597e1","146c106678b24983993dc25f8edff23c","bf118fda03164222a6a344e40f0ecb7f","068b6ab25581434eac68bfcf59a2f132","32589164874f4ff99e659c485bab6e0c","eb7e6377167d424382fbcdc8834096de","1fb8802454c14f498536a85e6316413d","f5301933a4734948a4719a1e7af03eb4","cbba8ed30e0f46e4a4e7d5b0f39f955c","c3cb1a386a0d4000bd2d12cd84608fcf","4bd15b611bef4c958ea71879fa0f6457","6dcadae696ae46b885329ba8ed3131a5","70a0921dbfbb463aa2098c8863473695","23453818e49c4d7193e7e8e17c937f47","6ddce5bf86634c6ba9cc745a63f30c30","60b1da72c3834d519f1d1060e6f1ae92","8d91380fc5bc4645a715001206576795","9083a507e7134eda8c0572d9a53f0262","951f67947081434faccc6b3782b6ef2f","bbe002fcfdb243d99e1897b7a36ce93c","c811bef6759149369c7931955af7b3eb","a3f2594a45b6438aa49f6f32e5a8cd3d","e8efc9e6463d40a188f5923b34ef8413","8f573268f2f4465a96d387723f3e7ad9","2f1d52adf6f94f17b7f871b9afd406b5","069556ab254844cdb9d78831f9e02a53","e292ae2332ab4c8ab8cc7fb4400e6f84","05a2146c27b141cc830922963e2047c1","8b98b85ecffa4432bf930259b1605fdd","888e50ef500842368f51893b94219962","fa0a53c1e4614790957bc2f0115c8c58","2407584d97f8444aaefca87db4652b3b","273d1d3285bc45cab516eaf90f5c9777"]},"executionInfo":{"status":"ok","timestamp":1684575485853,"user_tz":-420,"elapsed":196514,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"2e66027e-3520-4a3a-924d-793639bac0f8"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":["Downloading builder script: 0%| | 0.00/3.41k [00:00=2.22.0 in /usr/local/lib/python3.10/dist-packages (from pythainlp) (2.27.1)\n","Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (1.26.15)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2022.12.7)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (2.0.12)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.22.0->pythainlp) (3.4)\n","Installing collected packages: pythainlp\n","Successfully installed pythainlp-4.0.1\n"]}]},{"cell_type":"code","source":["from pythainlp.tokenize import word_tokenize\n","from tqdm import tqdm\n","tqdm.pandas()\n","\n","train_[\"tokenized_text\"] = train_[\"text\"].progress_apply(lambda x : \" \".join(word_tokenize(x)))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"5mb3oYHCyCbc","executionInfo":{"status":"ok","timestamp":1684575737358,"user_tz":-420,"elapsed":77021,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"6307e583-183a-4768-bf17-cdd800a6dbf5"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["100%|██████████| 3972/3972 [01:09<00:00, 56.90it/s] \n"]}]},{"cell_type":"code","source":["from sklearn.model_selection import train_test_split\n","X_train, X_test, y_train, y_test = train_test_split(train_[\"tokenized_text\"], train_[\"labels\"], test_size=0.2, random_state=42,stratify=train_[\"labels\"])\n"],"metadata":{"id":"bKBKF3pPcLYO"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["from sklearn.feature_extraction.text import TfidfVectorizer\n","from sklearn.linear_model import LogisticRegression\n","from sklearn.metrics import classification_report,confusion_matrix\n","import seaborn as sns\n","import matplotlib.pyplot as plt\n","\n","vectorizer = TfidfVectorizer()\n","X_train_tfidf = vectorizer.fit_transform(X_train)\n","\n","\n","clf = LogisticRegression()\n","clf.fit(X_train_tfidf, y_train)\n","\n","X_test_tfidf = vectorizer.transform(X_test)\n","\n","train_pred = clf.predict(X_train_tfidf)\n","test_pred = clf.predict(X_test_tfidf)\n","\n","\n","print(classification_report(y_train,train_pred))\n","\n","def plot_confusion_matrix(labels,pred):\n"," cm = confusion_matrix(labels,pred)\n","\n"," sns.heatmap(cm, annot=True, cmap=\"Blues\", fmt='g', )\n","\n"," # Set axis labels\n"," plt.xlabel('Predicted labels')\n"," plt.ylabel('True labels')\n"," plt.title('Confusion Matrix')\n","\n"," def annotate():\n"," annotations = [\"True Negative\",\"False Positive\",\"False Negative\",\"True Positive\"] \n"," annot_idx = 0\n"," for i in range(cm.shape[0]):\n"," for j in range(cm.shape[1]):\n"," plt.text(j+0.5, i+0.35, annotations[annot_idx],\n"," ha=\"center\", va=\"center\",\n"," color=\"white\" if (i+j)%2==0 else \"black\")\n"," annot_idx+=1\n"," annotate()\n"," plt.show()\n","\n","plot_confusion_matrix(y_train,train_pred)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":628},"id":"ATXtzPlMVL9B","executionInfo":{"status":"ok","timestamp":1684575746394,"user_tz":-420,"elapsed":7460,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b257398d-6a88-471e-8f15-75687695281d"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":[" precision recall f1-score support\n","\n"," 0 0.99 0.95 0.97 1577\n"," 1 0.96 0.99 0.97 1600\n","\n"," accuracy 0.97 3177\n"," macro avg 0.97 0.97 0.97 3177\n","weighted avg 0.97 0.97 0.97 3177\n","\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAiQAAAHHCAYAAACPy0PBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABkUklEQVR4nO3dd1gUVxcG8HeXLlJVQJRixQ62EFRAI4JYsaMYsUcD9kqiCDYidmxYoqjBqCnW2FBULMSCYkUURbGBBRFBqTvfH3xusoIu6K6L5P3lmefJ3rl758wmyuHce2dFgiAIICIiIlIhsaoDICIiImJCQkRERCrHhISIiIhUjgkJERERqRwTEiIiIlI5JiRERESkckxIiIiISOWYkBAREZHKMSEhIiIilWNCQqREt27dgqurKwwMDCASibBz506Fjn/37l2IRCKEhYUpdNwvWevWrdG6dWtVh0FEJcSEhMq827dv47vvvkP16tWhra0NfX19tGzZEkuXLsWbN2+Uem1vb29cuXIFc+bMwebNm9GsWTOlXu9zGjhwIEQiEfT19Yv8HG/dugWRSASRSIQFCxaUePxHjx4hICAAsbGxCoiWiEo7dVUHQKRMf/31F3r16gUtLS0MGDAADRo0QE5ODk6ePIlJkybh2rVrWLNmjVKu/ebNG0RHR+PHH3+Er6+vUq5hZWWFN2/eQENDQynjy6Ouro7Xr19jz5496N27t8y58PBwaGtrIysr66PGfvToEQIDA2FtbQ07O7tiv+/QoUMfdT0iUi0mJFRmJSYmwtPTE1ZWVoiMjETlypWl53x8fJCQkIC//vpLadd/+vQpAMDQ0FBp1xCJRNDW1lba+PJoaWmhZcuW+PXXXwslJFu2bEHHjh3xxx9/fJZYXr9+jXLlykFTU/OzXI+IFItTNlRmBQcHIyMjAz///LNMMvJWzZo1MWbMGOnrvLw8zJo1CzVq1ICWlhasra3xww8/IDs7W+Z91tbW6NSpE06ePImvvvoK2traqF69OjZt2iTtExAQACsrKwDApEmTIBKJYG1tDaBgquPtv/9bQEAARCKRTFtERARatWoFQ0NDlC9fHjY2Nvjhhx+k59+3hiQyMhKOjo7Q1dWFoaEhunbtiri4uCKvl5CQgIEDB8LQ0BAGBgYYNGgQXr9+/f4P9h39+vXD/v37kZaWJm07d+4cbt26hX79+hXqn5qaiokTJ6Jhw4YoX7489PX14e7ujkuXLkn7HDt2DM2bNwcADBo0SDr18/Y+W7dujQYNGiAmJgZOTk4oV66c9HN5dw2Jt7c3tLW1C92/m5sbjIyM8OjRo2LfKxEpDxMSKrP27NmD6tWro0WLFsXqP3ToUPj7+6NJkyZYvHgxnJ2dERQUBE9Pz0J9ExIS0LNnT7Rr1w4LFy6EkZERBg4ciGvXrgEAunfvjsWLFwMA+vbti82bN2PJkiUliv/atWvo1KkTsrOzMXPmTCxcuBBdunTBqVOnPvi+w4cPw83NDU+ePEFAQADGjx+P06dPo2XLlrh7926h/r1798arV68QFBSE3r17IywsDIGBgcWOs3v37hCJRPjzzz+lbVu2bEGdOnXQpEmTQv3v3LmDnTt3olOnTli0aBEmTZqEK1euwNnZWZoc1K1bFzNnzgQADB8+HJs3b8bmzZvh5OQkHef58+dwd3eHnZ0dlixZgjZt2hQZ39KlS1GpUiV4e3sjPz8fALB69WocOnQIy5Ytg7m5ebHvlYiUSCAqg16+fCkAELp27Vqs/rGxsQIAYejQoTLtEydOFAAIkZGR0jYrKysBgBAVFSVte/LkiaClpSVMmDBB2paYmCgAEObPny8zpre3t2BlZVUohhkzZgj//iO5ePFiAYDw9OnT98b99hobNmyQttnZ2QkmJibC8+fPpW2XLl0SxGKxMGDAgELXGzx4sMyY3bp1EypUqPDea/77PnR1dQVBEISePXsKbdu2FQRBEPLz8wUzMzMhMDCwyM8gKytLyM/PL3QfWlpawsyZM6Vt586dK3Rvbzk7OwsAhNDQ0CLPOTs7y7QdPHhQACDMnj1buHPnjlC+fHnBw8ND7j0S0efDCgmVSenp6QAAPT29YvXft28fAGD8+PEy7RMmTACAQmtN6tWrB0dHR+nrSpUqwcbGBnfu3PnomN/1du3Jrl27IJFIivWex48fIzY2FgMHDoSxsbG0vVGjRmjXrp30Pv9txIgRMq8dHR3x/Plz6WdYHP369cOxY8eQnJyMyMhIJCcnFzldAxSsOxGLC/7qyc/Px/Pnz6XTURcuXCj2NbW0tDBo0KBi9XV1dcV3332HmTNnonv37tDW1sbq1auLfS0iUj4mJFQm6evrAwBevXpVrP737t2DWCxGzZo1ZdrNzMxgaGiIe/fuybRbWloWGsPIyAgvXrz4yIgL69OnD1q2bImhQ4fC1NQUnp6e2L59+weTk7dx2tjYFDpXt25dPHv2DJmZmTLt796LkZERAJToXjp06AA9PT1s27YN4eHhaN68eaHP8i2JRILFixejVq1a0NLSQsWKFVGpUiVcvnwZL1++LPY1q1SpUqIFrAsWLICxsTFiY2MREhICExOTYr+XiJSPCQmVSfr6+jA3N8fVq1dL9L53F5W+j5qaWpHtgiB89DXerm94S0dHB1FRUTh8+DC+/fZbXL58GX369EG7du0K9f0Un3Ivb2lpaaF79+7YuHEjduzY8d7qCADMnTsX48ePh5OTE3755RccPHgQERERqF+/frErQUDB51MSFy9exJMnTwAAV65cKdF7iUj5mJBQmdWpUyfcvn0b0dHRcvtaWVlBIpHg1q1bMu0pKSlIS0uT7phRBCMjI5kdKW+9W4UBALFYjLZt22LRokW4fv065syZg8jISBw9erTIsd/GGR8fX+jcjRs3ULFiRejq6n7aDbxHv379cPHiRbx69arIhcBv/f7772jTpg1+/vlneHp6wtXVFS4uLoU+k+Imh8WRmZmJQYMGoV69ehg+fDiCg4Nx7tw5hY1PRJ+OCQmVWZMnT4auri6GDh2KlJSUQudv376NpUuXAiiYcgBQaCfMokWLAAAdO3ZUWFw1atTAy5cvcfnyZWnb48ePsWPHDpl+qamphd779gFh725Ffqty5cqws7PDxo0bZX7AX716FYcOHZLepzK0adMGs2bNwvLly2FmZvbefmpqaoWqL7/99hsePnwo0/Y2cSoqeSupKVOmICkpCRs3bsSiRYtgbW0Nb2/v936ORPT58cFoVGbVqFEDW7ZsQZ8+fVC3bl2ZJ7WePn0av/32GwYOHAgAsLW1hbe3N9asWYO0tDQ4Ozvj7Nmz2LhxIzw8PN67pfRjeHp6YsqUKejWrRtGjx6N169fY9WqVahdu7bMos6ZM2ciKioKHTt2hJWVFZ48eYKVK1eiatWqaNWq1XvHnz9/Ptzd3eHg4IAhQ4bgzZs3WLZsGQwMDBAQEKCw+3iXWCzGtGnT5Pbr1KkTZs6ciUGDBqFFixa4cuUKwsPDUb16dZl+NWrUgKGhIUJDQ6GnpwddXV3Y29ujWrVqJYorMjISK1euxIwZM6TbkDds2IDWrVtj+vTpCA4OLtF4RKQkKt7lQ6R0N2/eFIYNGyZYW1sLmpqagp6entCyZUth2bJlQlZWlrRfbm6uEBgYKFSrVk3Q0NAQLCwsBD8/P5k+glCw7bdjx46FrvPudtP3bfsVBEE4dOiQ0KBBA0FTU1OwsbERfvnll0Lbfo8cOSJ07dpVMDc3FzQ1NQVzc3Ohb9++ws2bNwtd492tsYcPHxZatmwp6OjoCPr6+kLnzp2F69evy/R5e713txVv2LBBACAkJia+9zMVBNltv+/zvm2/EyZMECpXrizo6OgILVu2FKKjo4vcrrtr1y6hXr16grq6usx9Ojs7C/Xr1y/ymv8eJz09XbCyshKaNGki5ObmyvQbN26cIBaLhejo6A/eAxF9HiJBKMHKNSIiIiIl4BoSIiIiUjkmJERERKRyTEiIiIhI5ZiQEBERkcoxISEiIiKVY0JCREREKseEhIiIiFSuTD6pVccpQNUhEJVKyQf9VR0CUaljoKP83811GvsqZJw3F5crZJzSiBUSIiIiUrkyWSEhIiIqVUT8/V8eJiRERETKJhKpOoJSjwkJERGRsrFCIhc/ISIiIlI5VkiIiIiUjVM2cjEhISIiUjZO2cjFT4iIiIhUjhUSIiIiZeOUjVxMSIiIiJSNUzZy8RMiIiIilWOFhIiISNk4ZSMXExIiIiJl45SNXPyEiIiISOVYISEiIlI2TtnIxYSEiIhI2ThlIxcTEiIiImVjhUQupmxERESkcqyQEBERKRunbORiQkJERKRsTEjk4idEREREKscKCRERkbKJuahVHiYkREREysYpG7n4CREREZHKsUJCRESkbHwOiVxMSIiIiJSNUzZy8RMiIiIilWOFhIiISNk4ZSMXExIiIiJl45SNXExIiIiIlI0VErmYshEREZHKsUJCRESkbJyykYsJCRERkbJxykYupmxERESkcqyQEBERKRunbORiQkJERKRsnLKRiykbERERqRwrJERERMrGKRu5mJAQEREpGxMSufgJERERlVFRUVHo3LkzzM3NIRKJsHPnzvf2HTFiBEQiEZYsWSLTnpqaCi8vL+jr68PQ0BBDhgxBRkaGTJ/Lly/D0dER2trasLCwQHBwcIljZUJCRESkbCKRYo4SyszMhK2tLVasWPHBfjt27MDff/8Nc3PzQue8vLxw7do1REREYO/evYiKisLw4cOl59PT0+Hq6gorKyvExMRg/vz5CAgIwJo1a0oUK6dsiIiIlE1FUzbu7u5wd3f/YJ+HDx9i1KhROHjwIDp27ChzLi4uDgcOHMC5c+fQrFkzAMCyZcvQoUMHLFiwAObm5ggPD0dOTg7Wr18PTU1N1K9fH7GxsVi0aJFM4iIPKyRERETKpqAKSXZ2NtLT02WO7Ozsjw5LIpHg22+/xaRJk1C/fv1C56Ojo2FoaChNRgDAxcUFYrEYZ86ckfZxcnKCpqamtI+bmxvi4+Px4sWLYsfChISIiOgLERQUBAMDA5kjKCjoo8ebN28e1NXVMXr06CLPJycnw8TERKZNXV0dxsbGSE5OlvYxNTWV6fP29ds+xcEpGyIiImVT0JSNn58fxo8fL9OmpaX1UWPFxMRg6dKluHDhAkSl4MFtrJAQEREpm4KmbLS0tKCvry9zfGxCcuLECTx58gSWlpZQV1eHuro67t27hwkTJsDa2hoAYGZmhidPnsi8Ly8vD6mpqTAzM5P2SUlJkenz9vXbPsXBhISIiOg/6Ntvv8Xly5cRGxsrPczNzTFp0iQcPHgQAODg4IC0tDTExMRI3xcZGQmJRAJ7e3tpn6ioKOTm5kr7REREwMbGBkZGRsWOh1M2RERESqaqKZGMjAwkJCRIXycmJiI2NhbGxsawtLREhQoVZPpraGjAzMwMNjY2AIC6deuiffv2GDZsGEJDQ5GbmwtfX194enpKtwj369cPgYGBGDJkCKZMmYKrV69i6dKlWLx4cYliZUJCRESkZKpKSM6fP482bdpIX79df+Lt7Y2wsLBijREeHg5fX1+0bdsWYrEYPXr0QEhIiPS8gYEBDh06BB8fHzRt2hQVK1aEv79/ibb8AoBIEAShRO/4Aug4Bag6BKJSKfmgv6pDICp1DHSUv3pBt+cGhYyT+fsghYxTGrFCQkREpGyq38RS6jEhISIiUrLSsK22tOMuGyIiIlI5VkiIiIiUjBUS+ZiQEBERKRkTEvmYkBARESkZExL5uIaEiIiIVI4JCZU5b6IC0LlVHVWHQV+I8M1hsKxsrOowPpphOTXs3b3zg31GDh+Efr27fZ6AqGgiBR1lGKdsSrk3UQEfPD97wzHM2XDsc4SCg0sHwqmxNQYE/I7fIq9K2317fQ3fnl+jTp8lnyWOt34c1BqdW9XB10NCZdqtPRbgxas3nzUWUq2Rwwfh1182FWq/cCUe1WvUVEFE/wjfHAaf74YAKCjbV65sjtbfuCBw9k+o9M7Xun+M+DsPYfj/7wu5d+8ubOvWQFR0DBrZ2kn7/DR/CcrgMzC/KJyykY8JSSln7bFA+u89v6mP6YPbwLb/cmlbxpscmf5qamLk50uUFs+b7FzMGPoNdhy/jjwlXudTpKRmqDoEUgGXdm5YsXq9TFvFSpVUFI0sfX19nIuNg0QiwdUrl+Dz3RAkJz/Cn7sPfPLYpsX4NlUDA4NPvg6RsnHKppRLSc2QHi8zsiEI/7TVtqyIZwd/gKt9TZxaOxwvj0xHi4aWWOPnge1zPGXGmT+qPQ4uHSh9LRKJMNGrFeK2jUFqxI84s34EujnXkxvP9sNXYVBeG4M7N/1gv06tbHB63Xd4ETEN17eOwQ8DnaGm9s//brUtK+LI8sF4ETENFzb5oE3T6oWmWmaPcMHl8FF4fuhHXN86Bv5D2kD9/2P0b2+HaYNaw7aWGd5EBeBNVAD6t7cDIDtlc3TlEMwe4SITW0WDckiPnI6WtlYAAE0NNQR974rbf4zHs4M/ICp0KBztrOV+FlS6aGppwdTMTOZQU1PD8pDFaNHcFuYV9VC/lhUmjPFBRsb7k9Yrly+hU/u2qGpiAAtTQzi3aI6LMeel56NPn4S7izPMjHVRv5YVJk8Yg8zMzA8HJxLB1MwMlc3N0c7NHd99PwrHIo/gzZs3kEgkmDd3FurVtISJoQ5a2TfB4UP/JCo5OTmYNG4UbKpVgalROTSwqYZF83+Snv/3lI1t3RoAACeHpjAsp4aObt8AkJ2yCft5DepUrwqJRPYXir69PKSVHAD4a88uODk0g6lROdjWq4mf5sxEXl7eh++T3kskEinkKMtYISkDZn3nAr+Vh5D46AXSXmUV6z2T+rdCX9dGGLVgLxIepKKVrRXWT+uOp2mZOHnp3nvf9+p1NoI3R8HP2xm/HIjF66zcQn1aNrLEuh+6YULIfpy6lITqVYywYlJnAMDcsOMQi0XYPscT95+8hNOItdArp4WffFyLuFYOhgftxKNnr9CguglWTOqCjNc5WPTrKfweeRX1q5ug3Vc10XF8Qan+ZUbhe98acRnj+7bEtNDD0raebRvg8bNXOPX/+1w8tgPqWlfCgMDf8ejZK3R1qovd8/uj2aCVuP0gtVifJ5VeYrEYPy1YAivraribeAcTx/pixo9TsHDpiiL7Dx/8LRra2mHR0hVQU1PDlcuxUNfQAAAk3rmNnl074McZs7A8dB2ePXuKSeNGY9K4UVi5Zn2R4xVFW0cHEokEeXl5WL9uNVaELMLiZavQyLYxftm0AX17eeDvmCuoUbMWVq9chv1/7cGGX7aiqoUlHj64j4cP7hc5bmTU3/jG6Wvs+usQ6tStD01NzUJ9PLr3wuQJY3Di+FE4t2kLAHiRmoojEQfx2469AIDTp05g5LCB+GnBErRo6YjEO7cxxncEAGDqj/w+pI9R1pMJRWCFpAyYtf4oIs/fQeKjF8VaO6GpoYbJ/R0x4qddOHzuNu4+foFfDsTi14jLGNqlmdz3r955Dtk5eRjd26HI8z8MbI0F4ScRfuAS7j5+gcjzdxC47qh07LbNaqB6FSMMnbMDV26n4PSVJMxYG1lonHmbovD31ftISk7DvtM3sXTbaXRvUx8AkJWTh4w3OcjLl0grRlk5hX97+yPyGipX1EPLRpbStj4uDbH9SMEaGAsTAwxwbwwv/99w6nISEh+9wJKtp3H6ShIGuDeW+1lQ6XFw/1+oUklfenh79QYAfO87Bk7ObWBlZQ3n1t9g2oyZ2PHnb+8d58H9JLRu0xa1beqgRs1a8OjeCw0b2QIAFs3/Cb369MP3vmNQo2Yt2H/dAvMWLsHWLZuRlVW8XwZuJ9zChnWr0bhJM+jp6WH5koUYM34yevTyRK3aNgic/RMaNrLDquVLAQD37yehes1acGjRCpaWVnBo0Qo9e/ctcuwK/5+iMjKuAFMzMxgZF16sa2hkBBfX9vht26/Stl07fkeFChXh6FzwrbDz5s7C2AlT0K+/N6yrVUebtu3wo38gwn5eU6x7JPoYrJCUARduPCpR/xpVjKGro4m9CwfItGtqqOHSrcdy35+Tm4+Z649i0Rh3rN11vtD5hjVN4dDQAlO+dZK2qamJoKOlAR0tDdS2rIAHT9Jl1nqcj3tYaJye39TH9z3sUc3cGOV1NKGuJkb66+yS3CqevXyNw+duo0+7Rjh1OQlWlQ3xdQML+C7YAwCoX90E6upiXA4fJfM+LU01pKa/LtG1SLUcnVtj0dKV0tflyukCAI5FHsaiBfNwK/4GXr1KR15eHrKysvD69WuUK1eu0DjfjxqH0d8Px7Zfw9G6TVt4dO+JatULpkKuXrmMa1cv47dtW6T9BUGARCLBvbuJsKlTt8jY0l++RJVK+pBIJMjKysLXLVph2co1SE9Px+PHj2Dv0EKmv71DC1y9chkA0K+/N7p1dkMz27po284N7d074huXwhXFkujt2Q+jfb7DwqUroKWlhe3bfkX3Xn0gFov/f5+XcCb6FBYGz5W+Jz8//4OfG30YKyTyMSEpAzLfmTaRSIRC28PU1f8phpXXKSjjdpsSjkfPXsn0y8kt3hzxr4cuY6xnC0wd4IR7yWky58rraGL2+mPYGRVX6H1FVTGKYl+/KjZM64FZG47i8NnbeJmZhV7fNMCYPi3kv/kd2yKuYMFod4xfsg99XBriyu0UXLvzpCDWcprIy5OgxbDVyJfI7kLIfGfBMJVu5crpFtpRc+/eXfTp0QWDh43A9IBZMDIyRvTpkxg1chhycnKK/MHqN20GevXpi4MH9uHwof0Imh2AnzduQeeu3ZCZmYGBQ4ZjxPejCr2vqoVloba39PT0cPz0eYjFYpiaVYaOjg4AID09Xe592TVugkvXb+Pwof04FnkEA7/1ROs2bbFpy/urPPK079AZEIbj4P6/0KRZc0SfOoG58xZKz2dmZMBvWgA6dy28VVhbW/ujr/ufxnxELiYkZdCzl5moX112O6FtTTPk5hUsYou7+xRZ2XmwMDX44HqRDxEEAf6rD2Pr7D6FqiSxNx+jlmUF3HlY9PqLm0nPUdVEHyZGunjyomAxYNM65jJ9vm5ggaSUNARvPiFtszQzlOmTk5sPNTX5f8r3nLyB5RM7w9W+Jvq4NMSWg5f+FWsy1NXFMDHSxanLSXLHoi9L7MUYSCQSzPlpgfS3/x1/yP9BXrNWbdSsVRs+o8ZiiHc/hG8OQ+eu3WBr1xjxN+JKvJVYJBYX+R59fX1UrmyOM9Gn0crRWdp+Jvo0mjZrLtOve88+6N6zD7p264EeXTvgRWpqoSkZTY2CXzYk+fkfjEdbWxudunTDb9u2IPHObdSqbQO7xk2k523tmuDWTdVvmab/FiYkZdCxmESM82yJfm62OHPtPvq2a4R61Uxw6VYygIKtwku2nUawb3uIxSKcvpwEg/LacGhggfTX2Qg/cEnOFQoc+PsWzsU9xJAuTfEk9Z9dBnPDjuPPef1wP+Uldhy7DokgoFENM9SrboLAdZE4cv427jx8gbU/dMOPqyKgV04TAUMLdgMIKKhSJDxIhYWpAXp90wDnbzyEu0NtdHGUfdhZUnIarM2M0KimGR4+Tcer19nIyS38F/HrrFzsOXkD/kO+QR2rSth++J9nqCQ8eI5fD13Guh+7YeqKQ4i99RiVDHXRukk1XL2dggN/3yrZh0+lSvXqNZGbm4vVq5bDvUMn/B19ChvWrX5v/zdv3sD/h8no0q0HrKyr4dHDB7gQcx5dPLoDAMaMn4x2rVtg0rhR+HbgEOjq6uJG3HUcizyM+YuXfVSMo8ZNxE+zA1CtenU0bGSH8M1huHI5Fms3bAYALA9ZDDMzMzSybQyxWIydf/4OU1MzGBgaFhqrkokJdHR0cDjiIMyrVIWWtvZ7t/z29uyHPj264EbcdfT29JI5N9lvGvr06IKqFpbo2q0HxGIxrl65hLhr1zAtYNZH3ed/Hads5OOi1jLo8LnbCNp4HHNGtMPJ1cOhV05LpioAAIHrIvHTpuOY5OWI2M2+2DW/P9o71Mbdx2kluta00AjoaGkUun73KVvg0rwGTq4ZjuOrhmJU76+R9P+pHYlEQO8ft6K8jiZOrhmGlVO6YN7/KyFZ2QVTOn+disey7X9j0dgOOLN+BL5uYIGfNkXJXGfH8euIOJuAA0u98WDPZPRu2/C9cW6NuAzbWmY4dfke7j95KXNueNBOhB+4hJ98XHH5l1HYPscTzepWKdSPvjwNG9lizryFWLowGA7NGuG3rVvgP3POe/urqakhNfU5Rg4diGaN6mBQf0+4uLaH37QAAECDho3w18GjSEi4iQ7tnOHk0BRzZwfArLL5e8eUZ8T3o/D9qHGYNnUSWjS3xeFDB/HrbztRo2YtAIBe+fJYumgB2rT6Ct842iMp6R6279grrfj8m7q6OuYtWFKwtbdG1Q8+ndWp9TcwMjLGrZvx6NVHdpFs23Zu2PbHbhw9EoFvHO3RrnULrFy2FBaW75+Wog/jtl/5REIZfHyfjlOAqkOgEnJoYIHIlUNQz3MpEh+9UHU4ZVbyQW7ZJHqXgY7yfzc3GbxdIeM8Wd9bIeOURpyyIZXo4lgHGW9ykPAgFTWqGGPB6PY4/f9tt0RE9N/DhIRUonw5Lcwe0Q4WJgZ4/vI1ImPuYOqKg6oOi4hIOcr2bItCMCEhldhy8FKhdS1ERGVVWV//oQhc1EpEREQqxwoJERGRkrFCIh8TEiIiIiVjQiIfp2yIiIhI5VghISIiUjJWSORjQkJERKRszEfk4pQNERERqRwrJERERErGKRv5mJAQEREpGRMS+ZiQEBERKRkTEvm4hoSIiIhUjhUSIiIiZWOBRC4mJERERErGKRv5OGVDREREKseEhD6opa0Vfg/qizt/TsCbqAB0blVH5vwaPw+8iQqQOXbN7y/Tx0hPBxumd0fKfj88/msqVk3pAl0dzSKvV72KMZ4cKOhH9CXr6t4WX9nVLXQEz50JAAiaNQPdOrnC0d4Orm1aYOJYH9xNvKPiqElZRCKRQo6SioqKQufOnWFubg6RSISdO3dKz+Xm5mLKlClo2LAhdHV1YW5ujgEDBuDRo0cyY6SmpsLLywv6+vowNDTEkCFDkJGRIdPn8uXLcHR0hLa2NiwsLBAcHFziWDllQx+kq62BK7dTsGnfRWyb41lkn4N/38J3P+2Svs7OyZM5v2F6d5hV0EOn8Zugoa6G1X5dsWJiZwyc9YdMP3U1MTb598Cpy0n4ur6F4m+G6DMKC/8N+ZJ86es7CbfgO2II2rZrDwCoU7c+3Dp0gpmZOdLT07A2dAVGjRyKnX9FQE1NTVVhk5KoasomMzMTtra2GDx4MLp37y5z7vXr17hw4QKmT58OW1tbvHjxAmPGjEGXLl1w/vx5aT8vLy88fvwYERERyM3NxaBBgzB8+HBs2bIFAJCeng5XV1e4uLggNDQUV65cweDBg2FoaIjhw4cXO1YmJPRBh84k4NCZhA/2ycnNR0pqRpHnbKwqwu3rWmg5bA0uxBdk3eOX7MfOYC/4rTyEx89fSfsGDPsG8UnPcDQmkQkJffGMjI1lXm9avxZVLSzRpFlzAEC3nr2l58yrVMEInzHw6u2Bx48eoqqF5WeNlcoud3d3uLu7F3nOwMAAERERMm3Lly/HV199haSkJFhaWiIuLg4HDhzAuXPn0KxZMwDAsmXL0KFDByxYsADm5uYIDw9HTk4O1q9fD01NTdSvXx+xsbFYtGhRiRISlU7ZPHv2DMHBwejWrRscHBzg4OCAbt26Yf78+Xj69KkqQ6MScLSzxr1dk3DpF18sHd8Rxvo60nP29S3w4tUbaTICAJExdyCRCGher4q0zblJNXRvXR9jF+/7rLETfQ65uTnYv28POnftXuRvym/evMaeXX/CvEpVmJqZqSBCUjZFTdlkZ2cjPT1d5sjOzlZYnC9fvoRIJIKhoSEAIDo6GoaGhtJkBABcXFwgFotx5swZaR8nJydoav4zFe/m5ob4+Hi8ePGi2NdWWUJy7tw51K5dGyEhITAwMICTkxOcnJxgYGCAkJAQ1KlTR6ZkRKVTxJkEDJ27Ax3GbcS00MNwtLPGrvn9IRYX/KVralweT19kyrwnP1+C1FdvYGpcHgBgrK+DtX4eGBa0E69eK+4PFlFpcSzyCDJevUKnLt1k2n/ftgXODk3h7NAU0adOYHnoz9DQKHp9FX3hRIo5goKCYGBgIHMEBQUpJMSsrCxMmTIFffv2hb6+PgAgOTkZJiYmMv3U1dVhbGyM5ORkaR9TU1OZPm9fv+1THCqbshk1ahR69eqF0NDQQr8xCIKAESNGYNSoUYiOjv7gONnZ2YWyQ0GSB5GYs1Gfw2+RV6X/fu3OE1y5nYK4bWPgZGeNYxcSizXGysldsO3wFZy6dE9ZYRKp1O6df8ChpSMqvfMXe/sOnfHV1y3w7NlThG/agB8mj8PasC3Q0tJSUaRU2vn5+WH8+PEybYr4/yU3Nxe9e/eGIAhYtWrVJ4/3MVT2U/vSpUsICwsrsnwpEokwbtw4NG7cWO44QUFBCAwMlGlTs3SGhlVrRYVKJXD38Qs8TctEjarGOHYhESmpGahkpCvTR01NDGM9Hem6E+fG1dCxhQ3G9mkBABCJCvq8ivSHz4I92LTv4me/DyJFefzoIc6dica8hSGFzpXX00N5PT1YWlmjYSNbtHX8GsciD8PNvaMKIiVlUtSiVi0tLYUnrG+TkXv37iEyMlJaHQEAMzMzPHnyRKZ/Xl4eUlNTYfb/6UUzMzOkpKTI9Hn72qwEU5Aqm7IxMzPD2bNn33v+7NmzhUpARfHz88PLly9lDnWLVooMlUqgSiV9VNAvh+TnBcnGmWv3YaSng8a1K0v7tG5SDWKxCOeuPyx4/f062A8JlR4z1x9FemY27IeEYndUnErug0hR9uzaASNjY7R0dP5gP0EABAjIzcn5TJHR56Sqbb/yvE1Gbt26hcOHD6NChQoy5x0cHJCWloaYmBhpW2RkJCQSCezt7aV9oqKikJubK+0TEREBGxsbGBkZFTsWlVVIJk6ciOHDhyMmJgZt27aVJh8pKSk4cuQI1q5diwULFsgdp6hskdM1iqOro4kaVf7ZLWBd2RCNaprhRfobpL56gx8HOmPn8Tgkp2agurkR5oxsh9sPUxFxtmBnTvy9Zzj49y2smNwFoxfuhYaaGIvHdsBvR65Kd9jE33smc80mNuaQSARcT5TNyom+NBKJBHt3/4mOnT2grv7P30sPH9xHxMH9sHdoCSMjIzxJScHGDWuhpaWFFo5OKoyYlEVVD2rNyMhAQsI/OyUTExMRGxsLY2NjVK5cGT179sSFCxewd+9e5OfnS9d8GBsbQ1NTE3Xr1kX79u0xbNgwhIaGIjc3F76+vvD09IS5uTkAoF+/fggMDMSQIUMwZcoUXL16FUuXLsXixYtLFKvKfnL7+PigYsWKWLx4MVauXIn8/IL9+mpqamjatCnCwsLQu3dvOaOQsjWxMcehkIHS18GjCp6hsHl/LEYv3IsGNUzh1d4OhuW18fjZKxw+dxszf45ETu4/z18YNOtPLB7bAfsWD4BEImDn8ThMCNn/uW+F6LM7+3c0kh8/RmcP2ec/aGpqIfbCeWwN34T09HQYV6iAxk2a4eeNv8LYuMJ7RiMqufPnz6NNmzbS12/Xn3h7eyMgIAC7d+8GANjZ2cm87+jRo2jdujUAIDw8HL6+vmjbti3EYjF69OiBkJB/piANDAxw6NAh+Pj4oGnTpqhYsSL8/f1LtOUXAESCIAgfcY8KlZubi2fPCn5LrlixIjQ0ND5pPB2nAAVERVT2JB/0V3UIRKWOgY7yVy/UmnRAIePcmt9eIeOURqVibkNDQwOVK1eW35GIiOgLxO/Wk4/fZUNEREQqVyoqJERERGWZqr7L5kvChISIiEjJmI/IxykbIiIiUjlWSIiIiJTs7fd70fsxISEiIlIyTtnIxykbIiIiUjlWSIiIiJSMu2zkY0JCRESkZMxH5GNCQkREpGSskMjHNSRERESkcqyQEBERKRkrJPIxISEiIlIy5iPyccqGiIiIVI4VEiIiIiXjlI18TEiIiIiUjPmIfJyyISIiIpVjhYSIiEjJOGUjHxMSIiIiJWM+Ih+nbIiIiEjlWCEhIiJSMk7ZyMeEhIiISMmYj8jHhISIiEjJWCGRj2tIiIiISOVYISEiIlIyFkjkY0JCRESkZJyykY9TNkRERKRyrJAQEREpGQsk8jEhISIiUjJO2cjHKRsiIiJSOVZIiIiIlIwFEvmYkBARESkZp2zk45QNERERqRwrJERERErGCol8TEiIiIiUjPmIfJyyISIiUjKRSKSQo6SioqLQuXNnmJubQyQSYefOnTLnBUGAv78/KleuDB0dHbi4uODWrVsyfVJTU+Hl5QV9fX0YGhpiyJAhyMjIkOlz+fJlODo6QltbGxYWFggODi5xrExIiIiIyqjMzEzY2tpixYoVRZ4PDg5GSEgIQkNDcebMGejq6sLNzQ1ZWVnSPl5eXrh27RoiIiKwd+9eREVFYfjw4dLz6enpcHV1hZWVFWJiYjB//nwEBARgzZo1JYqVUzZERERKpqopG3d3d7i7uxd5ThAELFmyBNOmTUPXrl0BAJs2bYKpqSl27twJT09PxMXF4cCBAzh37hyaNWsGAFi2bBk6dOiABQsWwNzcHOHh4cjJycH69euhqamJ+vXrIzY2FosWLZJJXORhhYSIiEjJFDVlk52djfT0dJkjOzv7o2JKTExEcnIyXFxcpG0GBgawt7dHdHQ0ACA6OhqGhobSZAQAXFxcIBaLcebMGWkfJycnaGpqSvu4ubkhPj4eL168KHY8TEiIiIi+EEFBQTAwMJA5goKCPmqs5ORkAICpqalMu6mpqfRccnIyTExMZM6rq6vD2NhYpk9RY/z7GsXBKRsiIiIlU9SUjZ+fH8aPHy/TpqWlpZjBVYwJCRERkZKJFZSRaGlpKSwBMTMzAwCkpKSgcuXK0vaUlBTY2dlJ+zx58kTmfXl5eUhNTZW+38zMDCkpKTJ93r5+26c4OGVDRET0H1StWjWYmZnhyJEj0rb09HScOXMGDg4OAAAHBwekpaUhJiZG2icyMhISiQT29vbSPlFRUcjNzZX2iYiIgI2NDYyMjIodDxMSIiIiJROJFHOUVEZGBmJjYxEbGwugYCFrbGwskpKSIBKJMHbsWMyePRu7d+/GlStXMGDAAJibm8PDwwMAULduXbRv3x7Dhg3D2bNncerUKfj6+sLT0xPm5uYAgH79+kFTUxNDhgzBtWvXsG3bNixdurTQ1JI8nLIhIiJSMlU9Ov78+fNo06aN9PXbJMHb2xthYWGYPHkyMjMzMXz4cKSlpaFVq1Y4cOAAtLW1pe8JDw+Hr68v2rZtC7FYjB49eiAkJER63sDAAIcOHYKPjw+aNm2KihUrwt/fv0RbfgFAJAiC8In3W+roOAWoOgSiUin5oL+qQyAqdQx0lD9Z4L7qjELG2T/SXiHjlEacsiEiIiKV45QNERGRkvHbfuVjQkJERKRkzEfk45QNERERqZxCEpK0tDRFDENERFQmiRT0T1lW4oRk3rx52LZtm/R17969UaFCBVSpUgWXLl1SaHBERERlgVikmKMsK3FCEhoaCgsLCwAFT2KLiIjA/v374e7ujkmTJik8QCIiIir7SryoNTk5WZqQ7N27F71794arqyusra2lj5ElIiKif3CXjXwlrpAYGRnh/v37AIADBw7AxcUFACAIAvLz8xUbHRERURmgqkfHf0lKXCHp3r07+vXrh1q1auH58+dwd3cHAFy8eBE1a9ZUeIBERERU9pU4IVm8eDGsra1x//59BAcHo3z58gCAx48f4/vvv1d4gERERF86cVkvbyhAiRMSDQ0NTJw4sVD7uHHjFBIQERFRWcN8RL5iJSS7d+8u9oBdunT56GCIiIjKIi5qla9YCYmHh0exBhOJRFzYSkRERCVWrIREIpEoOw4iIqIyiwUS+T7py/WysrKgra2tqFiIiIjKJC5qla/EzyHJz8/HrFmzUKVKFZQvXx537twBAEyfPh0///yzwgMkIiKisq/ECcmcOXMQFhaG4OBgaGpqStsbNGiAdevWKTQ4IiKiskCkoKMsK3FCsmnTJqxZswZeXl5QU1OTttva2uLGjRsKDY6IiKgsEIlECjnKshInJA8fPizyiawSiQS5ubkKCYqIiIj+W0qckNSrVw8nTpwo1P7777+jcePGCgmKiIioLBGLFHOUZSXeZePv7w9vb288fPgQEokEf/75J+Lj47Fp0ybs3btXGTESERF90cr6dIsilLhC0rVrV+zZsweHDx+Grq4u/P39ERcXhz179qBdu3bKiJGIiIjKuI96DomjoyMiIiIUHQsREVGZxAKJfB/9YLTz588jLi4OQMG6kqZNmyosKCIiorKEUzbylTghefDgAfr27YtTp07B0NAQAJCWloYWLVpg69atqFq1qqJjJCIi+qKV9QWpilDiNSRDhw5Fbm4u4uLikJqaitTUVMTFxUEikWDo0KHKiJGIiIjKuBJXSI4fP47Tp0/DxsZG2mZjY4Nly5bB0dFRocERERGVBZyyka/ECYmFhUWRD0DLz8+Hubm5QoIiIiIqS5iOyFfiKZv58+dj1KhROH/+vLTt/PnzGDNmDBYsWKDQ4IiIiOi/oVgVEiMjI5lyU2ZmJuzt7aGuXvD2vLw8qKurY/DgwfDw8FBKoERERF8qMads5CpWQrJkyRIlh0FERFR2MR+Rr1gJibe3t7LjICIiov+wj34wGgBkZWUhJydHpk1fX/+TAiIiIipruMtGvhIvas3MzISvry9MTEygq6sLIyMjmYOIiIhkiUSKOcqyEickkydPRmRkJFatWgUtLS2sW7cOgYGBMDc3x6ZNm5QRIxEREZVxJU5I9uzZg5UrV6JHjx5QV1eHo6Mjpk2bhrlz5yI8PFwZMRIREX3RxCKRQo6SyM/Px/Tp01GtWjXo6OigRo0amDVrFgRBkPYRBAH+/v6oXLkydHR04OLiglu3bsmMk5qaCi8vL+jr68PQ0BBDhgxBRkaGQj6XfytxQpKamorq1asDKFgvkpqaCgBo1aoVoqKiFBsdERFRGaCKKZt58+Zh1apVWL58OeLi4jBv3jwEBwdj2bJl0j7BwcEICQlBaGgozpw5A11dXbi5uSErK0vax8vLC9euXUNERAT27t2LqKgoDB8+XFEfjVSJE5Lq1asjMTERAFCnTh1s374dQEHl5O2X7REREdE/RCKRQo6SOH36NLp27YqOHTvC2toaPXv2hKurK86ePQugoDqyZMkSTJs2DV27dkWjRo2wadMmPHr0CDt37gQAxMXF4cCBA1i3bh3s7e3RqlUrLFu2DFu3bsWjR48U+hmVOCEZNGgQLl26BACYOnUqVqxYAW1tbYwbNw6TJk1SaHBERET0j+zsbKSnp8sc2dnZRfZt0aIFjhw5gps3bwIALl26hJMnT8Ld3R0AkJiYiOTkZLi4uEjfY2BgAHt7e0RHRwMAoqOjYWhoiGbNmkn7uLi4QCwW48yZMwq9txJv+x03bpxMUDdu3EBMTAxq1qyJRo0aKTS4j/UiMkDVIRCVSkbNfVUdAlGp8+bicqVfo8S//b9HUFAQAgMDZdpmzJiBgICAQn2nTp2K9PR01KlTB2pqasjPz8ecOXPg5eUFAEhOTgYAmJqayrzP1NRUei45ORkmJiYy59XV1WFsbCztoyif9BwSALCysoKVlZUiYiEiIiqTFPUcEj8/P4wfP16mTUtLq8i+27dvR3h4OLZs2YL69esjNjYWY8eOhbm5eal84GmxEpKQkJBiDzh69OiPDoaIiIjeT0tL670JyLsmTZqEqVOnwtPTEwDQsGFD3Lt3D0FBQfD29oaZmRkAICUlBZUrV5a+LyUlBXZ2dgAAMzMzPHnyRGbcvLw8pKamSt+vKMVKSBYvXlyswUQiERMSIiKid4hV8FCz169fQyyWnSxSU1ODRCIBAFSrVg1mZmY4cuSINAFJT0/HmTNnMHLkSACAg4MD0tLSEBMTg6ZNmwIAIiMjIZFIYG9vr9B4i5WQvN1VQ0RERCWnioSkc+fOmDNnDiwtLVG/fn1cvHgRixYtwuDBgwEUFBHGjh2L2bNno1atWqhWrRqmT58Oc3NzeHh4AADq1q2L9u3bY9iwYQgNDUVubi58fX3h6ekJc3Nzhcb7yWtIiIiIqPRZtmwZpk+fju+//x5PnjyBubk5vvvuO/j7+0v7TJ48GZmZmRg+fDjS0tLQqlUrHDhwANra2tI+4eHh8PX1Rdu2bSEWi9GjR48SLeUoLpHw70e2lRFZeaqOgKh04i4bosI+xy6bCXviFTLOws42ChmnNGKFhIiISMlUMWXzpVHU1mgiIiKij8YKCRERkZIp6DEkZdpHVUhOnDiB/v37w8HBAQ8fPgQAbN68GSdPnlRocERERGWBKr7t90tT4oTkjz/+gJubG3R0dHDx4kXpM/RfvnyJuXPnKjxAIiKiL51YQUdZVuL7mz17NkJDQ7F27VpoaGhI21u2bIkLFy4oNDgiIiL6byjxGpL4+Hg4OTkVajcwMEBaWpoiYiIiIipTyvhsi0KUuEJiZmaGhISEQu0nT55E9erVFRIUERFRWcI1JPKVOCEZNmwYxowZgzNnzkAkEuHRo0cIDw/HxIkTpc++JyIiIiqJEk/ZTJ06FRKJBG3btsXr16/h5OQELS0tTJw4EaNGjVJGjERERF+0Ml7cUIgSJyQikQg//vgjJk2ahISEBGRkZKBevXooX768MuIjIiL64vFJrfJ99IPRNDU1Ua9ePUXGQkRERP9RJU5I2rRpA9EHak+RkZGfFBAREVFZU9YXpCpCiRMSOzs7mde5ubmIjY3F1atX4e3trai4iIiIygzmI/KVOCFZvHhxke0BAQHIyMj45ICIiIjov0dhT6Lt378/1q9fr6jhiIiIygyxSDFHWaawb/uNjo6Gtra2ooYjIiIqM0Qo49mEApQ4IenevbvMa0EQ8PjxY5w/fx7Tp09XWGBERERlRVmvbihCiRMSAwMDmddisRg2NjaYOXMmXF1dFRYYERER/XeUKCHJz8/HoEGD0LBhQxgZGSkrJiIiojKFFRL5SrSoVU1NDa6urvxWXyIiohIQiUQKOcqyEu+yadCgAe7cuaOMWIiIiOg/qsQJyezZszFx4kTs3bsXjx8/Rnp6usxBREREsrjtV75iryGZOXMmJkyYgA4dOgAAunTpIlM+EgQBIpEI+fn5io+SiIjoC1bGZ1sUotgJSWBgIEaMGIGjR48qMx4iIiL6Dyp2QiIIAgDA2dlZacEQERGVRfxyPflKtO23rK/wJSIiUoayvv5DEUqUkNSuXVtuUpKamvpJAREREdF/T4kSksDAwEJPaiUiIqIP4wSDfCVKSDw9PWFiYqKsWIiIiMokMb9cT65iJyRcP0JERPRx+CNUvmI/GO3tLhsiIiIiRSt2hUQikSgzDiIiojKLu2zkK9EaEiIiIio5PodEvhJ/lw0RERGRorFCQkREpGQskMjHCgkREZGSiUUihRwl9fDhQ/Tv3x8VKlSAjo4OGjZsiPPnz0vPC4IAf39/VK5cGTo6OnBxccGtW7dkxkhNTYWXlxf09fVhaGiIIUOGICMj45M/k3cxISEiIiqDXrx4gZYtW0JDQwP79+/H9evXsXDhQhgZGUn7BAcHIyQkBKGhoThz5gx0dXXh5uaGrKwsaR8vLy9cu3YNERER2Lt3L6KiojB8+HCFxysSyuB+3qw8VUdAVDoZNfdVdQhEpc6bi8uVfo3155IUMs7g5pbF7jt16lScOnUKJ06cKPK8IAgwNzfHhAkTMHHiRADAy5cvYWpqirCwMHh6eiIuLg716tXDuXPn0KxZMwDAgQMH0KFDBzx48ADm5uafflP/xwoJERGRkokVdGRnZyM9PV3myM7OLvKau3fvRrNmzdCrVy+YmJigcePGWLt2rfR8YmIikpOT4eLiIm0zMDCAvb09oqOjAQDR0dEwNDSUJiMA4OLiArFYjDNnzijks3mLCQkREdEXIigoCAYGBjJHUFBQkX3v3LmDVatWoVatWjh48CBGjhyJ0aNHY+PGjQCA5ORkAICpqanM+0xNTaXnkpOTC31ljLq6OoyNjaV9FIW7bIiIiJRMUV+/4ufnh/Hjx8u0aWlpFdlXIpGgWbNmmDt3LgCgcePGuHr1KkJDQ+Ht7a2QeBSJFRIiIiIlEyno0NLSgr6+vszxvoSkcuXKqFevnkxb3bp1kZRUsJ7FzMwMAJCSkiLTJyUlRXrOzMwMT548kTmfl5eH1NRUaR9FYUJCRESkZKrY9tuyZUvEx8fLtN28eRNWVlYAgGrVqsHMzAxHjhyRnk9PT8eZM2fg4OAAAHBwcEBaWhpiYmKkfSIjIyGRSGBvb/+xH0eROGVDRERUBo0bNw4tWrTA3Llz0bt3b5w9exZr1qzBmjVrABRMI40dOxazZ89GrVq1UK1aNUyfPh3m5ubw8PAAUFBRad++PYYNG4bQ0FDk5ubC19cXnp6eCt1hAzAhISIiUjpVPKi1efPm2LFjB/z8/DBz5kxUq1YNS5YsgZeXl7TP5MmTkZmZieHDhyMtLQ2tWrXCgQMHoK2tLe0THh4OX19ftG3bFmKxGD169EBISIjC4+VzSIj+Q/gcEqLCPsdzSLZceKCQcfo1qaqQcUojriEhIiIileOUDRERkZIpattvWcaEhIiISMk4HSEfPyMiIiJSOSYkZdTmjWEwq2io6jBUbtjggejVw0PVYRApTP/O9ngcFSy335uLy9G5daPPEBEVh0gkUshRlnHKphQbNnggftm8sVD71bhbqFGzpgoi+sfmjWEYPnQQ2rm6YfdfB6TtaWlpqFzJCAcPH4WTc+vPFs+9u3dRp1Y1/H3uImzt7KTtCxYvRRncSEZFkLdTYnboPsxZve+zxHJw7Rg4NasFAMjKzkXiw2cI3RqFNb8V/a2rJfH7oQs4ePKa9PWP33VA5zaN8LXnTzL9rF388CL9zSdfjxSjbKcSisGEpJRzdWuP1es2yLRVqlRJRdHIUldXR+SRwzh+7CicW7dRdThFMjAwUHUI9JlYu/hJ/72na1NMH9kRtt1mStsyXst+I6qamhj5+RKlxfPzH6cwa9Ve6GhrwquTPZb+0Adpr15j+4EY+W/+gKzsXGRl58rtl/L81Sddh+hz45RNKaeppQUzMzOZQ01NDUsXL0Izu4aoYKCLmtUsMMb3e2RkZLx3nMuXLsHNpQ0qGenBxFgfLb5qipjz56XnT508ibatHWGkp4Oa1SwwfuxoZGZmfjA2XV1deA8cjGk/TP1gv/v378Orb2+YVTSEuYkxenXvint370rP5+XlYfzY0TCraIgqphXwo98UDB3kLTPVcujgAXzj3Erap3vXTrhz+7b0fJ1a1QAAXzdvDB0NEVzbtgYgO2Xz89o1qGZpDolE9odQr+5d8d3QwdLXe3bvgkPzJjAsr426tatjzqxA5OXx4TalXcrzV9LjZcYbCBCkr2tbm+HZ6UVwbVkPp8In4+XZJWhhVwNrAvtj+6JhMuPMn9gDB9eOkb4WiUSYONgVcXsDkBq9CGe2TUU3Fzu58bzJykHK81e4+/A55qzeh1v3nqCjc0MAgIWZEbYvHo6npxYi5cR8/DJvMEyM9aTvbVi7Cg6sGY0nJxcg5cR8nAqfjCb1LAHITtn072yPaSM6wNamKt5cXI43F5ejf+eCx3n/e8rmaNh4zB7dVSa+ikblkX52KVo2qQEA0NRQR9C4brh9cDaenV6IqE0T4di0Vkn+E9AHcMpGPiYkXyixWIyFS0Jw4dI1rFu/EceOReLHqZPf23+QtxeqVKmKk9HncPpMDCZMngoNDQ0AwJ3bt9G1U3t4dOuBcxcuY3P4NkSfOolxo+U/ROtH/wBcu3oFf/7xe5Hnc3Nz0aWjG/TK6+Hw0ROIPH4Kurrl0aVTe+Tk5AAAFs6fh22/hmP1ug2IPH4Kr9LTsWf3TplxMjMzMXrseJz6+zz2HTwCsViMPj27SZOLE6fPAgD2HTyMxPuPsfW3PwvF0r1nL6Q+f47jx45K21JTU3Ho4AF49it4cuHJkycwdNAA+Iwag4uXr2P5ytXYvCkM84LmyP0sqPSbNboLpofshl332bh662Gx3jNpsCu8On6FUXO2oUnPOVj2y1Gsn+2NVk1LNm36JjsHmhrqEIlE2L54OIz1y8F16BJ0Grkc1lUrYvO8f5LiDXO88TAlDa36z0cLr2As3BCB3Lz8QmP+fugClmw6gmsJj2Dt4gdrFz/8fuhCoX5b951Hr/ZNZdp6ujbB42cvcepCQWK/eGov2DeyxoCpG9C8dxD+jLiI3Su+Rw3L0lGR/dKJFXSUZWX9/r54+//ai4qG5aVHP89eAIBRY8bCuXUbWFlbo3WbbzAjcDb++H37e8e5n5SEb9q6wKZOHdSsVQs9evZCI1tbAMD8eUHw7OuFUWPGomatWnBo0QILFocg/JdNyMrK+mB85ubm8Bk1BgH+PxZZRfh9+zZIJBKsWrMODRo2RJ26dbHm5w24n5SEqOPHAACrVizDxCl+6OrRDTZ16mBxyHIYGBrKjNOtew94dOuOGjVrwtbODqFr1+Pq1SuIu34dwD/TWMbGFWBmZgZjY+NCsRgZGcG1vTu2/bpF2rbjj99RoWJF6ZTT3FmBmDh5KvoP8Ea16tXR1qUdZgTMwrq1qz/4OdCXYdaqvxB55gYSHzzDi/TXcvtraqhj8hBXjAgMx+HoONx9+By/7DmDX/edw9AerYp1TbFYBM8OzdGodlUcO3sTbb6yQYOa5hj4Qxguxt3Huav3MHT6Jjg1q4Wm/6+CWJgZIfJsPG7eTcHtpKf48/BFXLlZOIHKys5Fxuts5OVLpNWgoqZz/oi4gMoVDdCycQ1pWx/3Zth+4Lz0egO6fA2vyetx6uJtJD54hiWbj+B07G0M6PJ1se6TPowVEvm4hqSUc27dBiHLV0lfl9PVBQBEHjmM+fOCEB9/A6/S05GXl4esrCy8fv0a5cqVKzTO6LHjMfK7odgSvhlt2rqgR49eqF6j4C+ny5cv4eqVy9j6a7i0vyAIkEgkuJuYiDp1634wxgmTpuDntauxccN69OjVW+bc5cuXcDshAZWM9GTas7KycOf2bbz86iVSUlLQvPlX0nNqampo3KSpzNRKwq1bmBnoj3Nnz+D5s2fSc/fvJ6F+gwYfjO/fPPt6wWfEMCxdvhJaWlrY+ms4evX2hFhckJtfuXwJ0adPyVRE8vPzP/jZ0pfjwrWkEvWvYVERujpa2LtKtlqoqaGGSzc+/Cjw4b0dMbBbC2hqqCE/X4KQXyKx5rcTGOnphAcpL/AgJU3a98adZLxIfw2b6maIuZ6EkF+OYtX0fujXsTmOnonHHxEXkfjgWYli/7dnLzJw+O849OnQHKcu3oaVeQV8bVsdvrO3AgDq1zSHuroaLu/0l3mfloY6UtM+PHVLpChMSEq5crq6hXbU3Lt7F927dsKw70YiYOYcGBsb4/SpkxgxfAhycnKK/KE5zT8AfTz7Yf++v3Do4H7MDpyBTeFb0dWjGzIzMzBk2Hfw8R1d6H0WlpZyYzQ0NMTEKX6YMzsQ7h07yZzLzMhA4yZNEbYpvND7KpZgcW6Pbp1haWmFlaFrUblywTqQpnYNpNM+xdWxU2d8LwjYv+8vNG3WHKdOnkDwgsXS8xkZGZg2IxAeHt0LvfffXzZFX6bMN7L/v0gkAvDOb53q6mrSfy9fTgsA0G30Kjx6kibTLyfnw+uKtu47j3k/H0BWVi4eP0sv0W6vOav3Ydv+83B3rA/XlvUwbUQHDJi6AbuPXi72GO/atu88FkzuifHztqOPezNcufkQ1xIeASi4z7y8fLToNw/576yxynxnMTB9nLJd21AMJiRfoAsXYiCRSDBv/kLpb/Yfmq55q1bt2qhVuzZGjx2HAf37YvPGDejq0Q12dk1wI+76J20l/t5nFFYuD8GKZUtl2u0aN8Hvv21DJRMT6OvrF/leU1NTnD9/Dq0cnQAUVCRiL15AI1s7AMDz589xMz4eK0LXolUrRwAFi3D/TUNTU/reD9HW1kZXj+7Y+ms4bt9OQG0bGzRu0kQm3lvx8SrfVk2fx7MXGahfs7JMm61NFeTmFfxQjruTjKzsXFiYGeFkTEKJxk7PeIM79wtXNW7cSUFVUyNUNTWUVknqVDeDkX453LiTLO2XkPQEy8KfYFn4UWwMGohvuzoUmZDk5OZBTSx/9n3PsctYPr0vXFvUQx/3Ztiy94z0XOyNB1BXV4OJsR5OXbz9gVHoY5Xx2RaF4BqSL1CNGjWRm5uLlcuXIfHOHWz5ZTPWrgl9b/83b95g7GhfRB0/hnv37uH0qVOIOX8ONnUKpmImTJqCv6NPY+xoX1yKjUXCrVvYs3sXxhZjUetb2tramO4fiJXLZb+S2rOfFypUrIhe3bvi5MkTuJuYiKjjxzB+7Gg8eFBQ8h7pMwoL5gVhz+5duBkfjwnjxiDtxQvpfKmRkREqVKiA9WvX4HZCAo4djcSUSeNlrmNiYgIdHR1EHDqAlJQUvHz58r2xevbzwoF9f2FT2Hp49vWSOffDNH+E/7IJc2YF4vq1a7gRF4ft27YiwH9asT8L+nIcO3cTTepZol+nr1DDshKmjeiAejXMpeczXmdjyaYjCJ7QA16d7VGtakXY1amKkZ7O8Pr/bpaSijxzA1cTHmHD3IGwq1MVzepbYd2sAYg6fwsXridBW0sDi6f0gmPTWrCsbAQH2+poWs8K8f9KVv4t6VEqrKtUQKPaVVDBUBeaGkX/nvk6Kwd7jl6C//edUKeaqcz244SkJ/j1r7NYN+tbdP3GFlbmFdCsvhUmDnZF+1b1P+o+iUqKCckXqJGtLebNX4SFC+ahqV0DbP01HLNmB723v5qaGlJTn2PIoAFoVK82+vfrDVc3d0yfEQgAaNioEQ4dOY6EWzfh0sYRXzdvjFkB/jA3N3/vmEV5uxD038qVK4eIyChYWFiib6/usGtYFyOGD0F2Vpa0YjJh0hT06tMXQwcNQGtHB5QvXx4urm7SKRKxWIxN4Vtx8WIMmto1wOQJ4xA0b77MddTV1bFwcQjWrV2N6pbm6NVddovjv7Vu8w2MjI1xMz4efTz7yZxr5+qGP3ftxeGIQ2jl0BzOrb7GsqWLYWlpVaLPgr4Mh6PjELT2AOaM8cDJXyZBT1cbW/46K9MncOVe/LT2ACYNaofYP6dh1woftG9VH3cffvyajt7j1uBF+mtE/DwOf4X64u6DZ/h2ynoAQH6+BMaGuvh51re4vNMfvwQPxqHT1zEr9K8ix9pxJBYRp6/jwNoxeHB0Hnq/s5vm37buPw9bm6o4dfE27ie/kDk3POAXhO89i5/Gd8PlndOxffFwNKtnWagffRwxRAo5yjKRUAYfY5nFR0Z80SQSCewa1kWPnr0xI3CWqsMpU4yaF7/qRfRfIe8pv4qw92qKQsbp1MBUIeOURlxDQip37949HIk4BEcnZ2RnZyN05XLcTUwsVL0gIqKyiwkJqZxYLMbmTWHwmzIRgiCgXv0G2HfwsNztxkREXwpRGZ9uUQQmJKRyFhYWOBp1StVhEBEpDXfZyMdFrURERKRyrJAQEREpWVnfIaMITEiIiIiUjFM28jEhISIiUjImJPJxDQkRERGpHCskRERESsZtv/IxISEiIlIyMfMRuThlQ0RERCrHCgkREZGSccpGPiYkRERESsZdNvJxyoaIiIhUjhUSIiIiJeOUjXxMSIiIiJSMu2zk45QNERERqRwrJPTJYs6fQ9j6nxF3/SqePn2KxSEr8E1bFwBAbm4ulocswckTUXjw4D70ypeHvUMLjBk3ASYmpiqOnOjjtWxSA+MGuKBJPUtUrmSA3uPWYM+xy9LzawL749suX8u859Cp6+jqu1L6uqalCeaO84CDbXVoaqjh6q1HCFy5F1Hnb0n7NK1niVmju6JxPQsIAnD+6j38uHQnrtx8qPybJIXhlI18rJDQJ3vz5jVsbGzgN21GoXNZWVm4EXcdw0eMxLbf/sSipctxNzERY3xHqiBSIsXR1dHClZsPMTZo23v7HDx1DdYuftLD22+DzPk/Q0ZAXU0M9+9C0MIrGJdvPsSfISNgWkHv/9fQxK4VPrif/AJO3y5A20GLkPE6C7tX+EBdnX99f0lEIsUcZRn/j6ZP1srRGb5jxqGtS7tC5/T09LB63Qa4te8A62rV0cjWDn4/Tsf1a9fw+NEjFURLpBiHTl1H4Mq92H308nv75OTkIeX5K+mR9uqN9FwFQ13UsjLBwg0RuHrrEW4nPcX0kF3Q1dFCvZrmAACbamaoYKiLWav24ta9J4i7k4w5q/fDrKI+LCsbK/0eSXFECjo+xU8//QSRSISxY8dK27KysuDj44MKFSqgfPny6NGjB1JSUmTel5SUhI4dO6JcuXIwMTHBpEmTkJeX94nRFMaEhD67jIwMiEQi6OnrqzoUIqVybFYL944E4dKO6Vj6Qx8YG+hKzz1Py0R8YjL6dfoK5bQ1oaYmxtAerZDyPB0XrycBAG7eTcGzFxnw9mgBDXU1aGtpYKCHA+LuPMa9R6mqui36Ap07dw6rV69Go0aNZNrHjRuHPXv24LfffsPx48fx6NEjdO/eXXo+Pz8fHTt2RE5ODk6fPo2NGzciLCwM/v7+Co+xVCck9+/fx+DBgz/YJzs7G+np6TJHdnb2Z4qQSio7OxtLFi2Ae4eOKF++vKrDIVKaiNNxGDp9Mzp8twzTlu6CY9Oa2LV8JMT/2m7RccRy2NaxwNNTC5D292KM/vYbdPVZKa2kZLzOhtuwpejboTle/L0Yz04tRLsWdeHhuxL5+RJV3Rp9BLFIpJDjY2RkZMDLywtr166FkZGRtP3ly5f4+eefsWjRInzzzTdo2rQpNmzYgNOnT+Pvv/8GABw6dAjXr1/HL7/8Ajs7O7i7u2PWrFlYsWIFcnJyFPLZvFWqE5LU1FRs3Ljxg32CgoJgYGAgc8yfF/SZIqSSyM3NxaTxYyAIAn70D1R1OERK9dvBGPx1/AquJTzCnmOX0X10KJo1sIZTs1rSPov9euNp6iu4DF4Cx2/nY/fRS/hj6Xcwq1hQPdTW0kDoDC9EX7oD5wEL8M2gRbh++zH+DBkJbS0NVd0afQRVTtn4+PigY8eOcHFxkWmPiYlBbm6uTHudOnVgaWmJ6OhoAEB0dDQaNmwIU9N/NiG4ubkhPT0d165d+8iIiqbSXTa7d+/+4Pk7d+7IHcPPzw/jx4+XaRPUtD4pLlK83NxcTJowFo8fPcLaDRtZHaH/nLsPn+Ppi1eoYVEJx87eROuvaqODYwNUdp6MV5lZAICxQdvR9us66N/ZHgs2RKCPezNYmhvD2XshBEEAAHj7heFxVDA6t26E3w7GqPKWSAWys7MLzQJoaWlBS6von3tbt27FhQsXcO7cuULnkpOToampCUNDQ5l2U1NTJCcnS/v8Oxl5e/7tOUVSaULi4eEBkUgk/YNWFJGcElVR/yGyFL/Whj7B22Qk6d49rNuwCYaGRvLfRFTGVDExRAUDXSQ/SwcAlNPWBABIJLJTLxKJIP17r5y2JiQSQebvSIkgQBDw0eV7UhEF/ecKCgpCYKBshXnGjBkICAgo1Pf+/fsYM2YMIiIioK2trZgAlEilUzaVK1fGn3/+CYlEUuRx4cIFVYZHxfQ6MxM34uJwIy4OAPDwwQPciIvD40ePkJubi4njRuP6tasImrcAkvx8PHv6FM+ePkWugucfiT4nXR1NNKpdBY1qVwEAWFepgEa1q8DCzAi6OpqYO9YDXzW0hmVlY7T+qja2Lx6O2/efIeJ0wZ+TM5cT8SL9NdbNGoCGtasUPJNkrAesq1TAgZMFpfAjf9+AkX45LPHrDZtqpqhb3QxrAvojLz8fx8/fVNm9U8mJFPSPn58fXr58KXP4+fkVec2YmBg8efIETZo0gbq6OtTV1XH8+HGEhIRAXV0dpqamyMnJQVpamsz7UlJSYGZmBgAwMzMrtOvm7eu3fRRFpRWSpk2bIiYmBl27di3yvLzqCZUO165dxdBBA6SvFwQXrOHp0rUbRvj44tjRSABA7x6y/53XbdiE5l/Zf75AiRSoST0rHFo3Rvo6eGIPAMDm3X9j9NxtaFCrCrw628NQTwePn77E4egbmLlyL3JyC0q4z9My0dV3JQJ8OmP/6tHQUBcj7k4yeo1bI33o2c27KegxZjV+/M4dxzZOgEQi4NKNB+jqs1JaaaH/lg9Nz7yrbdu2uHLlikzboEGDUKdOHUyZMgUWFhbQ0NDAkSNH0KNHwf+/8fHxSEpKgoODAwDAwcEBc+bMwZMnT2BiYgIAiIiIgL6+PurVq6fAOwNEggp/4p84cQKZmZlo3759keczMzNx/vx5ODs7l2hcTtkQFc2oua+qQyAqdd5cXK70a5y981Ih43xV3eCT3t+6dWvY2dlhyZIlAICRI0di3759CAsLg76+PkaNGgUAOH36NICCbb92dnYwNzdHcHAwkpOT8e2332Lo0KGYO3fuJ8XyLpVWSBwdHT94XldXt8TJCBERUWlTWlf8LF68GGKxGD169EB2djbc3NywcuU/X2+gpqaGvXv3YuTIkXBwcICuri68vb0xc+ZMhcei0gqJsrBCQlQ0VkiICvscFZJzCqqQNP/ECklpxi/XIyIiUrbSWiIpRZiQEBERKRm/7Vc+JiRERERKxsfGyFeqHx1PRERE/w2skBARESkZCyTyMSEhIiJSNmYkcnHKhoiIiFSOFRIiIiIl4y4b+ZiQEBERKRl32cjHKRsiIiJSOVZIiIiIlIwFEvmYkBARESkbMxK5OGVDREREKscKCRERkZJxl418TEiIiIiUjLts5GNCQkREpGTMR+TjGhIiIiJSOVZIiIiIlI0lErmYkBARESkZF7XKxykbIiIiUjlWSIiIiJSMu2zkY0JCRESkZMxH5OOUDREREakcKyRERETKxhKJXExIiIiIlIy7bOTjlA0RERGpHCskRERESsZdNvIxISEiIlIy5iPyMSEhIiJSNmYkcnENCREREakcKyRERERKxl028jEhISIiUjIuapWPUzZERESkcqyQEBERKRkLJPIxISEiIlI2ZiRyccqGiIiIVI4JCRERkZKJFPRPSQQFBaF58+bQ09ODiYkJPDw8EB8fL9MnKysLPj4+qFChAsqXL48ePXogJSVFpk9SUhI6duyIcuXKwcTEBJMmTUJeXt4nfybvYkJCRESkZCKRYo6SOH78OHx8fPD3338jIiICubm5cHV1RWZmprTPuHHjsGfPHvz22284fvw4Hj16hO7du0vP5+fno2PHjsjJycHp06exceNGhIWFwd/fX1EfjZRIEARB4aOqWJbiEzeiMsGoua+qQyAqdd5cXK70ayQ+y1LIONUqan/0e58+fQoTExMcP34cTk5OePnyJSpVqoQtW7agZ8+eAIAbN26gbt26iI6Oxtdff439+/ejU6dOePToEUxNTQEAoaGhmDJlCp4+fQpNTU2F3BfACgkREZHSiRR0fIqXL18CAIyNjQEAMTExyM3NhYuLi7RPnTp1YGlpiejoaABAdHQ0GjZsKE1GAMDNzQ3p6em4du3aJ0Yki7tsiIiIlE1Bu2yys7ORnZ0t06alpQUtLa0Pvk8ikWDs2LFo2bIlGjRoAABITk6GpqYmDA0NZfqampoiOTlZ2uffycjb82/PKRIrJEREREqmqEWtQUFBMDAwkDmCgoLkXt/HxwdXr17F1q1bP8PdfhxWSIiIiL4Qfn5+GD9+vEybvOqIr68v9u7di6ioKFStWlXabmZmhpycHKSlpclUSVJSUmBmZibtc/bsWZnx3u7CedtHUVghISIiUjJF7bLR0tKCvr6+zPG+hEQQBPj6+mLHjh2IjIxEtWrVZM43bdoUGhoaOHLkiLQtPj4eSUlJcHBwAAA4ODjgypUrePLkibRPREQE9PX1Ua9ePYV+RqyQEBERKZkqHtTq4+ODLVu2YNeuXdDT05Ou+TAwMICOjg4MDAwwZMgQjB8/HsbGxtDX18eoUaPg4OCAr7/+GgDg6uqKevXq4dtvv0VwcDCSk5Mxbdo0+Pj4yK3MlBS3/RL9h3DbL1Fhn2Pb7/3UbPmdisHCuPhJgOg9Dy7ZsGEDBg4cCKDgwWgTJkzAr7/+iuzsbLi5uWHlypUy0zH37t3DyJEjcezYMejq6sLb2xs//fQT1NUVW9NgQkL0H8KEhKiwz5GQPHihmISkqpFiqxKlCadsiIiIlI7fricPF7USERGRyrFCQkREpGQl/R6a/yImJERERErGfEQ+TtkQERGRyrFCQkREpGScspGPCQkREZGSiThpIxcTEiIiImVjPiIX15AQERGRyrFCQkREpGQskMjHhISIiEjJuKhVPk7ZEBERkcqxQkJERKRk3GUjHxMSIiIiZWM+IhenbIiIiEjlWCEhIiJSMhZI5GNCQkREpGTcZSMfp2yIiIhI5VghISIiUjLuspGPCQkREZGSccpGPk7ZEBERkcoxISEiIiKV45QNERGRknHKRj4mJERERErGRa3yccqGiIiIVI4VEiIiIiXjlI18TEiIiIiUjPmIfJyyISIiIpVjhYSIiEjZWCKRiwkJERGRknGXjXycsiEiIiKVY4WEiIhIybjLRj4mJERERErGfEQ+JiRERETKxoxELq4hISIiIpVjhYSIiEjJuMtGPiYkRERESsZFrfJxyoaIiIhUTiQIgqDqIKhsys7ORlBQEPz8/KClpaXqcIhKDf7ZICqMCQkpTXp6OgwMDPDy5Uvo6+urOhyiUoN/NogK45QNERERqRwTEiIiIlI5JiRERESkckxISGm0tLQwY8YMLtojegf/bBAVxkWtREREpHKskBAREZHKMSEhIiIilWNCQkRERCrHhISIiIhUjgkJKc2KFStgbW0NbW1t2Nvb4+zZs6oOiUiloqKi0LlzZ5ibm0MkEmHnzp2qDomo1GBCQkqxbds2jB8/HjNmzMCFCxdga2sLNzc3PHnyRNWhEalMZmYmbG1tsWLFClWHQlTqcNsvKYW9vT2aN2+O5cuXAwAkEgksLCwwatQoTJ06VcXREameSCTCjh074OHhoepQiEoFVkhI4XJychATEwMXFxdpm1gshouLC6Kjo1UYGRERlVZMSEjhnj17hvz8fJiamsq0m5qaIjk5WUVRERFRacaEhIiIiFSOCQkpXMWKFaGmpoaUlBSZ9pSUFJiZmakoKiIiKs2YkJDCaWpqomnTpjhy5Ii0TSKR4MiRI3BwcFBhZEREVFqpqzoAKpvGjx8Pb29vNGvWDF999RWWLFmCzMxMDBo0SNWhEalMRkYGEhISpK8TExMRGxsLY2NjWFpaqjAyItXjtl9SmuXLl2P+/PlITk6GnZ0dQkJCYG9vr+qwiFTm2LFjaNOmTaF2b29vhIWFff6AiEoRJiRERESkclxDQkRERCrHhISIiIhUjgkJERERqRwTEiIiIlI5JiRERESkckxIiIiISOWYkBAREZHKMSEhUqGBAwfCw8ND+rp169YYO3bsZ4/j2LFjEIlESEtLe28fkUiEnTt3FnvMgIAA2NnZfVJcd+/ehUgkQmxs7CeNQ0SlHxMSoncMHDgQIpEIIpEImpqaqFmzJmbOnIm8vDylX/vPP//ErFmzitW3OEkEEdGXgt9lQ1SE9u3bY8OGDcjOzsa+ffvg4+MDDQ0N+Pn5Feqbk5MDTU1NhVzX2NhYIeMQEX1pWCEhKoKWlhbMzMxgZWWFkSNHwsXFBbt37wbwzzTLnDlzYG5uDhsbGwDA/fv30bt3bxgaGsLY2Bhdu3bF3bt3pWPm5+dj/PjxMDQ0RIUKFTB58mS8+80N707ZZGdnY8qUKbCwsICWlhZq1qyJn3/+GXfv3pV+J4qRkRFEIhEGDhwIoOCblYOCglCtWjXo6OjA1tYWv//+u8x19u3bh9q1a0NHRwdt2rSRibO4pkyZgtq1a6NcuXKoXr06pk+fjtzc3EL9Vq9eDQsLC5QrVw69e/fGy5cvZc6vW7cOdevWhba2NurUqYOVK1e+95ovXryAl5cXKlWqBB0dHdSqVQsbNmwocexEVPqwQkJUDDo6Onj+/Ln09ZEjR6Cvr4+IiAgAQG5uLtzc3ODg4IATJ05AXV0ds2fPRvv27XH58mVoampi4cKFCAsLw/r161G3bl0sXLgQO3bswDfffPPe6w4YMADR0dEICQmBra0tEhMT8ezZM1hYWOCPP/5Ajx49EB8fD319fejo6AAAgoKC8MsvvyA0NBS1atVCVFQU+vfvj0qVKsHZ2Rn3799H9+7d4ePjg+HDh+P8+fOYMGFCiT8TPT09hIWFwdzcHFeuXMGwYcOgp6eHyZMnS/skJCRg+/bt2LNnD9LT0zFkyBB8//33CA8PBwCEh4fD398fy5cvR+PGjXHx4kUMGzYMurq68Pb2LnTN6dOn4/r169i/fz8qVqyIhIQEvHnzpsSxE1EpJBCRDG9vb6Fr166CIAiCRCIRIiIiBC0tLWHixInS86ampkJ2drb0PZs3bxZsbGwEiUQibcvOzhZ0dHSEgwcPCoIgCJUrVxaCg4Ol53Nzc4WqVatKryUIguDs7CyMGTNGEARBiI+PFwAIERERRcZ59OhRAYDw4sULaVtWVpZQrlw54fTp0zJ9hwwZIvTt21cQBEHw8/MT6tWrJ3N+ypQphcZ6FwBhx44d7z0/f/58oWnTptLXM2bMENTU1IQHDx5I2/bv3y+IxWLh8ePHgiAIQo0aNYQtW7bIjDNr1izBwcFBEARBSExMFAAIFy9eFARBEDp37iwMGjTovTEQ0ZeLFRKiIuzduxfly5dHbm4uJBIJ+vXrh4CAAOn5hg0byqwbuXTpEhISEqCnpyczTlZWFm7fvo2XL1/i8ePHsLe3l55TV1dHs2bNCk3bvBUbGws1NTU4OzsXO+6EhAS8fv0a7dq1k2nPyclB48aNAQBxcXEycQCAg4NDsa/x1rZt2xASEoLbt28jIyMDeXl50NfXl+ljaWmJKlWqyFxHIpEgPj4eenp6uH37NoYMGYJhw4ZJ++Tl5cHAwKDIa44cORI9evTAhQsX4OrqCg8PD7Ro0aLEsRNR6cOEhKgIbdq0wapVq6CpqQlzc3Ooq8v+UdHV1ZV5nZGRgaZNm0qnIv6tUqVKHxXD2ymYksjIyAAA/PXXXzKJAFCwLkZRoqOj4eXlhcDAQLi5ucHAwABbt27FwoULSxzr2rVrCyVIampqRb7H3d0d9+7dw759+xAREYG2bdvCx8cHCxYs+PibIaJSgQkJURF0dXVRs2bNYvdv0qQJtm3bBhMTk0JVgrcqV66MM2fOwMnJCUBBJSAmJgZNmjQpsn/Dhg0hkUhw/PhxuLi4FDr/tkKTn58vbatXrx60tLSQlJT03spK3bp1pQt03/r777/l3+S/nD59GlZWVvjxxx+lbffu3SvULykpCY8ePYK5ubn0OmKxGDY2NjA1NYW5uTnu3LkDLy+vYl+7UqVK8Pb2hre3NxwdHTFp0iQmJERlAHfZECmAl5cXKlasiK5du+LEiRNITEzEsWPHMHr0aDx48AAAMGbMGPz000/YuXMnbty4ge+///6DzxCxtraGt7c3Bg8ejJ07d0rH3L59OwDAysoKIpEIe/fuxdOnT5GRkQE9PT1MnDgR48aNw8aNG3H79m1cuHABy5Ytw8aNGwEAI0aMwK1btzBp0iTEx8djy5YtCAsLK9H91qpVC0lJSdi6dStu376NkJAQ7Nixo1A/bW1teHt749KlSzhx4gRGjx6N3r17w8zMDAAQGBiIoKAghISE4ObNm7hy5Qo2bNiARYsWFXldf39/7Nq1CwkJCbh27Rr27t2LunXrlih2IiqdmJAQKUC5cuUQFRUFS0tLdO/eHXXr1sWQIUOQlZUlrZhMmDAB3377Lby9veHg4AA9PT1069btg+OuWrUKPXv2xPfff486depg2LBhyMzMBABUqVIFgYGBmDp1KkxNTeHr6wsAmDVrFqZPn46goCDUrVsX7du3x19//YVq1aoBKFjX8ccff2Dnzp2wtbVFaGgo5s6dW6L77dKlC8aNGwdfX1/Y2dnh9OnTmD59eqF+NWvWRPfu3dGhQwe4urqiUaNGMtt6hw4dinXr1mHDhg1o2LAhnJ2dERYWJo31XZqamvDz80OjRo3g5OQENTU1bN26tUSxE1HpJBLet6KOiIiI6DNhhYSIiIhUjgkJERERqRwTEiIiIlI5JiRERESkckxIiIiISOWYkBAREZHKMSEhIiIilWNCQkRERCrHhISIiIhUjgkJERERqRwTEiIiIlI5JiRERESkcv8DXsugvvkgN6oAAAAASUVORK5CYII=\n"},"metadata":{}}]},{"cell_type":"code","source":["print(classification_report(y_test,test_pred))\n","plot_confusion_matrix(y_test,test_pred)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":628},"id":"HCBkR36rfIqJ","executionInfo":{"status":"ok","timestamp":1684575747197,"user_tz":-420,"elapsed":807,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"4ee78cd3-6640-4908-f6ee-83c1fbf8ef8b"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":[" precision recall f1-score support\n","\n"," 0 0.99 0.94 0.96 395\n"," 1 0.94 0.99 0.96 400\n","\n"," accuracy 0.96 795\n"," macro avg 0.96 0.96 0.96 795\n","weighted avg 0.96 0.96 0.96 795\n","\n"]},{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{}}]},{"cell_type":"markdown","source":["# Test on Huggingface"],"metadata":{"id":"bvryxUTofW_4"}},{"cell_type":"code","source":["!huggingface-cli login"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Dslu7X0xfZLW","executionInfo":{"status":"ok","timestamp":1684702456081,"user_tz":-420,"elapsed":618495,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"397c004e-8041-4d36-8ec7-d650a48cc57d"},"execution_count":3,"outputs":[{"output_type":"stream","name":"stdout","text":["\n"," _| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|\n"," _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n"," _|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|\n"," _| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n"," _| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|\n"," \n"," To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .\n","Token: \n","Add token as git credential? (Y/n) n\n","Token is valid.\n","Your token has been saved to /root/.cache/huggingface/token\n","Login successful\n"]}]},{"cell_type":"code","source":["!pip install zstandard"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"BkcH3vWufxSE","executionInfo":{"status":"ok","timestamp":1684702503036,"user_tz":-420,"elapsed":7196,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"923c33b0-7d94-4674-f632-c2ed1a54fa11"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n","Collecting zstandard\n"," Downloading zstandard-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 MB\u001b[0m \u001b[31m43.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: zstandard\n","Successfully installed zstandard-0.21.0\n"]}]},{"cell_type":"code","source":["from datasets import load_dataset\n","\n","# If the dataset is gated/private, make sure you have run huggingface-cli login\n","dataset = load_dataset(\"oscar-corpus/OSCAR-2301\", \"th\", streaming = True)\n","\n","dataset_shuffle = dataset.shuffle()"],"metadata":{"id":"IkEG4N6Zfgpn","colab":{"base_uri":"https://localhost:8080/","height":81,"referenced_widgets":["a1f38ee06c82413e9048a39dcadec01d","692fbc4764854e538080dd6f4445d89f","92a9c43961254cdb9b9e67f03595a86e","7784eb8996d94729ab6a5f4f008b7681","6b23646676e74d5f81b1a033a22d8643","1bd9d4cbc0a249b2a9fa38291c7099c1","c56634bbe96b47d38fc5fb75ffc178c0","c2073494b2e14961bf685efd11e3add3","0a72d75eafff42b0901a2546c69298b4","3a931b776a334803812ea4fef55be98e","882f9e7b2f914850813520937fca6f65","74cb47020377439783ab372fc122aa2a","2ac505036e004178b5038b9d9a398688","bf941d7948204aafb67c1670fcfd9090","a8edb396272e4ad4a227b5273bf6297c","1246198ebf9c45ecba72b615ecc53466","89e00dcad13140b0b23250c22d0ca51b","d20f6e0dc8ed40b4b0b284b16e657c4a","6d40c1c3052749b2a2a3e4aa414600e1","0fd0342dfebd4013be25fa6a030dd5de","a10ac5dc407842199b2543486f2c00e3","c2a1418da0b3413498ade99938f8e706"]},"executionInfo":{"status":"ok","timestamp":1684575833242,"user_tz":-420,"elapsed":9821,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b6edb26d-689a-419d-966b-c02a8d83e6a6"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":["Downloading builder script: 0%| | 0.00/22.3k [00:00#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}
DecisionTreeClassifier(max_depth=5)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
"]},"metadata":{},"execution_count":18}]},{"cell_type":"code","source":["import re\n","from pythainlp.util import countthai\n","\n","def check_containing_bad_keywords(text):\n","\n"," porn_keywords =[\"คลิปหลุด\",\"กระเจี๊ยว\",\"คลิปโป๊\",\"หนังโป๊\",\"หนังโป้\",\"หนังโป็\",\"เรื่องเสียว\",\"ซอยหี\",\"ชักว่าว\",\"ท่าหมา\",\"ขย่มควย\",\"เล่นเสียว\",\"ควยใหญ่\",\"หนังเอ็กซ์\",\"แหกหี\"]\n"," gamble_keywords = [\"ufabet\",\"UFABET\",\"ล้มโต๊ะ\", \"เซียนสเต็ป\",\"บอลเต็ง\",\"แทงบอล\",\"คาสิโน\",\"บาคาร่า\",\"เว็บสล็อต\",\"เกมสล็อต\",\"สล็อตออนไลน์\",\"คาสิโนออนไลน์\",\n"," \"หวยมาเลย์\", \"หวยฮานอย\", \"น้ำเต้าปูปลา\", \"หวยออนไลน์\" , \"แทงหวย\" , \"หวยหุ้น\", \"ยิงปลาออนไลน์\" ,\"ได้เงินจริง\",\"บา คา ร่า\"]\n"," movie_keywords =[\"ดูหนังออนไลน์\",\"หนังออนไลน์\",\"เว็บดูหนัง\",\"หนังชนโรง\",\"หนังใหม่ชนโรง\",\"เสียงไทย\",\"เสียงญี่ปุ่น\",\"เสียงอังกฤษ\"]\n"," like_keywords = [\"ปั้มไลค์\",\"รับจ้างกดไลค์\",\"จ้างไลค์\",\"ปั๊มไลค์\",\"ปั่นไลค์\",\"เพิ่มไลค์\",\"ซื้อไลค์\"]\n"," code_keywords =[\"padding:\",\"display:\",\"S3=n8\",\"phpBB Debug\",\"getElementById\",\"innerHTML\",\"parseInt\",\"addEventListener\",\"console\\.log\",\"checkCookieForTarget\",\"setAttribute\",\"getItem\",\"if \\(\",\"else {\",\"JSON\\.stringify\",\"onclick\"]\n","\n"," ratchakarn_website_keywords = [\"คุณกำลังใช้งานแบบปิดการใช้ Javascript\",\"Longdo Dictionary\",\"นโยบายการคุ้มครองข้อมูลส่วนบุคคล\",\"เงื่อนไขการให้บริการเว็บไซต์\",\"นโยบายความปลอดภัย\",\"นโยบายเว็บไซต์และการปฏิเสธความรับผิด\",\"คุณอาจจะยังไม่ได้เข้าสู่ระบบหรือยังไม่ได้ลงทะเบียน\",\"คุณไม่ได้เข้าสู่ระบบหรือคุณไม่มีสิทธิ์เข้าหน้านี้\"]\n","\n"," porn_keywords += [\" \".join(list(kw)) for kw in porn_keywords]\n"," gamble_keywords += [\" \".join(list(kw)) for kw in gamble_keywords]\n"," movie_keywords += [\" \".join(list(kw)) for kw in movie_keywords]\n","\n"," bad_keywords = porn_keywords + gamble_keywords + movie_keywords + like_keywords + code_keywords + ratchakarn_website_keywords\n","\n"," sparse_bad_keywords = []\n","\n"," pattern = '|'.join(bad_keywords) \n"," return bool(re.search(pattern, text))\n","\n","def check_ratio_bad_substring(text,n):\n"," month_to_count = [\"มกราคม\",\"กุมภาพันธ์\",\"มีนาคม\",\"เมษายน\",\"พฤษภาคม\",\"มิถุนายน\",\"กรกฎาคม\",\"สิงหาคม\",\"กันยายน\",\"ตุลาคม\",\"พฤศจิกายน\",\"ธันวาคม\",\n"," \"ม\\.ค\\.\",\"ก\\.พ\\.\",\"มี\\.ค\\.\",\"เม\\.ย\\.\",\"พ\\.ค\\.\",\"มิ\\.ย\\.\",\"ก\\.ค\\.\",\"ส\\.ค\\.\",\"ก\\.ย\\.\",\"ต\\.ค\\.\",\"พ\\.ย\\.\",\"ธ\\.ค\\.\"]\n"," special_to_count = [\"\\{\",\"\\+\",\"\\}\",\"/\",\":\"]\n","\n"," if len(re.findall(\"|\".join(month_to_count),text))/n > 0.015:\n"," return \"\"\n","\n"," if len(re.findall(\"|\".join(special_to_count),text))/n > 0.075:\n"," return \"\"\n","\n"," if len(re.findall(\" \",text))/n > 0.13:\n"," return \"\"\n","\n"," if len(re.findall(\",\",text))/n > 0.05:\n"," return \"\"\n","\n","def remove_bad_substring(text):\n"," to_replace_keywords = [\"Posted on\",\"Posted by\",\"Posted by:\",\"Posted By:\",\"สมาชิกหมายเลข [0-9,]+\",\"อ่าน [0-9,]+ ครั้ง\",\"เปิดดู [0-9,]+ ครั้ง\",\"ดู [0-9,]+ ครั้ง\",\"คะแนนสะสม: [0-9,]+ แต้ม\",\"ความคิดเห็น: [0-9,]+\",\n"," \"[0-9,]+ บุคคลทั่วไป กำลังดูบอร์ดนี้\",\"หน้าที่แล้ว ต่อไป\",\"ความคิดเห็นที่ [0-9,]+\",\"[0-9,]+ สมาชิก และ [0-9,]+ บุคคลทั่วไป\",\"กำลังดูหัวข้อนี้\",\"เข้าสู่ระบบด้วยชื่อผู้ใช้\",\n"," \"แสดงกระทู้จาก:\",\"กระทู้: [0-9,]+\",\"เว็บไซต์เรามีการใช้คุกกี้และเก็บข้อมูลผู้ใช้งาน โปรดศึกษาและยอมรับ นโยบายคุ้มครองข้อมูลส่วนบุคคล ก่อนใช้งาน\",\n"," \"Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use\\.\",\n"," \"Previous\\t\\nNext\\nLeave a Reply Cancel reply\\nYou must be logged in to post a comment.\\nSearch for:\\nFeatured Post\\n\",\n"," \"Click to read more\\nYou must be logged in to view or write comments\\.\",\"[0-9,]+ Views\",\"Skip to content\",\"Last Modified Posts\",\"Last Updated:\",\n"," \"\\(อ่าน [0-9,]+ ครั้ง\\)\",\"Recent Comments\",\"«.*?»\",\"< --แสดงทั้งหมด-- >\",\"นโยบายความเป็นส่วนตัว\",\"เงื่อนไขการใช้เว็บไซต์\",\"ตั้งค่าคุกกี้\",\"ท่านยอมรับให้เว็บไซต์นี้จัดเก็บคุกกี้เพื่อประสบการณ์การใช้งานเว็บไซต์ที่ดียิ่งขึ้น\",\n"," \"รวมถึงช่วยให้ท่านมีโอกาสได้รับข้อเสนอหรือเนื้อหาที่ตรงตามความสนใจของท่าน\",\"ท่านสามารถดู Privacy Notice ของเว็บไซต์เรา ได้ที่นี่\",\"You may be trying to access this site from a secured browser on the server. Please enable scripts and reload this page.\",\n"," \"เผยแพร่: \\d\\d [ก-๙]+ \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Last updated: \\d\\d [ก-๙]+\\.[ก-๙]+\\. \\d\\d\\d\\d \\d\\d:\\d\\d น\\.\",\"Lorem ipsum dolor sit amet, consectetur adipiscing elit\\.\",\n"," \"Search for:\",\"Save my name, email, and website in this browser for the next time I comment\",\"Your email address will not be published. Required fields are marked\",\n"," \"Leave a Reply Cancel reply\",\"((?:หน้าหลัก|เข้าสู่ระบบ|หน้าแรก) \\|(?: .+(?:(?: \\|)|$))+)\",\"กลับหน้าแรก\",\"ติดต่อเรา\",\"Contact Us\",\"#\\w+\",\"ติดต่อผู้ดูแลเว็บไซต์\",\n"," \"หากท่านพบว่ามีข้อมูลใดๆที่ละเมิดทรัพย์สินทางปัญญาปรากฏอยู่ในเว็บไซต์โปรดแจ้งให้ทราบ\",\"No related posts\",\"Posted in\",\"((?:Tags:|Tagged|Tag) (?:.{1,40}(?:,|\\n|$))+)\",\"ตอบ:\",\"Sort by:\",\n"," \"All rights reserved\",\"ความยาวอย่างน้อย\",\"ระบบได้ดำเนินการส่ง OTP\",\"เป็นสมาชิกอยู่แล้ว\\?\",\"We use cookies\",\"Cookie Settings\",\n"," \"Homeหน้าหลัก\", \"Home หน้าหลัก\", \"ข่าวสารล่าสุด\", \"ปัญหา การใช้งาน\", \"ปัญหาการใช้งาน\" \"ผู้เขียน\" ,\"หัวข้อ:\" ,\"\\*\\* พร้อมส่ง \\*\\*\"]\n"," \n"," return re.sub(\"|\".join(to_replace_keywords),\"\",text)\n","\n","def clean_text(text):\n","\n"," n=len(text)\n"," \n"," if check_containing_bad_keywords(text) or check_ratio_bad_substring(text,n) or countthai(text)<50:\n"," return \"\"\n"," \n"," text= remove_bad_substring(text)\n","\n"," return text\n","\n"],"metadata":{"id":"BFoFaVJwt_xl"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["oscar_df[\"clean_text1\"] = oscar_df[\"text\"].apply(clean_text)"],"metadata":{"id":"cCviEGgjuGhB"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["#classifier\n","oscar_df[\"clean_text2\"] = oscar_df[\"pred\"]==1"],"metadata":{"id":"Em-GUC7zuSz8"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["#perplexity + classifier\n","oscar_df[\"clean_text3\"] = model.predict(oscar_df[[\"log_score\"]])"],"metadata":{"id":"qhEC4Bgcv7gA"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# regex + classifier + perplexity\n","len(oscar_df[(oscar_df[\"clean_text2\"]==False) | (oscar_df[\"clean_text1\"]==\"\") | (oscar_df[\"clean_text3\"]==1)])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"iHO2Zm4kugBA","executionInfo":{"status":"ok","timestamp":1684575987472,"user_tz":-420,"elapsed":377,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"9a2f7820-71e5-4e3b-c481-383b997d6cf1"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["2940"]},"metadata":{},"execution_count":23}]},{"cell_type":"code","source":["2942/3972"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"mG6imvMzxs1K","executionInfo":{"status":"ok","timestamp":1683975767963,"user_tz":-420,"elapsed":2,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"a46cd5ba-88f5-4baa-d3bc-915867ab2411"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["0.7406847935548841"]},"metadata":{},"execution_count":99}]},{"cell_type":"code","source":["for i,text in enumerate(oscar_df[(oscar_df[\"clean_text3\"]==1) & (oscar_df[\"clean_text1\"]!=\"\")].sample(10)[\"text\"].tolist()):\n"," print(\"text {}\".format(i))\n"," print(text)\n"," print()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7bX9WVfbw7Uo","executionInfo":{"status":"ok","timestamp":1683975889474,"user_tz":-420,"elapsed":3,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"2ae06348-5d5d-47ec-8142-1352bc7dfe64"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["text 0\n","ที่โรงหนังเฮาส์ RCA เขาจะรวบรวมหนังเก่าคุณภาพของผู้กำกับชั้นครูมาให้ได้ชมกันทุกช่วงสิ้นเดือน เพื่อนำรายได้ไปสร้างห้องเก็บฟิล์มที่หอภาพยนตร์แห่งชาติ ส่วน ท่านมุ้ย ชวน “สตีเว่น สปีลเบิร์ก” ร่วมงานในหนังฟอร์มยักษ์ เพชรพระอุมา\n","เสี่ยเจียง-สมศักดิ์ เตชะรัตนประเสริฐ บอสใหญ่สหมงคลฟิล์ม ปลุกชีวิตหนังไทยในตำนานเมื่อกว่า 40 ปีก่อน โดยขอปัดฝุ่นหนังคุณภาพของผู้กำกับระดับบรมครู อาทิ หม่อมเจ้าชาตรีเฉลิม ยุคล , หม่อมหลวงพันธุ์เทวนพ เทวกุล, เพิ่มพล เชยอรุณ, ดอกดิน กัญญามาลย์ เรียงคิวเข้าฉายในสัปดาห์สุดท้ายของเดือน ตั้งแต่เดือนนี้ถึงเดือนสิงหาคม ที่โรงหนังเฮาส์ อาร์ซีเอ แค่ฟังชื่อหนังไม่ว่าจะเป็น แหม่มจ๋า , นกน้อย , เมืองในหมอก , มือปืน , สาละวิน , รอยไถ และช่างมันฉันไม่แคร์ ก็พอจะเป็นน้ำจิ้มเชิญชวนให้คอหนังมานั่งซึมซับอดีตผ่านแผ่นฟิล์มได้ไม่ยากเลย\n","งานนี้ท่านมุ้ยยังเผยเรื่องความคืบหน้าของหนัง ตำนานสมเด็จพระนเรศวร ว่าอาจจะขยายเรื่องราวยาวถึงขั้นต่อภาค 4 แต่ที่แน่นๆ ตอนนี้หนังภาค 3 ถ่ายทำใกล้เสร็จสมบูรณ์แล้ว เหลือเพียงขั้นตอนของคอมพิวเตอร์กราฟิกที่จะช่วยเติมเต็มความสมบูรณ์แบบของฉากยุทธหัตถี\n","ถึงแม้ว่าตำนานสมเด็จพระนเรศวรจะยังไม่ลงโรงฉาย แต่ท่านมุ้ยก็วางอนาคตทำหนังเรื่องใหม่ เพชรพระอุมา ต่อทันที ที่ถึงจะยังไม่ได้นักแสดงนำแต่ก็ทำงานล่วงหน้าทั้งการออกแบบงานสร้างรวมถึงงานกราฟิกที่เตรียมดึงสตีเวน สปีลเบิร์ก เข้ามามีส่วนร่วมเติมเต็มความอลังการ\n","ความคืบหน้าของสุดยอดความยิ่งใหญ่ในหนัง เพชรพระอุมา และ ตำนานสมเด็จพระนเรศวร จะมุ่งหน้าสู่ความยิ่งใหญ่และสมบูรณ์พร้อมให้คนไทยได้ชมเมื่อไรนั้น รออัพเดตแบบเจาะลึกได้ที่ไนน์เอ็นเตอร์เทน\n","\n","text 1\n","44:4 แล้วท่านก็นำข้าพเจ้ามาตามทางของประตูเหนือมาที่ข้างหน้าพระนิเวศน์ และข้าพเจ้ามองดู และดูเถิด สง่าราศีของพระเยโฮวาห์ก็เต็มพระนิเวศน์ของพระเยโฮวาห์ และข้าพเจ้าก็ซบหน้าลงถึงดิน\n","\n","text 2\n","นศ.คณะสถาปัตย์ฯลาดกระบัง ไอเดียเลิศ ชนะใจกรรมการ คว้ารางวัลยอดเยี่ยมจากเวทีออกแบบแดนลอดช่อง Singapore Furniture Design Award 2010 เผยความในใจ อยากให้คนไทยอุดหนุนสินค้าในประเทศ\n","นายศิรวัชร รังสฤษโยธิน นักศึกษาชั้นปี 5 สาขาวิชาศิลปะอุตสาหกรรม คณะสถาปัตยกรรมศาสตร์ สถาบันเทคโนโลยีพระจอมเกล้าเจ้าคุณทหารลาดกระบัง (สจล.) หนุ่มสถาปัตย์ฯ หัวคิดสร้างสรรค์ สร้างชื่อให้สถาบัน และประเทศไทย ในฐานะผู้คว้ารางวัล FDA Grand Aaward (ชนะเลิศ และ Best Materials Award (ใช้วัสดุยอดเยี่ยม) จากการเข้าร่วมประกวดในโครงการ Singapore Furniture Design Award 2010 ที่ผ่านไปเมื่อไม่นานมานี้\n","โดยหนุ่มนักออกแบบ ได้เล่าถึงประสบการณ์หลังจากได้รับ ว่าเป็นโครงการประกวดออกแบบเฟอร์นิเจอร์ระดับนานาชาติ มีประเทศเข้าร่วมการประกวด 19 ประเทศ มีทั้งหมด 3 รุ่น ซึ่งตัวเองได้เข้าไปประกวดในรุ่น Students Category คือ Young Designers Category และ Open Category\n","“ในปีนี้มีเพื่อนๆร่วมส่งผลงานเข้าประกวดจากชั้นปีเดียวกันจำนวน 15 คน แต่ผมเป็นตัวแทนเพียงคนเดียวที่ได้เข้ารอบสุดท้ายและได้โอกาสไปโชว์ผลงานที่ Singapore Expo ณ ประเทศสิงคโปร์ เมื่อต้นปีที่ผ่านมา ซึ่งจุดเริ่มต้นของการเข้าประกวดเริ่มจากอาจารย์กลุ่มเฟอร์นิเจอร์กำหนดให้นักศึกษาในสาขาการออกแบบเฟอร์นิเจอร์ชั้นที่ปี 5 ต้องส่งผลงานทุกคน อาจารย์เริ่มวางรากฐานไว้แบบนี้ทุกปี เด็กพระจอมเกล้าลาดกระบังจะได้มีชื่อในรายการนี้ทุกปี และเวลาพูดถึง FDA จะได้นึกถึง สจล. อันดับแรก อย่างเช่นนับย้อนไป 2 ปี รุ่นพี่ผมก็ได้รางวัลที่1 ปีที่แล้วรุ่นพี่ก็คว้าที่1 รุ่น young designer มาเหมือนกันครับ”\n","ส่วนแรงบันดาลใจในการออกแบบเฟอร์นิเจอร์นั้น ศิรวัชรเผยว่า งานชิ้นนี้เริ่มจากการใช้รูปทรงเรขาคณิต ที่มีความสมมาตร สมดุล ซึ่งแนวทางนี้เป็นแนวทางที่เขาชอบใช้ในงานออกแบบ และเพิ่มจังหวะและทิศทางให้ไม่ดูนิ่งจนเกินไป จากนั้นค่อยหาแรงบันดาลใจที่สามารถจับต้องและเข้าใจได้ง่าย\n","“สิ่งสำคัญต้องใกล้เคียงกับคำว่ารูปทรงเรขาคณิตในข้างต้น สิ่งที่ได้มาคือ ออริกามิ หรือ การพับกระดาษแบบญี่ปุ่น ซึ่งหากมองมันจริงๆ จะเห็นอะไรง่ายๆ ในตัวมันให้เล่นเยอะมาก เช่น ความเบา ความบาง รอยพับของกระดาษ สิ่งเหล่านี้เป็นสิ่งง่ายๆธรรมดาๆ แต่ที่ท้าทายคือเราจะนำเสนอให้กรรมการเห็นในรูปแบบไหน ส่วนความโดดเด่นของผลงานน่าจะเป็นด้านโครงสร้าง เพราะเป็นเฟอร์นิเจอร์ที่ไม่มีโครงสร้างที่เห็นจากภายนอก ทำให้ดูเหมือนนั่งไม่ได้ใช้ประโยชน์อะไรไม่ได้มากนัก แต่ที่จริงแล้วสามารถใช้ประโยชน์ได้จริง วัสดุที่ใช้คือไม้โอ๊คธรรมดาทั่วไป”\n","นอกจากรางวัลที่ได้รับแล้ว นักออกแบบหนุ่มจาก สจล. ยังเล่าถึงความประทับใจที่ได้รับว่า ได้ประสบการณ์อีกมากมาย\n","“ตั้งแต่การติดต่อโรงงาน ต้องเข้าไปเคลียร์แบบ drawing เพื่อผลิตจริง อย่างโมเดลตัวสุดท้าย กว่าจะได้มาต้องสั่งทำถึง 5 ตัว ในระหว่างนั้นได้เรียนรู้อะไรหลายอย่างที่สามารถนำไปใช้งานจริงได้แน่นอน แต่ที่ดีใจที่สุดคือ ได้เจอ Mr.Naoto Fukasawa นักออกแบบที่ผมชอบผลงานการออกแบบของเขามาก ซึ่งเขายังเป็นกรรมการตรวจผลงานและให้คะแนนเฟอร์นิเจอร์ของผมด้วย”\n","หนุ่มสถาปัตย์ฯ ไฟแรงยังทิ้งท้ายให้ข้อคิดว่า นับเป็นเรื่องน่าเสียดายที่คนไทยส่วนมากยังไม่บริโภคสินค้าประเภทนี้ หรืออุดหนุนสินค้าของคนไทยด้วยกันเองมากนัก\n","“อาจเป็นเพราะเศรษฐกิจในบ้านเรา หรือเรื่องอื่นๆที่ขัดขวางทางเจริญเติบโตของวงการนี้ ผมได้แต่หวังว่าในอนาคตอันใกล้เมืองไทยจะดีขึ้นกว่านี้ อย่างตอนผมไปที่สิงคโปร์ ได้มีโอกาสคุยกับนักศึกษาที่นั่น เขาเล่าให้ฟังเรื่องการสนับสนุนจากภาครัฐ ซึ่งต้องยอมรับว่านักศึกษาของประเทศสิงคโปร์ได้รับการสนับสนุนที่ดีกว่าเราจริงๆ” ศิรวัชรกล่าวทิ้งท้าย\n","อนึ่ง ผู้สนใจอยากเห็นผลงานจริง ของจริง แถมยังทดสอบนั่งได้จริง สามารถไปชมได้ที่งานครบรอบ 50 ปี พระจอมเกล้าลาดกระบัง ในวันที่ 24-27 สิงหาคม 2553 นี้ ณ สถาบันเทคโนโลยีพระจอมเกล้าเจ้าคุณทหารลาดกระบัง\n","\n","text 3\n","การศึกษาวิเคราะห์งานเขียนสารคดีเกี่ยวกับปัญหาครอบครัวไทยของ อรสม สุทธิสาคร : แนวคิดและกลวิธีการนำเสนอ\n","การศึกษาอิทธิพลของน้ำยาชุบเคมีต่อค่าความแข็งแรงในการยึดเกาะของผ้าใบยางรถยนต์ชนิดโพลีเอสเตอร์ โดยเทคนิคการออกแบบการทดลอง\n","การวิเคราะห์ผลงานแปลของตนเองด้วยการใช้เทคนิค RHM และ Retrospective TAP : กรณีศึกษาการแปลเรื่อง \"\"พันธุกรรมอันตราย\"\" ของ ไมเคิล ไครช์ตัน แปลโดย ทรงพล ศุขสุเมฆ\n","\n","text 4\n","Home/จัดโครงการประชาสัมพันธ์เพื่อส่งเสริมการท่องเที่ยวและสนับสนุนผู้ประกอบการ SME ที่เกี่ยวเนื่องกับการท่องเที่ยว โดย ปชส. ปราจีนบุรี (2558)/ปราจีนบุรี (29)\n","\n","text 5\n","เทคยุคของโนโลยีการสื่อสารในปัจจุบันนั้น ทันสมัยมาก ๆ ทำให้เกิดการเผยแพร่ความรู้ได้อย่างรวดเร็วและทั่วถึง ดังนั้น ประโยชน์ที่จะได้รับจากการเขียนบทความลงเว็บไซต์ก็คือ การเผยแพร่ความรู้ ไม่ว่าจะเป็นเกร็ดเล็กเกร็ดน้อย ความรู้ทั่วไป หรือความรู้เฉพาะทางก็ตามแต่ในการเลือกซื้อสินค้าหรือการเลือกใช้บริการต่างๆนั้น ในตัวของลูกค้าหรือผู้ใช้บริการนั้นมีความต้องการที่จะทราบถึงข้อมูลสินค้าและบริการต่างๆก่อนตัดสินใจในการเลือกซื้อเสมอ วันนี้ Gettaobao จะพาไปดูความสำคัญของบทความที่จะช่วยสร้างผลลัพธ์ที่ดีกับเว็บสั่งของจากจีนของเราได้อย่างง่ายดาย ประโยชน์ของการลงบทความ? การที่เรามีบทความลงอยู่ในหน้าเว็บสั่งของจากจีนของเรา จะช่วยให้ลูกค้าที่ต้องการหาข้อมูลเพื่อตัดสินใจในการสั่งซื้อสินค้าจากร้านค้าของเรานั้น จะช่วยให้ลูกค้าของเรานั้นได้ข้อมูลต่างๆที่ชัดเจน และการที่เราเขียนบทความใหม่ลงใน website ของเราบ่อยนั้นยิ่งเยอะเท่าไหร่ก็ยิ่งดี เพราะ เพราะระบบ Website จะเข้ามาทำการเก็บข้อมูลในหน้า website ที่มีการอัพเดทใหม่ได้ทุกวัน และข้อมูลของเราที่ลงไปนั้นก็จะยิ่งถูกมองเป็นตัวเลือกแรกๆ ของ Search engine (SEO) และทำให้ Website ของเรานั้น ติดอยู่ในอันดับต้นๆ ของการค้นหาอีกด้วย สำหรับพื้นในการลงบทความของเรานั้น เว็บสั่งของจากจีน ของเรานั้นน่าจะเหมาะสมที่สุด หากลูค้าของเราเข้ามาเลือกสินค้าแล้ว ลูกค้าต้องการที่จะทราบรายระเอียดต่างๆเพิ่มเติม ลูกค้าสามารถเข้าไปอ่านบทความเพิ่มเติมโดยที่ลูกค้าของเรานั้นยังอยู่ทีั่หน้าเว็บไซต์หน้าหลักของเราอยู่ ลูกค้าต้องการทราบรายละเอียดอื่นๆ เพิ่มเติมก็ให้ลูกค้ายังคงอยู่ในหน้าเว็บไซต์ร้านค้า แต่ไปยังบริเวณ \"บทความ\" (หรือจะเรียกว่า ข่าวสาร หรือ บล็อก (Blog)) เพื่อให้ลูกค้าทราบรายละเอียดต่างๆเพิ่มเติมจากบทความที่เจ้าของร้านค้านำเสนอให้ การที่เรามีพื้นที่ใช้ลงบทความหรือข่าวสารต่างๆบนเว็บไซต์ร้านค้าออนไลน์นั้น จะช่วยให้เจ้าเว็บสั่งของจากจีนหรือว่าเจ้าของธุรกิจออนไลน์มีพื้่นที่ไว้ให้นำเสนอข้อมูลต่างๆเกี่ยวกับความรู้ในตัวสินค้าเพื่อให้ลูกค้าหรือผู้ใช้บริการได้ทำความเข้าใจในตัวสินค้ารวมไปถึงการสั่งสินค้าข้อจำกัดต่างๆได้อีกด้วย [...]\n","\n","text 6\n","เป็นเพลงแรกในการแต่งเพลงที่แต่งได้จบเพลงครับ ถ้ามีโอกาสเข้ามาคอมเม้นให้ด้วยนะครับ ผมตั้งใจทำมากๆเลยครับเพลงนี้ เห่อๆ อยากจะบอกว่า ร้องทั้งคืนเลยทีเดียวครับ (บางครั้งก็ไม่อยากนึกเลยครับว่า เพลงๆนึงที่เราได้แต่งขึ้นมากลับกลายเป็นเพลงที่ตรงกับชีวิตตนเอง ซึ้งมันได้เกิดขึ้นกับผมไปแล้ววในวันวาเลนไทน์ )\n","\n","text 7\n","- ตั้งค่า NC (Normal Close) หรือ NO (Nornal Open) ได้ ปกติแผงควบคุมจะให้ตัวหยอดตั้งค่าเป็น NO เพื่อป้องกันการรับเหรียญเมื่อไฟดับ\n","รุ่น SG-9, CL-928, CL-168, 50H, UCA2 หรือ UCAES เป็นชนิดหลายเหรียญ ที่รับทั้งเหรียญ 1, 2, 5 และ 10 บาท\n","ตัวหยอดเหรียญชนิดหลายเหรียญรุ่น SG-9 รับเหรียญได้หลายชนิด(Multi Coin) สามารถรับเหรียญได้ดังนี้ 1,2,5 และ 10 บาท โดยลูกค้าสามารถโปรแกรมเองได้(ทางร้านได้โปรแกรมให้เรียบร้อยแล้ว) ไม่สามารถต่อมิเตอร์นับเหรียญได้ รายละเอียดสินค้า...\n","ตัวหยอดเหรียญชนิดหลายเหรียญรุ่น CL-928 รับเหรียญได้หลายชนิด(Multi Coin) สามารถรับเหรียญได้หลายชนิดดังนี้ 1,2,5 และ 10 บาทได้ โดยลูกค้าสามารถโปรแกรมเองได้(ทางร้านได้โปรแกรมให้เรียบร้อยแล้ว) สามารถต่อมิเตอร์นับเหรียญได้ (Can Connect Counter) รายละเอียดสินค้า...\n","ตัวหยอดเหรียญชนิดหลายเหรียญรุ่น CL-168 รับเหรียญได้หลายชนิด(Multi Coin) สามารถรับเหรียญได้ดังนี้ 1,2,5 และ 10 บาท โดยลูกค้าสามารถโปรแกรมเองได้(ทางร้านได้โปรแกรมให้เรียบร้อยแล้ว) สามารถต่อมิเตอร์นับเหรียญได้ รายละเอียดสินค้า...\n","ตัวหยอดเหรียญชนิดหลายเหรียญรุ่น UCA2 รับเหรียญได้หลายชนิด(Multi Coin) สามารถรับเหรียญ 1,2,5 และ 10 บาทได้ (ทางร้านได้โปรแกรม UCA2 ให้เรียบร้อยแล้ว) สามารถต่อ Counter ได้ นิยมใช้งานกับตู้เติมเงินมือถือ,ตู้น้ำมันหยอดเหรียญ,ตู้น้ำ รายละเอียดสินค้า...\n","ตัวหยอดเหรียญชนิดหลายเหรียญรุ่น UCAES รับเหรียญได้หลายชนิด(Multi Coin) สามารถรับเหรียญ 1,2,5 และ 10 บาทได้ (ทางร้านได้โปรแกรม UCAES ให้เรียบร้อยแล้ว) สามารถต่อ Counter ได้ นิยมใช้งานกับตู้เติมเงินมือถือ,ตู้น้ำมันหยอดเหรียญ,ตู้น้ำ รายละเอียดสินค้า...\n","ตัวหยอดเหรียญชนิดหลายเหรียญรุ่น HI-11FCS(50H) รับเหรียญได้หลายชนิด(Multi Coin) สามารถรับเหรียญ 1,2,5 และ 10 บาทได้ (ทางร้านได้โปรแกรมตัวหยอดเหรียญให้เรียบร้อยแล้ว) สามารถต่อ Counter ได้ นิยมใช้งานกับตู้น้ำหยอดเหรียญ รายละเอียดสินค้า...\n","ตัวหยอดเหรียญ หรือ อุปกรณ์หยอดเหรียญชนิดหลายเหรียญรุ่น UCAES แบบ RS-232 รับเหรียญได้หลายชนิดดังนี้(Multi-Coin) 1เก่า, 1ใหม่, 2เงิน, 2ทอง, 5บาง, 5หนา, และ 10บาท สามารถรับเหรียญ 1, 2, 5 และ 10 บาทได้ (ลูกค้าสามารถเลือกเหรียญที่จะรับเองได้โดย Dipswitch) รายละเอียดสินค้า...\n","ตัวหยอดเหรียญ หรือ อุปกรณ์หยอดเหรียญชนิดหลายเหรียญรุ่น UCA2 แบบ RS-232 รับเหรียญได้หลายชนิดดังนี้(Multi-Coin) 1เก่า, 1ใหม่, 2เงิน, 2ทอง, 5บาง, 5หนา, และ 10บาท สามารถรับเหรียญ 1, 2, 5 และ 10 บาทได้ (ลูกค้าสามารถเลือกเหรียญที่จะรับเองได้โดย Dipswitch) รายละเอียดสินค้า...\n","\n","text 8\n","เชื้อโรคม้าซื้อเว็บไซต์อย่างเป็นทางการ เธอลูบอวัยวะเพศเล็ก ๆ ของเขา, ความอ่อนแอหย่อนสมรรถภาพทางเพศ ฉีดแรง. กะหล่ำปลีฉันแรง ความอ่อนแอใน 25 สิ่งที่ต้องทำ, เชื้อโรคหญิง OLH การออกกำลังกายเพื่อขยายขนาดอวัยวะเพศ.\n","กล้วยไม้รักษาความอ่อนแอ ตัวแทนของผู้หญิงความปีติยินดี, เพิ่มขึ้นในความหนาของสมาชิกที่ Sniper เพื่อเพิ่มความแข็งแรง. เชื้อโรคที่พยายามสำหรับผู้หญิง สับปะรดและความแข็งแรง, วิธีการที่จะกระตุ้นผู้หญิงว่าเธอเป็นมากกว่า ผลวิดีโอของเชื้อโรคม้า.\n","ออริกาโนอ่อนแอ ยาแรงที่อ่อนแอ, การหย่าร้างเพราะสมาชิกที่มีขนาดเล็ก ประวัติความเป็นมาของความอ่อนแอ. เพิ่มขึ้นอายุรเวทในอำนาจ วิธีการปลุกระดมภาพถ่ายผู้หญิง, การฝึกอบรมสำหรับความอ่อนแอ หมายความว่า analogs สำหรับความแรง.\n","ซึ่งช่วยกระตุ้นผู้หญิง ซื้อเชื้อโรคเซนต์ปีเตอร์สเบิร์ก, ข้อเสนอแนะจาก Impaza เนยฟักทองและความแข็งแรง. เพิ่มสมาชิกเป็นเวลา 5 นาที แผลเล็ก ๆ บนอวัยวะเพศชาย, ขิงชายสูตรแรงวิดีโอ รากสีแดงสำหรับต่อมลูกหมากและความอ่อนแอ.\n","อาการ Panic วูบ หน้ามืด ตาลาย ใจสั่นระรัว : พบหมอรามา ช่วง Big Story 14 ธ.ค.59 (2/5) ผู้หญิงภายใต้ฉันม้าเชื้อโรค\n","เพิ่มสมาชิกเภสัชวิทยา อายุที่อ่อนแรง, เคียฟซื้อค้อนของ ธ ​​อร์ พฤติกรรมของผู้หญิงที่เอาเชื้อโรค. การฉีดเพื่อเพิ่มความแข็งแรง เชื้อโรคม้าซึ่งสามารถซื้อได้ใน Novosibirsk, เหมือนการค้อนลดลงความคิดเห็นพรู เพิ่มยาพื้นบ้านแรง.\n","เก็บกวาดเป็นผลกระทบต่อความแรงที่ สำหรับผักแรง, กิจกรรมใน Maynkraft บนค้อนของ ธ ​​อร์ ยาเพิ่มขึ้นแรงในผู้ชายมากกว่า 60. สมาชิกยาเสพติดเพิ่มขึ้น ชาย 30 ปีแรง, ในรอบ 17 ปีที่จะเพิ่มสมาชิก แปลงน้ำอ่อนแอ.\n","ยาโป๊สำหรับผู้หญิงในหยด ลดลงในราคาค้อนชายของ ธ ​​อร์ในร้านขายยา, แพทย์คนหนึ่งรักษาความอ่อนแอ เพิ่มบทเรียนสมาชิกฟรี. เพิ่มเทคนิค Jelqing สมาชิก ขาอ่อนแอแรงอ่อนแอ, หญ้าสำหรับเลี้ยงคนแรง เพิ่มอุปกรณ์สมาชิกชั่วคราว.\n","เพิ่มสมาชิกทางจริง ความอ่อนแอ Rostov on Don, ลดลงซื้อพรูใน Shymkent วิธีการที่จะกระตุ้นผู้หญิงว่าเธอได้เสร็จสิ้นการวิดีโอ. พืชแรงดีขึ้น ผู้หญิงวิดีโอภายใต้อิทธิพลของเชื้อโรค, ประโยชน์สกีแรง เนื้อเพลงของค้อนของ ธ ​​อร์.\n","กรด nicotinic สำหรับแรงชาย ประหลาดใจสั้นเหตุการณ์ตลกในทางที่จะค้อนของ ธ ​​อร์, ซื้อค้อนลดลงของ ธ ​​อร์ในร้านขายยาใน Yekaterinburg ยากระตุ้นผู้ชาย. จุดฝังเข็มเพื่อเพิ่มความแข็งแรง การออกกำลังกายเพื่อขยายขนาดอวัยวะเพศ, การประยุกต์ใช้สารกระตุ้น การกระทำของผู้หญิงในฐานะตัวแทนสาเหตุ.\n","การฟื้นฟูบ้านแรง สมุนไพรแรงรัสเซีย, ไม่ว่าจะมีเงินทุนที่ตื่นเต้นผู้หญิง รักษาความอ่อนแอใน Voronezh. ซื้อค้อนลดลงของ ธ ​​อร์ในร้านขายยา Vologda นวดวิดีโอเพื่อเพิ่มความแข็งแรง, สมาชิกพิจารณาต่อไปอีกหน่อย เอวชายและความแข็งแรง.\n","โรคเบาหวาน และความแข็งแรง ความอ่อนแอและจิตวิทยา, โปรแกรมสมาชิกเพิ่มขึ้น ขยายขนาดอวัยวะเพศธรรมชาติ. แคปซูลโสมแรง สูตรประชาชนเพื่อความอ่อนแอ, เชื้อโรคหญิง Ufa ซื้อ เตรียมชีวจิตของความอ่อนแอ.\n","Exciter ม้าสำหรับผู้หญิงที่จะซื้อใน Samara เพิ่มขึ้นถั่วน้ำผึ้งแรงกระเทียม, เหตุผลแรงซบเซา ซื้อม้าเชื้อโรคโซซี. เทโป๊สาว ชาแข็งแรงแรง, สาวสิ่งที่คุณทำเมื่อกระตุ้น เมื่อมีความอ่อนแอในผู้ชาย.\n","Obninsk รักษาความอ่อนแอ เพิ่มขึ้นในสมาชิก Ulyanovsk, ช่วยในการรักษาความอ่อนแอ ยาความอ่อนแอชาย. ซื้อหยดเชื้อโรค Lugansk ซื้อค้อนลดลงของ ธ ​​อร์ใน, ยากับมาตรฐานความอ่อนแอชาย แปลงแรง.\n","คนที่ได้เพิ่มขึ้นอวัยวะเพศตนเอง ซื้อยาเสพติดค้อนของ ธ ​​อร์, อดัมสูตรรากแรง ออกกำลังกายแรงทางจิตวิทยา. ตะไคร้และความแข็งแรงเพิ่มขึ้น วิธีในการเพิ่มความแข็งแรง, มากกว่าที่จะเพิ่มสมาชิกฟรี เมล็ดฟักทองช่วยเพิ่มความแข็งแรง.\n","เป็นคนที่จะเริ่มต้นผู้หญิงวิดีโอ Buy Levitra พ่ายแพ้ความอ่อนแอชาย, ที่ชาญฉลาดเพื่อเพิ่มความแข็งแรง ทำไมสมาชิกเพิ่มขึ้น. การนวดควรจะทำเพื่อเพิ่มสมาชิก meldonium และความแข็งแรง, ซื้อเชื้อโรคในร้านขายยาสำหรับสาว ๆ กามีค้อนของ ธ ​​อร์.\n","หยดช่วยเพิ่มความแข็งแรง น้ำว่านหางจระเข้กับน้ำผึ้งสำหรับความอ่อนแอ, ปัสสาวะบ่อย, อ่อนแอ กลิ่นเชื้อโรคสำหรับผู้หญิง. ชาอียิปต์เพื่อเพิ่มความแข็งแรง การรักษาชำนาญในเพศศาสตร์ของความอ่อนแอ, ซื้อ Exciter การแสดงความคิดเห็นผู้หญิง วิตามินเพื่อเพิ่มความแข็งแรง.\n","\n","text 9\n","รหัสC977 ให้เช่าตึกอาคารพาณิชย์ 2คูหาย่านพระราม3 เหมาะทำออฟฟิศสำนักงาน **ให้เช่า** ราคาเช่า 100,000 บาท/เดือน ( มัดจำ2 ล่วงหน้า1 ) ติดต่อคุณ ต้น โทร 091-782 8924 Line.seng.789 อาคารพาณิชย์ 2คูหา 3ชั้น ย่านพระราม3เหมาะทำออฟฟิศสำนักงาน เนื้อที่ 82 ตารางวา office ด้านหน้าสามารถประกอบธุรกิจได้ 10 ห้องทำงาน ( สามารถทำเป็นห้องนอนได้ตามความเหมาะสม ) จอดรถได้ 4 คัน -ห้องน้ำมีครบทุกห้อง -มีห้องครัวใหญ่ 1ห้อง -มีห้องเก็บของ 1ห้อง -ตึกติดริมถนนพระราม3 เหมาะกับประกอบธุรกิจหลายรูปแบบ -ใกล้ทางด่วน -ใกล้ BRTพระราม3 -ใกล้โลตัสพระราม3 -ใกล้เซ็นทรัลพระราม3 ภายในสะอาดรีโนเวทเสร็จใหม่ การเดินทางสะดวกใกล้ทางด่วนและสะพานภูมิพล สถานที่ตั้ง:ถนนพระราม3 แขวงช่องนนทรี เขตยานนนาวา กรุงเทพ\n","\n"]}]},{"cell_type":"code","source":["import matplotlib.pyplot as plt \n","\n","sample_df1 = oscar_df[oscar_df[\"clean_text3\"]==1]\n","sample_df2 = oscar_df[oscar_df[\"clean_text3\"]==0]\n","\n","\n","plt.scatter(sample_df1[\"log_score\"].tolist(),sample_df1[\"clean_text3\"].tolist(),color=\"red\")\n","plt.scatter(sample_df2[\"log_score\"].tolist(),sample_df2[\"clean_text3\"].tolist(),color=\"blue\")\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":430},"id":"XdcWTOR16BMk","executionInfo":{"status":"ok","timestamp":1684576004952,"user_tz":-420,"elapsed":401,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"c27f4486-0096-46c1-ee43-eae8d97376ca"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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pLFjx6p///6qqKiQJP3+97/X9OnT9dxzzyk/Pz9yb0nPnj3Vs2fPDtwVAADQFcUdRkpLS7V3715Nnz5dfr9fw4YNU2VlZeSm1p07dyol5fAFl7lz56qxsVE/+clPotZTXl6u+++//9uNHgAAdHlxv2fEBt4zAgBA15OQ94wAAAB0NMIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKxKtT0AW0IhacUKaflyqbJS2rChaV48hg6V1q2TCgqkNWti77dggTR+fHzbApA4oZD09tvSrl3S3r1S375S//7SqFGS0xnfOnbvlnJz4+uL5GX7uDlwQBozRtq6VRo4UPrTn6SePTtv+xHmOMyePdsMGDDAuN1uM3LkSLNq1ap22z///PPm7LPPNm632wwePNi89tprcW0vEAgYSSYQCBzPcFtYssSYPn2MkexOAOxbssSYvLzW/43m5TUtP551xNoXycv2cTNiROvH/YgRHbeNWM/fcZ8SFy1aZFwul1mwYIH58MMPzU033WQyMzNNXV1dq+3fffdd43Q6zcMPP2w2btxo7rvvPtOtWzezfv36mLfZkWFkyRL7IYRAApwYliwxxuFo/9+ow9H+yaGtdTgcx+6L5GX7uGkriHR0IIn1/O0wxph4rqQUFRVpxIgRmj17tiQpHA7L6/Xqjjvu0OTJk1u0Ly0t1cGDB/Xqq69G5l1wwQUaNmyY5s2bF9M2g8GgMjIyFAgElJ6eHs9wo4RC0oABTZdiTxR8ZQPYEQpJ+fnSZ5+1387hkPLypO3bW14+P9Y62uuL5GX7uDlwQOrV69jt6uu//Vc2sZ6/47qBtbGxUTU1NfL5fIdXkJIin8+n6urqVvtUV1dHtZekkpKSNttLUkNDg4LBYNTUEZq/Ez6R/PzntkcAJKe33z52EJGa/p9YW9vUPt51tNcXycv2cTNmTMe26whxhZF9+/YpFArJ4/FEzfd4PPL7/a328fv9cbWXpIqKCmVkZEQmr9cbzzDbtHt3h6wGwEkg3s+D1trHug4+e3Ak28fN1q0d264jnJCP9k6ZMkWBQCAy1dbWdsh6c3M7ZDUATgLxfh601j7WdfDZgyPZPm4GDuzYdh0hrjCSlZUlp9Opurq6qPl1dXXKyclptU9OTk5c7SXJ7XYrPT09auoIo0Y1Pa53IlmwwPYIgOQ0alTT9/LH4nBIXm9T+7bW4XDE3xfJy/Zx86c/dWy7jhBXGHG5XCooKFBVVVVkXjgcVlVVlYqLi1vtU1xcHNVekpYvX95m+0RyOqXHH+/0zbaLm1cBO5xO6bHH2j4hHGnWrNZvJGxeh9RyPc1/b6svkpft46ZnT2nEiPbbjBjRye8bifcxnUWLFhm3220WLlxoNm7caG6++WaTmZlp/H6/McaYMWPGmMmTJ0fav/vuuyY1NdU8+uijZtOmTaa8vNzqo73G8J4RAIe1954Rr/f43zMSa18kL9vHzYn0npG4H+2VpNmzZ+uRRx6R3+/XsGHD9Pjjj6uoqEiS9L3vfU/5+flauHBhpP0LL7yg++67Tzt27NCZZ56phx9+WFdccUXM2+uoR3uPxBtYATTjDaywxfZxk+g3sMZ6/j6uMNLZEhFGAABAYiXkPSMAAAAdjTACAACsIowAAACrCCMAAMAqwggAALCKMAIAAKwijAAAAKsIIwAAwCrCCAAAsCrV9gBi0fyS2GAwaHkkAAAgVs3n7WO97L1LhJH6+npJktfrtTwSAAAQr/r6emVkZLS5vEv8bppwOKzPP/9cvXr1kiOW3/fdhmAwKK/Xq9raWn7HTSuoT/uoT/uoT/uoT/uoT/u6an2MMaqvr1e/fv2UktL2nSFd4spISkqK8vLyOmx96enpXeqH2dmoT/uoT/uoT/uoT/uoT/u6Yn3auyLSjBtYAQCAVYQRAABgVVKFEbfbrfLycrndbttDOSFRn/ZRn/ZRn/ZRn/ZRn/ad7PXpEjewAgCAk1dSXRkBAAAnHsIIAACwijACAACsIowAAACrkiqMzJkzR/n5+UpLS1NRUZFWr15te0id4l//+pdGjx6tfv36yeFw6OWXX45abozR9OnTlZubq+7du8vn8+njjz+OavPFF1/o+uuvV3p6ujIzM3XjjTfqwIEDnbgXiVFRUaERI0aoV69eys7O1jXXXKPNmzdHtfn66681YcIE9enTRz179tSPf/xj1dXVRbXZuXOnrrzySvXo0UPZ2dmaNGmSDh061Jm7khBz587VkCFDIi9aKi4u1uuvvx5Znsy1ac1DDz0kh8OhO++8MzIvmWt0//33y+FwRE2DBg2KLE/m2jTbtWuXfvazn6lPnz7q3r27zj//fL3//vuR5Unz+WySxKJFi4zL5TILFiwwH374obnppptMZmamqaursz20hFu2bJmZOnWqeemll4wks3Tp0qjlDz30kMnIyDAvv/yy+e9//2uuuuoqc9ppp5mvvvoq0uYHP/iBGTp0qHnvvffM22+/bc444wxz7bXXdvKedLySkhLzzDPPmA0bNph169aZK664wpx66qnmwIEDkTa33HKL8Xq9pqqqyrz//vvmggsuMBdeeGFk+aFDh8zgwYONz+cza9euNcuWLTNZWVlmypQpNnapQ73yyivmtddeM1u2bDGbN2829957r+nWrZvZsGGDMSa5a3O01atXm/z8fDNkyBAzceLEyPxkrlF5ebk577zzzO7duyPT3r17I8uTuTbGGPPFF1+YAQMGmBtuuMGsWrXKbNu2zbzxxhvmk08+ibRJls/npAkjI0eONBMmTIj8PRQKmX79+pmKigqLo+p8R4eRcDhscnJyzCOPPBKZt3//fuN2u81f//pXY4wxGzduNJLMf/7zn0ib119/3TgcDrNr165OG3tn2LNnj5FkVq5caYxpqkW3bt3MCy+8EGmzadMmI8lUV1cbY5rCXkpKivH7/ZE2c+fONenp6aahoaFzd6AT9O7d2/zxj3+kNkeor683Z555plm+fLn57ne/GwkjyV6j8vJyM3To0FaXJXttjDHmnnvuMRdffHGby5Pp8zkpvqZpbGxUTU2NfD5fZF5KSop8Pp+qq6stjsy+7du3y+/3R9UmIyNDRUVFkdpUV1crMzNThYWFkTY+n08pKSlatWpVp485kQKBgCTplFNOkSTV1NTom2++iarPoEGDdOqpp0bV5/zzz5fH44m0KSkpUTAY1IcfftiJo0+sUCikRYsW6eDBgyouLqY2R5gwYYKuvPLKqFpIHD+S9PHHH6tfv346/fTTdf3112vnzp2SqI0kvfLKKyosLNRPf/pTZWdna/jw4Zo/f35keTJ9PidFGNm3b59CoVDUAS1JHo9Hfr/f0qhODM37315t/H6/srOzo5anpqbqlFNOOanqFw6Hdeedd+qiiy7S4MGDJTXtu8vlUmZmZlTbo+vTWv2al3V169evV8+ePeV2u3XLLbdo6dKlOvfcc6nN/7do0SKtWbNGFRUVLZYle42Kioq0cOFCVVZWau7cudq+fbtGjRql+vr6pK+NJG3btk1z587VmWeeqTfeeEO33nqrfvnLX+rZZ5+VlFyfz13it/YCnWHChAnasGGD3nnnHdtDOaGcffbZWrdunQKBgF588UWNGzdOK1eutD2sE0Jtba0mTpyo5cuXKy0tzfZwTjiXX3555M9DhgxRUVGRBgwYoOeff17du3e3OLITQzgcVmFhoWbMmCFJGj58uDZs2KB58+Zp3LhxlkfXuZLiykhWVpacTmeLu7Tr6uqUk5NjaVQnhub9b682OTk52rNnT9TyQ4cO6Ysvvjhp6nf77bfr1Vdf1VtvvaW8vLzI/JycHDU2Nmr//v1R7Y+uT2v1a17W1blcLp1xxhkqKChQRUWFhg4dqscee4zaqOmrhj179ug73/mOUlNTlZqaqpUrV+rxxx9XamqqPB5P0tfoSJmZmTrrrLP0ySefcPxIys3N1bnnnhs175xzzol8lZVMn89JEUZcLpcKCgpUVVUVmRcOh1VVVaXi4mKLI7PvtNNOU05OTlRtgsGgVq1aFalNcXGx9u/fr5qamkibN998U+FwWEVFRZ0+5o5kjNHtt9+upUuX6s0339Rpp50WtbygoEDdunWLqs/mzZu1c+fOqPqsX78+6gNh+fLlSk9Pb/FBczIIh8NqaGigNpIuvfRSrV+/XuvWrYtMhYWFuv766yN/TvYaHenAgQPaunWrcnNzOX4kXXTRRS1eJbBlyxYNGDBAUpJ9Ptu+g7azLFq0yLjdbrNw4UKzceNGc/PNN5vMzMyou7RPVvX19Wbt2rVm7dq1RpKZOXOmWbt2rfn000+NMU2PjmVmZpq//e1v5oMPPjBXX311q4+ODR8+3Kxatcq888475swzz+xyj4615tZbbzUZGRlmxYoVUY8ffvnll5E2t9xyizn11FPNm2++ad5//31TXFxsiouLI8ubHz+87LLLzLp160xlZaXp27fvSfH44eTJk83KlSvN9u3bzQcffGAmT55sHA6H+cc//mGMSe7atOXIp2mMSe4a3X333WbFihVm+/bt5t133zU+n89kZWWZPXv2GGOSuzbGND0Onpqaan73u9+Zjz/+2PzlL38xPXr0MH/+858jbZLl8zlpwogxxjzxxBPm1FNPNS6Xy4wcOdK89957tofUKd566y0jqcU0btw4Y0zT42PTpk0zHo/HuN1uc+mll5rNmzdHreN///ufufbaa03Pnj1Nenq6GT9+vKmvr7ewNx2rtbpIMs8880ykzVdffWVuu+0207t3b9OjRw/zox/9yOzevTtqPTt27DCXX3656d69u8nKyjJ33323+eabbzp5bzrez3/+czNgwADjcrlM3759zaWXXhoJIsYkd23acnQYSeYalZaWmtzcXONyuUz//v1NaWlp1Ds0krk2zf7+97+bwYMHG7fbbQYNGmSeeuqpqOXJ8vnsMMYYO9dkAAAAkuSeEQAAcOIijAAAAKsIIwAAwCrCCAAAsIowAgAArCKMAAAAqwgjAADAKsIIAACwijACAACsIowAAACrCCMAAMAqwggAALDq/wHaIkcS0PsB6wAAAABJRU5ErkJggg==\n"},"metadata":{}}]},{"cell_type":"code","source":["oscar_df[\"clean_text3\"].value_counts()"],"metadata":{"id":"7fyPeuIr7Q1z","executionInfo":{"status":"ok","timestamp":1684576061977,"user_tz":-420,"elapsed":374,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"84b2719a-d64a-4aaa-eccb-949dcbf60fe1","colab":{"base_uri":"https://localhost:8080/"}},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["1 2145\n","0 1827\n","Name: clean_text3, dtype: int64"]},"metadata":{},"execution_count":26}]},{"cell_type":"markdown","source":["# Sample spam "],"metadata":{"id":"k0-ZS3nVkM3r"}},{"cell_type":"code","source":["spam_df = oscar_df[(oscar_df[\"clean_text3\"]==1) & (oscar_df[\"clean_text1\"]!=\"\")]"],"metadata":{"id":"gwQS_yxijuuA"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import numpy as np\n","x_data = spam_df[\"log_score\"]\n","\n","mu = np.mean(x_data) # mean of x_data\n","sigma = np.std(x_data) # standard deviation of x_data\n","x_curve = np.linspace(min(x_data), max(x_data), 100) # x values for the curve\n","y_curve = 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-(x_curve - mu)**2 / (2 * sigma**2)) # Gaussian curve equation\n","\n","# plt.hist(x_data)\n","\n","plt.plot(x_curve, y_curve, color='red', label='Gaussian Curve')"],"metadata":{"id":"dLzy5L8kka4g"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def sample_text(texts,log_scores,percentage = 0.1 , replace = True):\n","\n"," ''' sample from log score distribution of language model'''\n"," np.random.seed(0)\n","\n"," lower_bound, upper_bound= min(log_scores), max(log_scores)\n","\n"," mean, std = np.mean(log_scores), np.std(log_scores)\n","\n"," sampled_scores = scipy.stats.truncnorm.rvs((lower_bound-mean)/std,\n"," (upper_bound -\n"," mean)/std,\n"," loc=mean, scale=std, size=int(percentage*len(texts)))\n"," \n"," sampled_texts = []\n"," selected_score = []\n","\n"," selected_idx = set()\n","\n"," for samp_score in sampled_scores:\n","\n"," min_diff, min_idx = float(\"inf\"), -1\n","\n"," min_score = -1\n","\n"," for idx,s in enumerate(log_scores) : \n","\n"," if idx in selected_idx :\n"," continue \n","\n"," diff = (samp_score-s)**2\n"," if diff < min_diff:\n"," min_diff = diff\n"," min_idx = idx\n"," min_score = s\n","\n"," \n"," sampled_texts.append(texts[min_idx])\n"," selected_score.append(min_score)\n","\n"," if not replace : \n"," selected_idx.add(min_idx)\n","\n"," return sampled_texts , selected_score\n","\n"," \n","texts = spam_df[\"text\"].tolist()\n","log_scores = spam_df[\"log_score\"].tolist()\n","percentage = 0.1\n","\n","\n","tmp, tmp_score = sample_text(texts, log_scores, percentage=percentage)\n","tmp2, tmp_score2 = sample_text(texts, log_scores,replace=False, percentage=percentage)"],"metadata":{"id":"xbIJPQEpmvIB"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["for i in range(20):\n"," print(tmp[i])\n"," print()"],"metadata":{"id":"tLDjiZ7EzPej"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import matplotlib.pyplot as plt \n","\n","plt.scatter(spam_df[\"log_score\"].tolist(), [2]*len(spam_df),color=\"green\")\n","plt.scatter(tmp_score, [1]*len(tmp_score),color=\"red\")\n","plt.scatter(tmp_score2, [0]*len(tmp_score),color=\"blue\")\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":430},"id":"AYp2qDwDt8No","executionInfo":{"status":"ok","timestamp":1684580268080,"user_tz":-420,"elapsed":452,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"6b0a8d5c-ac82-4ff8-f9b7-9a5237525629"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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ALRjYYeWiooKDRkyRIsXLw6p/Hvvvac77rhDf/zjH7V9+3bddtttuvvuu7Vz586gcgMHDlRxcXFg+eCDD8LtGgAAaMc6hFthzJgxGjNmTMjlFyxYEPT65z//ud544w394Q9/0LBhwy50pEMHJSUlhdsdAABwhWj1a1pqamp0+vRpxcXFBa3ft2+fUlJS1LdvX9133306fPhwg21UVlbK5/MFLQAAoH1r9dDyi1/8QuXl5br33nsD69LS0pSbm6sNGzZo6dKlKioq0siRI3X69Ol628jJyZHL5Qosbre7tboPAADaiM0YY5pd2WbTunXrNG7cuJDK/+53v9O0adP0xhtvKCMjo8FyZWVl6tWrl+bPn6/777+/zvbKykpVVlYGXvt8Prndbnm9XjmdzrDHAQAAWp/P55PL5Qr5/B32NS3NtWrVKj3wwANavXp1o4FFkmJjY3Xttddq//799W53OBxyOBwt0U0AAHCZapWvh1577TVNnTpVr732mu66664my5eXl+vAgQNKTk5uhd4BAAArCPuTlvLy8qBPQIqKilRYWKi4uDj17NlT2dnZOnbsmF555RVJ/q+EJk+erIULFyotLU0ej0eSFBMTI5fLJUl68skndffdd6tXr146fvy4Zs+eLbvdrokTJ0ZijAAAoB0I+5OWbdu2adiwYYHblbOysjRs2DDNmjVLklRcXBx058+LL76o8+fPa/r06UpOTg4sjz32WKDM0aNHNXHiRA0YMED33nuvunXrpo8++kjdu3e/1PEBAIB24pIuxL1chHshDwAAaHvhnr/520MAAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASCC0AAMASOrR1ByyhqkpaskTat0+y2aS0NCklRaqult5/Xzp/XvrsM+mTTySvV6qs9NeLipL695fsdqlHD/+/u3eX7r9fOndO6tRJ2r1b6tOn5cewd680cKC/zzabdNdd0nXX+defPSv16ydlZkqvv+4fh9PpL+9ySYWF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/kjcf/zHf+jLX/6y4uLitHnzZmVnZ6u4uFjz589vw95GTmZmpu655x716dNHBw4c0I9//GONGTNGBQUFstvtV9xxsHLlSnXp0qXOV+Tt6Tio71wYyrnA4/HU+zujdluoCC0hmj59unbt2hV0PYekoO9mBw0apOTkZN1+++06cOCA+vXr19rdjLgxY8YE/j148GClpaWpV69e+v3vf6+YmJg27FnbWL58ucaMGaOUlJTAuvZ+DKBx586d07333itjjJYuXRq0LSsrK/DvwYMHKzo6Wv/+7/+unJycdvGo9wkTJgT+PWjQIA0ePFj9+vVTfn6+br/99jbsWdtYsWKF7rvvPnXq1ClofXs6Dho6F7YWvh4KwSOPPKI333xT7777rlJTUxstm5aWJknav39/a3St1cXGxuraa6/V/v37lZSUpKqqKpWVlQWVKSkpUVJSUtt0sAUdOnRIb7/9th544IFGy7X3Y6D2vf3inQEXv+9JSUk6ceJE0Pbz58/rs88+a1fHRm1gOXTokDZu3Bj0KUt90tLSdP78eR08eLB1OtjK+vbtq/j4+MCxf6UcB5L0/vvva+/evU3+fpCsexw0dC4M5VyQlJRU7++M2m2hIrQ0whijRx55ROvWrdM777yjPn36NFmnsLBQkpScnNzCvWsb5eXlOnDggJKTkzV8+HB17NhReXl5ge179+7V4cOHlZ6e3oa9bBkvv/yyEhISdNdddzVarr0fA3369FFSUlLQ++7z+bRly5bA+56enq6ysjJt3749UOadd95RTU1NINRZXW1g2bdvn95++21169atyTqFhYWKioqq85VJe3H06FGVlpYGjv0r4TiotXz5cg0fPlxDhgxpsqzVjoOmzoWhnAvS09P1ySefBIXY2qB//fXXh9UZNOChhx4yLpfL5Ofnm+Li4sBy5swZY4wx+/fvNz/5yU/Mtm3bTFFRkXnjjTdM3759za233trGPY+cJ554wuTn55uioiLz4YcfmoyMDBMfH29OnDhhjDHmBz/4genZs6d55513zLZt20x6erpJT09v415HXnV1tenZs6d56qmngta312Pg9OnTZufOnWbnzp1Gkpk/f77ZuXNn4M6Y5557zsTGxpo33njDfPzxx2bs2LGmT58+5vPPPw+0kZmZaYYNG2a2bNliPvjgA9O/f38zceLEthpS2Bqbg6qqKvOtb33LpKammsLCwqDfD7V3QmzevNk8//zzprCw0Bw4cMC8+uqrpnv37mbSpEltPLLQNTYHp0+fNk8++aQpKCgwRUVF5u233zZf/vKXTf/+/c3Zs2cDbbTn46CW1+s1nTt3NkuXLq1Tvz0cB02dC41p+lxw/vx5c8MNN5g777zTFBYWmg0bNpju3bub7OzssPpCaGmEpHqXl19+2RhjzOHDh82tt95q4uLijMPhMNdcc42ZMWOG8Xq9bdvxCBo/frxJTk420dHRpkePHmb8+PFm//79ge2ff/65efjhh03Xrl1N586dzbe//W1TXFzchj1uGX/+85+NJLN3796g9e31GHj33XfrPfYnT55sjPHf9jxz5kyTmJhoHA6Huf322+vMTWlpqZk4caK5+uqrjdPpNFOnTjWnT59ug9E0T2NzUFRU1ODvh3fffdcYY8z27dtNWlqacblcplOnTuZLX/qS+fnPfx50Qr/cNTYHZ86cMXfeeafp3r276dixo+nVq5eZNm1a0C2txrTv46DWr3/9axMTE2PKysrq1G8Px0FT50JjQjsXHDx40IwZM8bExMSY+Ph488QTT5hz586F1Rfb/+8QAADAZY1rWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCUQWgAAgCX8P0Uokb+PfcasAAAAAElFTkSuQmCC\n"},"metadata":{}}]},{"cell_type":"code","source":["len(tmp),len(set(tmp)),len(tmp2),len(set(tmp2))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"NYJNovh5rnIL","executionInfo":{"status":"ok","timestamp":1684578597880,"user_tz":-420,"elapsed":3,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"b662cee7-d2ef-4182-f324-7008c2da0137"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(214, 154, 214, 214)"]},"metadata":{},"execution_count":60}]},{"cell_type":"code","source":["tmp "],"metadata":{"id":"TxrWCrVMta_j"},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git a/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/Perplexity.ipynb b/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/Perplexity.ipynb new file mode 100644 index 0000000..5e3a7fb --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/Perplexity.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyOzQJUGCFNCPojmbzHpZ7jS"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"fkREVSTw0S1-","executionInfo":{"status":"ok","timestamp":1685902763798,"user_tz":-420,"elapsed":5752,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"58a1ce0f-a766-4213-a301-a245cef2a3e1"},"outputs":[{"output_type":"stream","name":"stdout","text":["Downloading...\n","From: https://drive.google.com/uc?id=1OBbo21v_-esL31rxtNtsMHrA8T1JYqAd\n","To: /content/core.zip\n","100% 538M/538M [00:04<00:00, 108MB/s] \n"]}],"source":["!gdown 1OBbo21v_-esL31rxtNtsMHrA8T1JYqAd"]},{"cell_type":"code","source":["!unzip /content/core.zip"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ALjpsLqf0c24","executionInfo":{"status":"ok","timestamp":1684783363926,"user_tz":-420,"elapsed":14218,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"e48418ec-bad9-4b46-b0aa-a0a60ffb1092"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Archive: /content/core.zip\n","replace th.sp.model? [y]es, [n]o, [A]ll, [N]one, [r]ename: A\n"," inflating: th.sp.model \n"," inflating: th.sp.vocab \n"," inflating: tmp_dataset.csv \n"," inflating: decision_tree.sav \n"," inflating: th.arpa.bin \n"]}]},{"cell_type":"code","source":["!pip install kenlm"],"metadata":{"id":"QmepTY4d0uCA"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["!pip install sentencepiece"],"metadata":{"id":"PU08OQXn0-v6"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import kenlm\n","import math\n","import numpy as np\n","import pickle\n","import scipy\n","import sentencepiece # type: ignore\n","from text_normalizer import normalize\n","from typing import List\n","\n","\n","class SentencesLM:\n"," \"\"\"Returns the score of each individual paragraph.\"\"\"\n","\n"," def __init__(self):\n"," lm_config = kenlm.Config()\n"," lm_config.load_method = 2\n","\n"," lm_model_filename = \"th.arpa.bin\"\n"," self.lm = kenlm.Model(str(lm_model_filename), lm_config)\n"," self.sp = sentencepiece.SentencePieceProcessor()\n"," self.sp.load(\"th.sp.model\")\n","\n"," def pp(self, log_score, length) -> float:\n"," \"\"\"Compute perplexity score\"\"\"\n"," return 10.0 ** (-log_score / length)\n","\n"," def do(self, document) -> float: # type: ignore\n"," \"\"\"Compute perplexity for each line of document\"\"\"\n"," total_pp = 0\n"," total_length = 0\n"," for line in document:\n"," line = normalize(line, accent=False)\n"," tokenized_line = \" \".join(self.sp.encode_as_pieces(line))\n"," log_score = self.lm.score(tokenized_line)\n"," length = len(line.split()) + 1\n","\n"," total_length += length\n"," total_pp += log_score\n"," return round(self.pp(total_pp, total_length), 1)\n","\n","\n","classifier_filename = \"decision_tree.sav\"\n","classifier = pickle.load(open(classifier_filename, \"rb\"))\n","\n","lm = SentencesLM()\n","\n","\n","def classify_spam(text: str):\n"," \"\"\"Classify if text is spam using perplexity and decision tree as thresholder\"\"\"\n","\n"," pp_score = lm.do(text.split(\"\\n\"))\n","\n"," log_pp_score = math.log(pp_score)\n","\n"," prediction = classifier.predict(np.array([log_pp_score]).reshape(1, 1))\n","\n"," return prediction, log_pp_score\n","\n","\n","def sample_score(log_scores, n, percentage=0.1) -> np.ndarray:\n"," np.random.seed(0)\n","\n"," lower_bound, upper_bound = min(log_scores), max(log_scores)\n","\n"," mean, std = np.mean(log_scores), np.std(log_scores)\n","\n"," sampled_scores = scipy.stats.truncnorm.rvs(\n"," (lower_bound - mean) / std,\n"," (upper_bound - mean) / std,\n"," loc=mean,\n"," scale=std,\n"," size=int(percentage * n),\n"," )\n","\n"," return sampled_scores\n","\n","\n","def sample_text_back(texts, log_scores, percentage=0.1, replace=True) -> List[str]:\n"," \"\"\"Sample some spam text back in the dataset\n"," using log score distribution of language model\"\"\"\n","\n"," sampled_scores = sample_score(log_scores, len(texts), percentage)\n","\n"," sampled_texts = []\n","\n"," selected_idx = set()\n","\n"," for samp_score in sampled_scores:\n"," min_diff, min_idx = float(\"inf\"), -1\n","\n"," for idx, s in enumerate(log_scores):\n"," if idx in selected_idx:\n"," continue\n","\n"," diff = (samp_score - s) ** 2\n"," if diff < min_diff:\n"," min_diff = diff\n"," min_idx = idx\n","\n"," sampled_texts.append(texts[min_idx])\n","\n"," if not replace:\n"," selected_idx.add(min_idx)\n","\n"," return sampled_texts\n"],"metadata":{"id":"Cflbmogv0sBd"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# Compute perplexity \n","lm.do([\"หนังxจีนมาใหม่ TM0165 แม่เลี้ยงสาวWang Xiaoni หลับอยู่ เจอลูกเลี้ยงชวนเพื่อนมารุมเย็ดแม่เลี้ยง จับมอมยาสลบก่อนลวนลามลงมืดข่มขืนxxx สวิง 3-1 เย็ดจนแตกในซะใจ\"])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"xkktYQTU4Y_n","executionInfo":{"status":"ok","timestamp":1684782836220,"user_tz":-420,"elapsed":2,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"0e200f94-f25b-468d-8884-0be3466762eb"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["40.69115244919519"]},"metadata":{},"execution_count":13}]},{"cell_type":"code","source":["# Classify spam \n","\n","classify_spam(\"หนังxจีนมาใหม่ TM0165 แม่เลี้ยงสาวWang Xiaoni หลับอยู่ เจอลูกเลี้ยงชวนเพื่อนมารุมเย็ดแม่เลี้ยง จับมอมยาสลบก่อนลวนลามลงมืดข่มขืนxxx สวิง 3-1 เย็ดจนแตกในซะใจ\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"gxlZRRlJ34n5","executionInfo":{"status":"ok","timestamp":1684782756391,"user_tz":-420,"elapsed":320,"user":{"displayName":"Chawakorn Phiantham","userId":"05119468888744169723"}},"outputId":"145e54f0-2ee5-4f14-c486-3f262c83acf4"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.10/dist-packages/sklearn/base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n"," warnings.warn(\n"]},{"output_type":"execute_result","data":{"text/plain":["(array([1]), 40.69115244919519)"]},"metadata":{},"execution_count":11}]},{"cell_type":"code","source":["# sampled spam texts back 10% since we want model to know some of them\n","import pandas as pd\n","df = pd.read_csv(\"/content/tmp_dataset.csv\")\n","\n","texts = df[\"text\"]\n","log_scores = df[\"log_score\"]\n","sampled_texts = sample_text_back(texts,log_scores)\n","sampled_texts[:5]"],"metadata":{"id":"k7e4m0xj5h9o"},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git "a/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/\340\270\252\340\270\263\340\271\200\340\270\231\340\270\262\340\270\202\340\270\255\340\270\207_CCNET_RedPajama.ipynb" "b/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/\340\270\252\340\270\263\340\271\200\340\270\231\340\270\262\340\270\202\340\270\255\340\270\207_CCNET_RedPajama.ipynb" new file mode 100644 index 0000000..700c143 --- /dev/null +++ "b/src/data/openthaigpt_pretraining_data/internet/perplexity/notebook/\340\270\252\340\270\263\340\271\200\340\270\231\340\270\262\340\270\202\340\270\255\340\270\207_CCNET_RedPajama.ipynb" @@ -0,0 +1,3229 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "machine_shape": "hm" + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "gpuClass": "standard", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "86043daa9efa498da8701aa999b6a4c5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cd124b05602f451e85c5bd67f2359438", + "IPY_MODEL_4493abf46bec416b8a47674091fb5425", + "IPY_MODEL_076d34b9c4f54c2eb28cf8759a15a48a" + ], + "layout": "IPY_MODEL_71f57f6e43cb4cf7830e8b7e7f28478b" + } + }, + "cd124b05602f451e85c5bd67f2359438": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_82c196ac433940a9ac6c51cae2a6b754", + "placeholder": "​", + "style": "IPY_MODEL_a36ed42066c04d849ebe7828e2637182", + "value": "Downloading builder script: 100%" + } + }, + "4493abf46bec416b8a47674091fb5425": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8f8bea4345794591a6b23fe172096995", + "max": 22336, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9accb90487f7403ab3e4a9a54a5161b1", + "value": 22336 + } + }, + "076d34b9c4f54c2eb28cf8759a15a48a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_80742304eb5f47a9b49d9295d5603cbc", + "placeholder": "​", + "style": "IPY_MODEL_e6b2568ca9d34b99a75a1fe441e646c1", + "value": " 22.3k/22.3k [00:00<00:00, 1.06MB/s]" + } + }, + "71f57f6e43cb4cf7830e8b7e7f28478b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "82c196ac433940a9ac6c51cae2a6b754": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a36ed42066c04d849ebe7828e2637182": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8f8bea4345794591a6b23fe172096995": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9accb90487f7403ab3e4a9a54a5161b1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "80742304eb5f47a9b49d9295d5603cbc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e6b2568ca9d34b99a75a1fe441e646c1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f83712cf6a524edbb96da4db11476af8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_75a6d550c55d47a4a7e638db41f2a26b", + "IPY_MODEL_c095a07ee66b43c1bb6a3af1eb6add3b", + "IPY_MODEL_d58ec47269084519a66af12d261622d2" + ], + "layout": "IPY_MODEL_0d0dc7030cb3421d912e4bf75907bcac" + } + }, + "75a6d550c55d47a4a7e638db41f2a26b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5d9dc7b01e9741369472e32acbcbabe7", + "placeholder": "​", + "style": "IPY_MODEL_db0c53d712f6450090cf8a3fa5c44a80", + "value": "Downloading readme: 100%" + } + }, + "c095a07ee66b43c1bb6a3af1eb6add3b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c0c611b9e71d4bf08b04a61bf567e918", + "max": 37423, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_33bc798b9d0547699bac8dfa11149ff2", + "value": 37423 + } + }, + "d58ec47269084519a66af12d261622d2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5fe899860c634d8e8a9430b141a3d27a", + "placeholder": "​", + "style": "IPY_MODEL_c2ce52fbe7bd42beabe229f32906e0c4", + "value": " 37.4k/37.4k [00:00<00:00, 146kB/s]" + } + }, + "0d0dc7030cb3421d912e4bf75907bcac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5d9dc7b01e9741369472e32acbcbabe7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "db0c53d712f6450090cf8a3fa5c44a80": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c0c611b9e71d4bf08b04a61bf567e918": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "33bc798b9d0547699bac8dfa11149ff2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5fe899860c634d8e8a9430b141a3d27a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c2ce52fbe7bd42beabe229f32906e0c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "f0lZBR0jXf11" + }, + "outputs": [], + "source": [ + "!git clone https://github.com/new5558/RedPajama-Data.git" + ] + }, + { + "cell_type": "code", + "source": [ + "%cd RedPajama-Data/data_prep/cc/cc_net" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bMkGkceKXkp-", + "outputId": "bec158da-60bc-44db-a4b1-6079c63d9d0c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "/content/RedPajama-Data/data_prep/cc/cc_net\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!make install" + ], + "metadata": { + "id": "lcJWPl0-Xx7C" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# !rm -rf data/cirrus/\n", + "# !rm -rf data/lm_sp/\n", + "!mkdir data\n", + "!mkdir data/cirrus" + ], + "metadata": { + "id": "06Vz725UZd-1" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!mkdir data/cirrus/txt\n", + "!mkdir data/cirrus/sp" + ], + "metadata": { + "id": "AlIuG45BdqF5" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!make lang=th lm" + ], + "metadata": { + "id": "DLw9XtuPXznY" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!ls -lh /content/RedPajama-Data/data_prep/cc/cc_net/data/lm_sp" + ], + "metadata": { + "id": "CZvhyZbCZOwh" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!pip install kenlm" + ], + "metadata": { + "id": "RCOzoRrQfT2T", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "cb86b37c-e68c-4397-c304-3e6952a76e38" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting kenlm\n", + " Downloading kenlm-0.1.tar.gz (424 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m425.0/425.0 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + "Building wheels for collected packages: kenlm\n", + " Building wheel for kenlm (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for kenlm: filename=kenlm-0.1-cp310-cp310-linux_x86_64.whl size=3003872 sha256=7f20327c876d34059ca593ac3f9add71d32a6d058d0d1ded4a40cf5639b25eae\n", + " Stored in directory: /root/.cache/pip/wheels/4e/3a/01/9105a071c30781823efbd96a58279c16f948a87cafb1144042\n", + "Successfully built kenlm\n", + "Installing collected packages: kenlm\n", + "Successfully installed kenlm-0.1\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install transformers datasets zstandard sentencepiece" + ], + "metadata": { + "id": "gVle8rEnfl28", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1ad96763-0903-4141-ce45-de0a19650bfc" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", + "Collecting transformers\n", + " Downloading transformers-4.29.2-py3-none-any.whl (7.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.1/7.1 MB\u001b[0m \u001b[31m56.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting datasets\n", + " Downloading datasets-2.12.0-py3-none-any.whl (474 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m474.6/474.6 kB\u001b[0m \u001b[31m36.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting zstandard\n", + " Downloading zstandard-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.7 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.7/2.7 MB\u001b[0m \u001b[31m63.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting sentencepiece\n", + " Downloading sentencepiece-0.1.99-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m69.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)\n", + "Collecting huggingface-hub<1.0,>=0.14.1 (from transformers)\n", + " Downloading huggingface_hub-0.14.1-py3-none-any.whl (224 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.5/224.5 kB\u001b[0m \u001b[31m20.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.22.4)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)\n", + "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)\n", + "Collecting tokenizers!=0.11.3,<0.14,>=0.11.1 (from transformers)\n", + " Downloading tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.8/7.8 MB\u001b[0m \u001b[31m97.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)\n", + "Requirement already satisfied: pyarrow>=8.0.0 in /usr/local/lib/python3.10/dist-packages (from datasets) (9.0.0)\n", + "Collecting dill<0.3.7,>=0.3.0 (from datasets)\n", + " Downloading dill-0.3.6-py3-none-any.whl (110 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.5/110.5 kB\u001b[0m \u001b[31m12.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from datasets) (1.5.3)\n", + "Collecting xxhash (from datasets)\n", + " Downloading xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m212.5/212.5 kB\u001b[0m \u001b[31m15.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting multiprocess (from datasets)\n", + " Downloading multiprocess-0.70.14-py310-none-any.whl (134 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m134.3/134.3 kB\u001b[0m \u001b[31m11.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: fsspec[http]>=2021.11.1 in /usr/local/lib/python3.10/dist-packages (from datasets) (2023.4.0)\n", + "Collecting aiohttp (from datasets)\n", + " Downloading aiohttp-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.0/1.0 MB\u001b[0m \u001b[31m62.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting responses<0.19 (from datasets)\n", + " Downloading responses-0.18.0-py3-none-any.whl (38 kB)\n", + "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (23.1.0)\n", + "Requirement already satisfied: charset-normalizer<4.0,>=2.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->datasets) (2.0.12)\n", + "Collecting multidict<7.0,>=4.5 (from aiohttp->datasets)\n", + " Downloading multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (114 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m114.5/114.5 kB\u001b[0m \u001b[31m10.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting async-timeout<5.0,>=4.0.0a3 (from aiohttp->datasets)\n", + " Downloading async_timeout-4.0.2-py3-none-any.whl (5.8 kB)\n", + "Collecting yarl<2.0,>=1.0 (from aiohttp->datasets)\n", + " Downloading yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (268 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m268.8/268.8 kB\u001b[0m \u001b[31m25.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting frozenlist>=1.1.1 (from aiohttp->datasets)\n", + " Downloading frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (149 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m149.6/149.6 kB\u001b[0m \u001b[31m8.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting aiosignal>=1.1.2 (from aiohttp->datasets)\n", + " Downloading aiosignal-1.3.1-py3-none-any.whl (7.6 kB)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.14.1->transformers) (4.5.0)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)\n", + "Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->datasets) (2022.7.1)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas->datasets) (1.16.0)\n", + "Installing collected packages: tokenizers, sentencepiece, zstandard, xxhash, multidict, frozenlist, dill, async-timeout, yarl, responses, multiprocess, huggingface-hub, aiosignal, transformers, aiohttp, datasets\n", + "Successfully installed aiohttp-3.8.4 aiosignal-1.3.1 async-timeout-4.0.2 datasets-2.12.0 dill-0.3.6 frozenlist-1.3.3 huggingface-hub-0.14.1 multidict-6.0.4 multiprocess-0.70.14 responses-0.18.0 sentencepiece-0.1.99 tokenizers-0.13.3 transformers-4.29.2 xxhash-3.2.0 yarl-1.9.2 zstandard-0.21.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!cp /content/RedPajama-Data/data_prep/cc/cc_net/data/lm_sp/th.arpa.bin /content/drive/MyDrive/Openthaigpt/th.arpa.bin" + ], + "metadata": { + "id": "jNtFy0seKQOx" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import time\n", + "import kenlm\n", + "import sentencepiece # type: ignore\n", + "from typing import Optional\n", + "from cc_net.text_normalizer import normalize\n", + "\n", + "def get_lm(lang: Optional[str]) -> Optional[kenlm.Model]:\n", + " if lang is None:\n", + " return None\n", + " start_load = time.time()\n", + "\n", + " lm_config = kenlm.Config()\n", + " lm_config.load_method = 2\n", + "\n", + " model = f'/content/RedPajama-Data/data_prep/cc/cc_net/data/lm_sp/{lang}.arpa.bin'\n", + "\n", + " lm = kenlm.Model(str(model), lm_config)\n", + " load_time = time.time() - start_load\n", + " print(f\"Loaded (took {load_time / 60:.1f}min)\")\n", + "\n", + " return lm\n", + "\n", + "def pp(log_score, length):\n", + " return 10.0 ** (-log_score / length)\n", + "\n", + "sp = sentencepiece.SentencePieceProcessor()\n", + "sp.load(f'/content/RedPajama-Data/data_prep/cc/cc_net/data/lm_sp/th.sp.model') # TODO: Add model\n", + "\n", + "class SentencesLM:\n", + " \"\"\"Returns the score of each individual paragraph.\"\"\"\n", + " model = get_lm('th')\n", + "\n", + "\n", + "\n", + " def do(self, document) -> Optional[str]: # type: ignore\n", + "\n", + " sentences = []\n", + " total_pp = 0\n", + " total_length = 0\n", + " for line in document:\n", + " # if self.normalize:\n", + " line = normalize(line, accent = False)\n", + " tokenized_line = \" \".join(sp.encode_as_pieces(line))\n", + " # print(tokenized_line, 'tokenized_line')\n", + " log_score = self.model.score(tokenized_line)\n", + " length = len(line.split()) + 1\n", + "\n", + " total_length += length\n", + " total_pp += log_score\n", + "\n", + " # sentences.append(f\"{pp(log_score, length)}\\t{line}\")\n", + "\n", + " # return \"\\n\".join(sentences)\n", + " return round(pp(total_pp, total_length), 1)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UmeoeJ_3q1S9", + "outputId": "054a1d0f-0afc-4ebb-da80-c28b4242a4ff" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Loaded (took 0.0min)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "lm = SentencesLM()" + ], + "metadata": { + "id": "kPykJkcertPP" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(lm.do(['ตั้งแต่ ค.ศ. 1908 เขาได้เป็นประธานกองทุนประกันแรงงาน', 'สาธารณรัฐโซเวียตฮังการี เป็นสาธารณรัฐที่มีอยู่เป็นเวลาสั้น ๆ ในภูมิภาคยุโรปตะวันออก มีอาณาเขตครอบคลุมดินแดนประมาณ 23% ของดินแดนฮังการีในอดีต']))" + ], + "metadata": { + "id": "ucL2MzwOrvHc", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "f312fe1f-0548-4f77-cfab-708e64f9c969" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "10384.5\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "!huggingface-cli login" + ], + "metadata": { + "id": "9smsZmYK66TX", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "acd5e501-3e43-4364-bec8-4dd44c46509a" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + " _| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_|\n", + " _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n", + " _|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_|\n", + " _| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _|\n", + " _| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_|\n", + " \n", + " To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .\n", + "Token: \n", + "Add token as git credential? (Y/n) n\n", + "Token is valid.\n", + "Your token has been saved to /root/.cache/huggingface/token\n", + "Login successful\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "from datasets import load_dataset\n", + "\n", + "# If the dataset is gated/private, make sure you have run huggingface-cli login\n", + "dataset = load_dataset(\"oscar-corpus/OSCAR-2301\", \"th\", streaming = True)" + ], + "metadata": { + "id": "z-1Zk4_a67TA", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 81, + "referenced_widgets": [ + "86043daa9efa498da8701aa999b6a4c5", + "cd124b05602f451e85c5bd67f2359438", + "4493abf46bec416b8a47674091fb5425", + "076d34b9c4f54c2eb28cf8759a15a48a", + "71f57f6e43cb4cf7830e8b7e7f28478b", + "82c196ac433940a9ac6c51cae2a6b754", + "a36ed42066c04d849ebe7828e2637182", + "8f8bea4345794591a6b23fe172096995", + "9accb90487f7403ab3e4a9a54a5161b1", + "80742304eb5f47a9b49d9295d5603cbc", + "e6b2568ca9d34b99a75a1fe441e646c1", + "f83712cf6a524edbb96da4db11476af8", + "75a6d550c55d47a4a7e638db41f2a26b", + "c095a07ee66b43c1bb6a3af1eb6add3b", + "d58ec47269084519a66af12d261622d2", + "0d0dc7030cb3421d912e4bf75907bcac", + "5d9dc7b01e9741369472e32acbcbabe7", + "db0c53d712f6450090cf8a3fa5c44a80", + "c0c611b9e71d4bf08b04a61bf567e918", + "33bc798b9d0547699bac8dfa11149ff2", + "5fe899860c634d8e8a9430b141a3d27a", + "c2ce52fbe7bd42beabe229f32906e0c4" + ] + }, + "outputId": "960eeb10-f81c-4b17-d320-702488724b64" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading builder script: 0%| | 0.00/22.3k [00:00" + ] + }, + "metadata": {}, + "execution_count": 35 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "df = pd.read_csv(\"/content/drive/MyDrive/Openthaigpt/toy_df_for_classify.csv\")" + ], + "metadata": { + "id": "MxsYQiTpHRs7" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import math\n", + "from tqdm import tqdm\n", + "result = []\n", + "labels = []\n", + "c=0\n", + "for i,item in tqdm(enumerate(df[\"text\"].tolist())):\n", + " try :\n", + " score = lm.do(item.split(\"\\n\"))\n", + " except:\n", + " score = 4e274\n", + " c+=1\n", + "\n", + " result.append(score)\n", + " if i<1972:\n", + " labels.append(1)\n", + " else:\n", + " labels.append(0)\n", + "\n", + "df[\"score\"] = result\n", + "df[\"log_score\"] = df[\"score\"].apply(math.log)\n", + "\n", + "print(c)" + ], + "metadata": { + "id": "u6MUUm-4rCb5", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "8854411e-e8a1-4b33-e0c8-0cc1c982ef79" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "3972it [00:10, 384.75it/s]" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "3\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "df[\"labels\"]=labels" + ], + "metadata": { + "id": "-LjMz6DmGVKa" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(df, df[\"labels\"], test_size=0.2, random_state=42,stratify=df[\"labels\"])\n", + "\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "model = DecisionTreeClassifier(max_depth = 2)" + ], + "metadata": { + "id": "rgeE49Z1GEEW" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "model.fit(X_train[[\"log_score\"]],y_train)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 74 + }, + "id": "AfOqVuqjMHPi", + "outputId": "d1971022-3cf3-4861-f390-a8cdb573b126" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "DecisionTreeClassifier(max_depth=2)" + ], + "text/html": [ + "
DecisionTreeClassifier(max_depth=2)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ] + }, + "metadata": {}, + "execution_count": 26 + } + ] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.metrics import classification_report,confusion_matrix\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "train_pred = model.predict(X_train[[\"log_score\"]])\n", + "print(classification_report(y_train,train_pred))\n", + "\n", + "def plot_confusion_matrix(labels,pred):\n", + " cm = confusion_matrix(labels,pred)\n", + "\n", + " sns.heatmap(cm, annot=True, cmap=\"Blues\", fmt='g', )\n", + "\n", + " # Set axis labels\n", + " plt.xlabel('Predicted labels')\n", + " plt.ylabel('True labels')\n", + " plt.title('Confusion Matrix')\n", + "\n", + " def annotate():\n", + " annotations = [\"True Negative\",\"False Positive\",\"False Negative\",\"True Positive\"]\n", + " annot_idx = 0\n", + " for i in range(cm.shape[0]):\n", + " for j in range(cm.shape[1]):\n", + " plt.text(j+0.5, i+0.35, annotations[annot_idx],\n", + " ha=\"center\", va=\"center\",\n", + " color=\"white\" if (i+j)%2==0 else \"black\")\n", + " annot_idx+=1\n", + " annotate()\n", + " plt.show()\n", + "\n", + "plot_confusion_matrix(y_train,train_pred)\n", + "\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 628 + }, + "id": "6heghj_rMO8_", + "outputId": "6f966000-b220-49ce-f890-6aa9cedf0c0d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.78 0.28 0.41 1600\n", + " 1 0.56 0.92 0.69 1577\n", + "\n", + " accuracy 0.60 3177\n", + " macro avg 0.67 0.60 0.55 3177\n", + "weighted avg 0.67 0.60 0.55 3177\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "test_pred = model.predict(X_test[[\"log_score\"]])\n", + "print(classification_report(y_test,test_pred))\n", + "plot_confusion_matrix(y_test,test_pred)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 628 + }, + "id": "X_Wy_Qy-DdN0", + "outputId": "0375bb43-066d-4360-add4-18e9fbb12566" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.74 0.19 0.31 400\n", + " 1 0.53 0.93 0.68 395\n", + "\n", + " accuracy 0.56 795\n", + " macro avg 0.64 0.56 0.49 795\n", + "weighted avg 0.64 0.56 0.49 795\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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qZX01ShMNoiIiCQmK9m5BudsEBERkbRY2SAiIpIYh1GIiIhIUiU81+AwChEREUnLLMlGcnKyObohIiIqlgQz/VdUmZxsfPXVV1i5cqXhc/fu3VGqVCmULl0ap06dMmtwRERExYFMMM9WVJmcbCxYsAA+Pj4AgMjISERGRmLz5s1o27YtRo8ebfYAiYiIqGgzeYJoQkKCIdnYsGEDunfvjqCgIJQrVw6NGjUye4BERERFXUlfjWJyZcPZ2RnXr18HAGzZsgWBgYEAAFEUodPpzBsdERFRMSAI5tmKKpMrG126dEGvXr1QuXJl3L9/H23btgUAnDhxApUqVTJ7gERERFS0mZxszJo1C+XKlcP169cxffp02NnZAQBu376NDz/80OwBEhERFXUl/RXzJicbSqUSo0aNyrN/xIgRZgmIiIiouCnhuUbBko2///67wB2+9dZbLxwMERFRcVTSJ4gWKNno3LlzgToTBIGTRImIiMhIgZINvV4vdRxERETFVgkvbLzci9iysrJgZWVlrliIiIiKpZI+QdTk52zodDpMmTIFpUuXhp2dHa5cuQIAGDduHBYuXGj2AImIiKhoMznZmDp1KhYvXozp06dDpVIZ9tesWRM///yzWYMjIiIqDgQzbUWVycnGr7/+ih9//BG9e/eGXC437K9Tpw4uXrxo1uCIiIiKA0EQzLIVVSYnGzdv3sz3SaF6vR5ardYsQREREVHxYXKy4efnh3379uXZ/+eff6Ju3bpmCYqIiKg4KemvmDd5Ncr48eMREhKCmzdvQq/XY/Xq1YiOjsavv/6KDRs2SBEjERFRkVaUh0DMweTKRqdOnbB+/Xps374dtra2GD9+PC5cuID169ejdevWUsRIRERERdgLPWejadOmiIyMNHcsRERExVIJL2y8+EO9jh49igsXLgDIncdRv359swVFRERUnJT0YRSTk40bN26gZ8+eOHDgAJycnAAAycnJeOONN7BixQqUKVPG3DESEREVaUV5cqc5mDxnY+DAgdBqtbhw4QKSkpKQlJSECxcuQK/XY+DAgVLESEREREWYyZWNPXv24ODBg6hataphX9WqVTFnzhw0bdrUrMEREREVBxxGMZGPj0++D+/S6XTw9vY2S1BERETFSclONV5gGGXGjBkYPnw4jh49ath39OhRfPzxx5g5c6ZZgyMiIqKir0CVDWdn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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "import pickle\n", + "filename = '/content/decision_tree.sav'\n", + "pickle.dump(model, open(filename, 'wb'))\n", + "\n" + ], + "metadata": { + "id": "YqE9ldg1IxHx" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "df.to_csv(\"/content/drive/MyDrive/Openthaigpt/tmp_dataset.csv\",index=False)" + ], + "metadata": { + "id": "estKB1fdRCzH" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "df[:1972][\"log_score\"].describe()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "jqx-EzQ6B2LK", + "outputId": "bcdece05-00d8-4346-d227-5cf3c033950b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "count 1972.000000\n", + "mean 7.805707\n", + "std 0.064806\n", + "min 7.275934\n", + "25% 7.780763\n", + "50% 7.808282\n", + "75% 7.832054\n", + "max 8.595838\n", + "Name: log_score, dtype: float64" + ] + }, + "metadata": {}, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "source": [ + "df[\"text\"][1974]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 330 + }, + "id": "H6fKG6UkDo_U", + "outputId": "c2cc5553-fe06-438f-e26a-9e66a1601295" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'บ่อน้ำผุดธรรมชาติ ตั้งอยู่ในสวนกาญจนาภิเษก ตำบล หมูสี อำเภอ ปากช่อง ลักษณะของน้ำจะใสและเย็นมาก ซึ่งน้ำจะไหลอยู่ตลอดเวลา สามารถลงเล่นน้ำได้ ถ้าเป็นช่วงหน้าฝนน้ำจะเยอะกว่าปกติ ตรงที่จอดรถน้ำผุดจะมีอาหารขายอยู่ ไก่ย่าง ส้มตำ ถั่วต้ม หน้าทางเข้ามีกางเกงเล่นน้ำขาย ห้ามนำเครื่องดื่มแอลกฮอล เหล้า เบียร์เข้าไปทาน\\nจากแยกผ่าน The Smoke House มุ่งหน้าไปทาง Palio, อช. เขาใหญ่ จับระยะทางประมาณ 15 กิโลเมตรจากแยกมิตรภาพ มองหาซอยทางซ้ายมือที่มีป้ายมอม่วนหลาย, น้ำพุธรรมชาติ (กม 15) ให้เลี้ยวซ้ายเข้าไปในซอย แล้ววิ่งไปทางซ้าย (ย้ำว่าซอยทางซ้ายนะครับ ถ้าไปซอยทางขวาจะเป็นซอยของ เบลล์วิลล่า รีสอร์ท & มอม่วนหลาย) ขับตรงไปประมาณ 600 เมตร จะเจอที่จอดรถน้ำผุด? จอดฟรีไม่เสียเงิน ถ้าขับรถเลยไปจนเจอ Palio แสดงว่าเลยแล้วครับ ทางเข้าน้ำผุดจะอยู่ก่อนถึง Palio ประมาณ 1 กิโลเมตร\\nขับมาทางถนนธนรัชต์มุ่งหน้าไปแยกมิตรภาพ ประมาณ 7 กิโลเมตรจะเจอกับ Palio จากนั้นให้ขับช้าๆ มองทางขวามือหาซอยที่มีป้ายมอม่วนหลาย, น้ำพุธรรมชาติ (กม 15) ให้เลี้ยวขวาเข้าไปในซอย แล้ววิ่งไปทางซ้าย (ย้ำว่าซอยทางซ้ายนะครับ ถ้าไปซอยทางขวาจะเป็นซอยของ เบลล์วิลล่า รีสอร์ท & มอม่วนหลาย) ขับตรงไปประมาณ 600 เมตร จะเจอที่จอดรถน้ำผุด\\nฟอร์จูน ดี พลัส เขาใหญ่ (Fortune D Plus Khaoyai) อ.ปากช่อง เขาใหญ่ นครราชสีมา ที่พักสะดวกสบาย เป็นส่วนตัว พร้อมสิ่งอำนวยความสะดวกครบครัน บริการห้\\t\\nวิลลา อิตาเลียน เขาใหญ่ (Villa Italia Khao Yai) ตั้งอยู่ในตำบลหมูสี ห่างจากปาลิโอเขาใหญ่ 1.6 กม. ตั้งอยู่ห่างจากเรือนประเสนชิต วิลลา มูเซ\\t\\nเขาใหญ่ แฟมิลี่ รีสอร์ท (family resort khaoyai) บ้านพักเขาใหญ่สำหรับครอบครัว อยู่ใกล้ปาลิโอ สามารถนำสุนัขเข้าพักได้ ที่พักผสานดีไซน์ไทยแ\\t\\nโรงแรม โบนันซ่า เขาใหญ่ (The Bonanza Khao Yai Hotel) อยู่อำเภอปากช่อง จ.นครราชสีมา รีสอร์ทโอบล้อมด้วยขุนเขา เขียวขจีด้วยแมกไม้นานาพันธุ์ ธร\\t\\nเดอะกรีนเนอร์รี่รีสอร์ท เขาใหญ่ (The Greenery Resort Khao Yai) ตั้งอยู่บนถนนธนรัตน์ เชิงทางขึ้นเขาใหญ่ ห่างจากฟาร์มโชคชัย 20 นาที และจากกรุงเทพฯ 2.\\t\\nดอยหลวงเชียงดาว นับเป็นยอดดอยที่สูงอันดับ 3 ของประเทศรองจากดอยอินทนนท์และผ้าห่มปก จากบนยอดดอยซึ่งเป็นที่ราบแคบๆสามารถมองเห็นทัศนียภาพอันงดงามรอบด้าน\\t\\nเขาใหญ่ ฟ้าใส รีสอร์ท (Khaoyai Fahsai Resort) เป็นโรงแรมที่เปิดให้บริการใหม่ ให้บริการแบบกึ่งบูทิคโฮเทล ตั้งอยู่ ณ อำเภอปากช่อง จังหวัดนครราชสีมา ซึ่ง...\\t\\nพีบีวัลเล่ย์ เขาใหญ่ไวน์เนอรี่ บนพื้นที่กว้างใหญ่กว่า 2,000 ไร่ล้อมรอบด้วยหุบเขาอันมีสภาพภูมิอากาศเหมาะสมสำหรับเพาะปลูกองุ่น และเป็นถิ่นกำเนิดของ...'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 31 + } + ] + }, + { + "cell_type": "code", + "source": [ + "df[1972:]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "RHeQFdxJDZGy", + "outputId": "d630e83f-8a7d-4709-d9a8-9b2a3a744715" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " index id text score \\\n", + "1972 22813 22813 ปฏิทินปี 2559 ปีวอก รูปลิง น่ารัก ๆ พร้อมวันหย... 2537.5 \n", + "1973 20041 20041 รายงานตัววันนี้...เฮ!!! ทั้งไทยและเทศ \"หมูป่า\"... 2442.2 \n", + "1974 26868 26868 บ่อน้ำผุดธรรมชาติ ตั้งอยู่ในสวนกาญจนาภิเษก ตำบ... 2399.7 \n", + "1975 27796 27796 ใบหุ้น - นี่คือพระมารดาของเงินลงเงินทั้งเพในขณ... 2596.9 \n", + "1976 23583 23583 099-9624405 085-4437922,Snail white,All in one... 2512.5 \n", + "... ... ... ... ... \n", + "3967 13001 13001 สวัสดีครับ เพื่อนๆชาว Lords Mobile ทุกท่าน วัน... 2512.2 \n", + "3968 14284 14284 น้องทานนมผงS26สีม่วง นน.น้องตอน4เดือน6.2ถือว่า... 2214.2 \n", + "3969 24596 24596 2017-03-14 2017-03-15 followking พระมหากษัตริย... 2452.4 \n", + "3970 16302 16302 มีการประเมินว่า 80-90% ของผู้ที่มีภาวะการนอนที... 2548.5 \n", + "3971 28976 28976 หน้าแรก ศูนย์เครื่อข่ายจักราช 2 ศูนยเครือข่ายจ... 2495.6 \n", + "\n", + " log_score \n", + "1972 7.838935 \n", + "1973 7.800655 \n", + "1974 7.783099 \n", + "1975 7.862074 \n", + "1976 7.829034 \n", + "... ... \n", + "3967 7.828914 \n", + "3968 7.702646 \n", + "3969 7.804822 \n", + "3970 7.843260 \n", + "3971 7.822284 \n", + "\n", + "[2000 rows x 5 columns]" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
indexidtextscorelog_score
19722281322813ปฏิทินปี 2559 ปีวอก รูปลิง น่ารัก ๆ พร้อมวันหย...2537.57.838935
19732004120041รายงานตัววันนี้...เฮ!!! ทั้งไทยและเทศ \"หมูป่า\"...2442.27.800655
19742686826868บ่อน้ำผุดธรรมชาติ ตั้งอยู่ในสวนกาญจนาภิเษก ตำบ...2399.77.783099
19752779627796ใบหุ้น - นี่คือพระมารดาของเงินลงเงินทั้งเพในขณ...2596.97.862074
19762358323583099-9624405 085-4437922,Snail white,All in one...2512.57.829034
..................
39671300113001สวัสดีครับ เพื่อนๆชาว Lords Mobile ทุกท่าน วัน...2512.27.828914
39681428414284น้องทานนมผงS26สีม่วง นน.น้องตอน4เดือน6.2ถือว่า...2214.27.702646
396924596245962017-03-14 2017-03-15 followking พระมหากษัตริย...2452.47.804822
39701630216302มีการประเมินว่า 80-90% ของผู้ที่มีภาวะการนอนที...2548.57.843260
39712897628976หน้าแรก ศูนย์เครื่อข่ายจักราช 2 ศูนยเครือข่ายจ...2495.67.822284
\n", + "

2000 rows × 5 columns

\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 29 + } + ] + }, + { + "cell_type": "code", + "source": [ + "for i,text in enumerate(result_df[result_df[\"log_score\"]>40].sample(20)[\"text\"].tolist()):\n", + " print(\"doc\")\n", + " print(text)\n", + " print()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HSCx4c5bq60Z", + "outputId": "a53691ae-2a7e-440d-859b-44bbcb287d95" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "doc\n", + "มีเงินใช้แบบไม่ขาดมือหาเงินพิเศษกับ สล็อตออนไลน์ ของพวกเรากันได้เลยกับเว็บที่ให้ทุกคนได้หารายได้ได้แบบง่ายๆและไม่จำต้องยุ่งยากพึ่งพิงคนใดกันแน่และไม่จำต้องเดินทางไปสถานที่จริงอีกต่อไปไม่ว่าคุณจะว่างตอนไหนคุณก็สามารถเล่นได้เลยและไม่จำต้องทุกข์บากลำบากไปอีกต่อไปเพราะเหตุว่าพวกเราเป็นเกมซึ่งสามารถรองรับทุกแพลตฟอร์มการใช้งานก็เลยทำให้ทุกคนมีความสบายที่สุดกับกันทำเงินและก็ทำกำไรที่สุดปกป้องไปอย่างยิ่งจริงๆกับเว็บสล็อตออนไลน์ที่มีจบครบในที่เดียวให้ทุกคนได้เลือกเล่นได้อย่างจุใจได้ตลอด 1 วันกันเลย เข้าเล่นได้ทุกเกม ทุกค่าย\n", + "สล็อตออนไลน์ เพราะเหตุใดเกมของพวกเราก็เลยเป็นเกมที่สุดฮอตมากมายในเวลานี้ ?\n", + "• สล็อตออนไลน์ ให้ความเชื่อมั่นแก่นักพนันเนื่องจากว่าพวกเราเป็นเว็บที่มีการเงินที่มีความโปร่งสบายใสรวมทั้งมั่นคงที่ทุกคนสามารถวางใจได้เลยรวมทั้งยังเป็นเว็บไซต์ตรงมีใบเซอร์รับประกันให้ทุกคนได้ทราบสึกเพลิดเพลินใจรวมทั้งห่วงที่สุดกับการเล่นเกมจากเว็บสล็อตออนไลน์ของพวกเรา\n", + "• ให้ทุกคนได้ทำเงินได้อย่างยิ่งสุดกับเว็บที่ให้ทุกคนได้หารายได้ได้ทุกเกมแล้วก็ลงพนันได้ทุกที่ที่ต้องการกับกระบวนการทำรายได้อย่างมากสุดรวมทั้งสำเร็จทดแทนที่คุ้มสูงที่สุดกับการเล่นเกมที่มีความล้ำยุคของพวกเรา\n", + "• พวกเรามีเกมสล็อตออนไลน์ ที่มากมายจำนวนมากรวมทั้งเป็นเกมลิขสิทธิ์แท้ส่งตรงจากสล็อตออนไลน์โดยตรงก็เลยทำให้ผู้เล่นของพวกเราได้รับความบันเทิงและก็รื่นเริงและก็ตื่นเต้นตื่นเต้นได้ตลอดและก็เข้าถึงได้ในทุกห้องเกมได้ตลอด 1 วันกันไปเลย\n", + "• ไม่ต้องดาวน์โหลดอะไรทั้งหมดไม่เสียค่าบริการสำหรับเพื่อการลงทะเบียนเลยกับเว็บที่ให้ทุกคนลงทะเบียนสมัครสมาชิกผ่านหน้าเว็บของพวกเรากันได้เลยก็เลยทำให้ทุกคนมีความสบายที่สุดหรือท่านใดที่ไม่สบายกับการสมัครที่หน้าเว็บสามารถสมัครผ่าน Admin ของพวกเรากันได้เลยพวกเรามีแอดไม่นมืออาชีพรอดูแลทุกคนตลอด 1 วันกันเลย\n", + "สล็อตออนไลน์เกมที่เล่นบันเทิงใจ ที่ทุกคนชอบใจและไม่ควรจะพลาด\n", + "สล็อตออนไลน์สุดเริ่ดมากมายเดี๋ยวนี้ไม่ว่าคุณจะเป็นสายไหนคุณก็สามารถสนุกสนานกับเกมสล็อตออนไลน์ของพวกเรากันได้เพราะเหตุว่าพวกเราให้ความบันเทิงได้ของแท้ไม่มีการฉ้อโกงไม่มีอวดอย่างแน่แท้เนื่องจากหลายๆท่านบางครั้งอาจจะเคยพบเว็บที่บริการห่วยแตกๆและก็มีเกมน้อยก็เลยทำให้ท่านจำต้องเสียอารมณ์และก็เปลี่ยนแปลงเว็บไซต์เสมอๆเมื่อคุณได้ลงพนันกับเว็บของพวกเราแล้วคุณจะเจอกับแหล่งรวมเกมระดับพรีเมี่ยมที่ส่งตรงจากสล็อตออนไลน์ชั้นหนึ่งมากมายก่ายกองจากนานัปการค่ายให้แก่ท่านได้คัดเลือกได้อย่างเต็มเปี่ยมกันอย่างยิ่งจริงๆแล้วก็ยังเป็นเว็บที่ให้ความเสถียรภาพสูงสุดเล่นเกมไม่มีค้างไม่มีกระตุกก็เลยทำให้ทุกคนไม่ต้องเสียอารมณ์สำหรับในการลงพนันกับเว็บสล็อตออนไลน์ของพวกเรากันเลยรวมทั้งยังเป็นเว็บที่ตามมาตรฐานระดับสากลก็เลยทำให้ผู้เล่นของพวกเรารู้สึกพอใจหายห่วงที่สุดกับการลงพนันกับเว็บที่ดียอดแล้วก็ที่ได้รับความนิยมของพวกเรา\n", + "ต้องการไปถึงเป้าหมายสำหรับในการพนัน คา สิ โน ออนไลน์ เว็บไหนดี\n", + "เว็บ พีจีสล็อต เว็บไซต์ตรงเว็บสล็อตออนไลน์ที่เคยชินสำหรับนักพนันที่มากมาย\n", + "พีจีสล็อต เว็บสล็อตออนไลน์เว็บไซต์ตรงเว็บไซต์นี้ดีต่อการเล่นสล็อตออนไลน์แน่ๆ\n", + "พีจีสล็อต เว็บเล่นสล็อตออนไลน์เกมออนไลน์ที่ได้รับความนิยมจัดหนักแตกจริง\n", + "คาสิโนออนไลน์ ที่เป็นเว็บไซต์ยักษ์ใหญ่ที่มีคนเข้าเล่นสูงที่สุดของประเทศไทย\n", + "By Author\n", + "Post navigation\n", + "เล่น พนันบอล เล่นง่ายจริง\n", + "สล็อตออนไลน์ สนุกสนานทุกเกมส์ได้กำไรได้ตลอดเวลากับเกมสุดฮอต\n", + "Search\n", + "Search\n", + "Recent Posts\n", + "ต้องการไปถึงเป้าหมายสำหรับในการพนัน คา สิ โน ออนไลน์ เว็บไหนดี\n", + "เว็บ พีจีสล็อต เว็บไซต์ตรงเว็บสล็อตออนไลน์ที่เคยชินสำหรับนักพนันที่มากมาย\n", + "พีจีสล็อต เว็บสล็อตออนไลน์เว็บไซต์ตรงเว็บไซต์นี้ดีต่อการเล่นสล็อตออนไลน์แน่ๆ\n", + "พีจีสล็อต เว็บเล่นสล็อตออนไลน์เกมออนไลน์ที่ได้รับความนิยมจัดหนักแตกจริง\n", + "คาสิโนออนไลน์ ที่เป็นเว็บไซต์ยักษ์ใหญ่ที่มีคนเข้าเล่นสูงที่สุดของประเทศไทย\n", + "Tag cloud\n", + "#ทำกำไร #ปลอดภัย #ลุ้นรางวัล #สล็อตเงินล้าน #เงินรางวัล #แจ็คพอต #แทงฟรี #ได้รับเงิน\n", + "Archives\n", + "December 2022\n", + "November 2022\n", + "October 2022\n", + "September 2022\n", + "August 2022\n", + "July 2022\n", + "Categories\n", + "ข้อมูลเกมส์อื่นๆ\n", + "คาสิโนออนไลน์\n", + "บาคาร่าออนไลน์\n", + "เกมพนันออนไลน์\n", + "Copyright © 2022 แหล่งเว็บชั้นนำระดับประเทศที่มีข้อมูลเกมพนันออนไลน์ทุกเกม ค่ายดัง. All Rights Reserved | Better News Vibe by Themepalace\n", + "\n", + "doc\n", + "ข่าวเว็ปไซต์ todayszaman.com – ในปีการศึกษา 2554-2555 นี้ มหาวิทยาลัยหลายแห่งในตุรกียังคงมีการห้ามนักศึกษาหญิงคลุมฮิญาบ ถึงแม้คณะกรรมการการอุดมศึกษา Higher Education Board (YOK) จะยกเลิกกฎระเบียบนี้แล้วก็ตาม\n", + "ถึงแม้สถาบันส่วนมาจะแสดงการยอมรับกฎใหม่ที่ประกาศเมื่อปี 2553 และนักศึกษาสามารถคลุมฮิญาบเข้ามาเรียนได้ แต่กฏระเบียบในคู่มือการรับนักศึกษาภาคฤดูร้อนของศูนย์ Student Selection and Placment (OSYM) ยังคงระบุให้นักศึกษาต้องถอดฮิญาบ เมื่อมาลงทะเบียน เป็นเหตุให้นักศึกษาในมหาวิทยาลัยออกมาประท้วงในเรื่องนี้\n", + "ปัจจุบันบางมหาวิทยาลัยในกรุงแองการ่า อาทิ มหาวิทยาลัยเทคนิคตะวันออกกลาง ม.แองการ่า (ODTU) ม.Hacettepe ม.กาซี, ม.แองการ่า, ม.Baskent and Atilim ยังให้สิทธิ์อาจารย์ผู้สอนเป็นผู้พิจารณาว่า จะอนุญาตให้นักศึกษาที่แต่งกายแบบฮิญาบเข้าห้องเรียนได้หรือไม่ โดยนักศึกษาที่คลุมฮิญาบสามารถเข้าในบริเวณมหาวิทยาลัยได้ แต่อาจไม่ได้รับอนุญาตให้เข้าในบางคณะ หรือในห้องเรียนบางวิชา\n", + "ประธานคณะกรรมการการอุดมศึกษา ออกแถลงการณ์เมื่อเดือนมีนาคม พ.ศ. 2553 เตือนมหาวิทยาลัยที่ยังคงมีพฤติกรรมห้ามนักศึกษาคลุมฮิญาบเข้าห้องเรียน ว่า จะตั้งคณะกรรมการสอบสวนกรณีดังกล่าว และย้ำว่า นักศึกษาจะต้องไม่ถูกไล่ออกนอกห้องเรียนเพราะการคลุมฮิญาบ และหากมีกรณีเช่นนี้เกิดขึ้น ทางมหาวิทยาลัยต้องทำรายงานเข้ามายังกระทรวงทันที\n", + "ผศ.หญิง Yesim Yalcin Mendi อาจารย์คณะเกษตรในมหาวิทยาลัย Cukurova ในเขตอะดาน่า กล่าวกับสื่อเมื่อวันที่ 28 กันยายนว่า ในเมื่อมหาวิทยาลัยยังให้สิทธิ์แก่อาจารย์ในการพิจารณา เธอก็จะใช้สิทธิ์นั้นและไม่ยอมให้นักศึกษาที่คลุมศีรษะเข้ามาในห้องเรียน\n", + "อาจารย์ Yesim Yalcin Mendi มีพฤติกรรมแปลกๆ กล่าวคือ เธอจะเข้าไปซักถามประวัตินักศึกษาที่คลุมฮิญาบว่า บ้านอยู่ที่ไหน หรืออยู่กับใคร ทั้งนี้เธอให้เหตุผลว่า เธอต้องการทราบเบื้องหลังของนักศึกษาที่คลุมฮิญาบว่า ได้รับการสนับสนุนด้านเงินค่าใช้จ่ายจากองค์กรศาสนาใดหรือไม่\n", + "https://news.muslimthaipost.com\n", + "บริการเวลาละหมาดติดเว็บ ทั่วไทย (คลิก)\n", + "มาแรงรอบสัปดาห์\n", + "อัพเดทล่าสุด\n", + "ชารุค ข่าน ดาราดังทำอุมเราะฮ์ แต่เจอวิจารณ์กระหึ่ม?\n", + "ดาราบอลลีวู้ดคนดัง ชารุค ข่าน เดินทางทำอุมเราะฮ์ แต่เจอเสียงวิจารณ์กระหึ่ม เพราะอะไร?...\n", + "สุดชั่ว! ทำลายอัลกุรอาน-ล่ามโซ่แขวนหน้ามัสยิด\n", + "เกิดเหตุผู้ไม่หวังดีทำลายอัลกุรอานและนำล่ามโซ่ แขวนหน้ามัสยิดในสต็อกโฮล์ม...\n", + "ซาอุฯฮึด! ยื่นเสนอตัวเป็นเจ้าภาพ แข่งฟุตบอลหญิงเอเซียนคัพ (AFC)\n", + "สหพันธ์ฟุตบอลแห่งซาอุดีอาระเบีย (SAFF) ได้ยื่นข้อเสนออย่างเป็นทางการเพื่อขอเป็นเจ้าภาพในการแข่งขันฟุตบอลหญิงเอเซียน คัพ 2026...\n", + "อินโดนีเซียเล็งจำคุกคู่รักมีเซ็กก่อนแต่ง\n", + "ส.ส.อินโดนีเซีย คาดว่า จะผ่านกฎหมายอาญามาตราใหม่ ที่จะลงโทษจำคุกคู่รักที่มีเพศสัมพันธ์โดยไม่ผ่านการแต่งงาน รวมทั้งกฎหมาย...\n", + "ระทึก! กลุ่มติดอาวุธโจมตีสถานทูตปากีสถานในอัฟกานิสถาน\n", + "เกิดเหตุ กลุ่มติดอาวุธโจมตีสถานทูตปากีสถานในอัฟกานิสถาน อุปทูตปากีสถานประจำอัฟกานิสถาน ปลอดภัยจากเหตุการณ์สถานทูตในกรุงคาบูล...\n", + "กลุ่มรณรงค์เพื่อสันติอิสราเอล ถูกต้านหลังเยือนเขตเวสต์แบงก์\n", + "กลุ่มรณรงค์เพื่อสันติชาวอิสราเอล ถูกกลุ่มขวาจัดต่อต้าน หลังเดินทางเยี่ยมชาวปาเลสไตน์ในเฮบรอน เมืองที่ใหญ่ที่สุดในเขตเวสต์แบงก์...\n", + "ซาอุฯ พบแหล่งก๊าซธรรมชาติใหม่ 2 แห่ง\n", + "บริษัทซาอุฯ ของซาอุดิอาระเบียได้ค้นพบแหล่งก๊าซธรรมชาติใหม่ 2 แห่ง ที่...\n", + "ทนายปาเลสไตน์ ถูกอิสราเอลสั่งเนรเทศไปฝรั่งเศส\n", + "ทนายปาเลสไตน์ ถูกอิสราเอลสั่งเนรเทศไปฝรั่งเศส หลังเพิกถอนถิ่นที่อยู่ ข่าวที่เขาจะถูกเนรเทศเป็นเรื่องที่น่าสะพรึงกลัวมาก...\n", + "ทำไม \"ร้านขายผ้าคานธี\" บนถนนพาหุรัดถึงเหมาะกับมุสลิมะห์\n", + "ทำไมร้านขายผ้าคานธีของเราถึงเหมาะที่จะเป็นเป้าหมายหนึ่งสำหรับมุสลิมะห์ที่กำลังมองหาผ้าพรีเมียมและหรูหราท่ามกลางร้านขายผ้ามากมายบนถนนเส้นนี้...\n", + "ครั้งแรก สถิติมุสลิมเพิ่มขึ้นในอังกฤษ-เวลส์\n", + "ครั้งแรก ประชากรในอังกฤษและเวลส์ ที่ระบุว่าเป็นคริสเตียน ลดต่ำลงเกินครึ่ง...\n", + "สหรัฐฯ อนุมัติขายอาวุธมูลค่า 1 พันล้านดอลล่าร์ให้กาตาร์\n", + "หลังจากล่าช้ามาเป็นเวลานาน รัฐบาลโจ ไบเดน ของสหรัฐอเมริกาอนุมัติข้อตกลงการขายอาวุธให้กับกาตาร์ โดยอาวุธดังกล่าวจะเป็นอากาศยานไร้คนขับ หรือโดรน มูลค่า 1 พันล้านดอลล่าร์...\n", + "ซาอุฯ เล็งขยายสนามบินริยาดขนาดใหญ่\n", + "เจ้าชายโมฮัมเหม็ด บิน ซัลมาน มกุฎราชกุมารแห่งซาอุดิอาระเบีย ประกาศถึงแผนการเปลี่ยนสนามบินริยาดให้เป็นศูนย์กลางการบินขนาดใหญ่...\n", + "งานแต่งมุสลิม อุละมะอฺอินเดียสั่งห้าม 3 อย่างนี้ ละเมิดปรับหนัก!\n", + "อุละมะอฺอินเดียสั่งห้ามการเต้นรำ เปิดเพลง และเล่นพลุไฟในงานแต่งงานมุสลิม ละเมิดปรับหนัก!...\n", + "เรื่องถึงศาลแล้ว! เหตุตร.อินเดียไม่คืนกุญแจมัรกัสให้อิหม่าม\n", + "เรื่องถึงศาลแล้ว หลังตำรวจอินเดียไม่ยอมคืนกุญแจมัรกัสให้อิหม่าม โดยอ้างว่า....\n", + "อิหร่านชื่นชมกาตาร์ เชิดชูคุณค่าอิสลามในฟุตบอลโลก 2022\n", + "ประธานาธิบดีอิหร่านชื่นชมกาตาร์ กล่าวยกย่องกาตาร์ สำหรับความพยายามในการให้เกียรติต่อคุณค่าของอิสลาม เนื่องจากกาตาร์เป็นประเทศอาหรับประเทศแรก...\n", + "นักดับเพลิง มุสลิม-ยิว ฟ้องศาลสั่งห้ามไว้เครา\n", + "พนักงานดับเพลิงชาวมุสลิมและชาวยิวในวอชิงตัน ฟ้องขอให้ผู้พิพากษาตัดสินกรณีฝ่ายบริหารเมืองออกนโยบายห้ามพวกเขาไว้หนวด-เครา โดยว่า...\n", + "ฟุตบอลโลก 2022 ฟัตวาผู้นำซาลาฟีย์ในอียิปต์ ถกเดือด!\n", + "คำฟัตวาเกี่ยวกับฟุตบอลที่ออกโดยผู้นำแนวคิดซาลาฟีในอียิปต์เมื่อเร็ว ๆ นี้ ทำให้เกิดการถกเถียงอย่างร้อนแรง ในช่วงเวลาที่ชาวอียิปต์หลายแสนคนกำลังติดตามการแข่งขันฟุตบอลโลกอย่างจริงจัง...\n", + "อ้างเหมือนมัสยิด ส.ส.อินเดียสั่งทุบโดมบนป้ายรถเมล์\n", + "ส.ส.พรรครัฐบาลอินเดียสั่งทุบโดมที่สร้างบนป้ายรถเมล์สร้างใหม่ อ้างว่าทำให้เหมือนมัสยิด...\n", + "ซาอุฯ หนุน AMF ให้เยเมนกู้ 1 พันล้านดอลล่าร์\n", + "ซาอุดิอาระเบีย สนับสนุน AMF ให้เยเมนกู้ 1 พันล้านดอลล่าร์ พัฒนาเศรษฐกิจ...\n", + "ดราม่า! ทวิตทีมฟุตบอลสหรัฐฯ แสดงธงชาติอิหร่าน มีแค่แถบสีไม่มีตรา\n", + "บัญชีทวิตเตอร์ทีมฟุตบอลสหรัฐอเมริกา แสดงภาพธงชาติอิหร่าน ที่มีแค่แถบสีแต่ไม่มีตราสัญลักษณ์ตรงกลาง...\n", + "มัสยิดยอร์กได้รับรางวัลระดับชาติครั้งแรก ด้านบริการมุอัลลัฟ\n", + "มัสยิดเมืองยอร์ก และศูนย์อิสลามใน Tang Hall ได้รับรางวัล ‘Best convert Support’ โดยพิธีมอบรางวัลมีขึ้นที่งานประจำปี...\n", + "เหตุจลาจล หลังทีมโมร็อกโกชนะเบลเยียม 2:0\n", + "เกิดการจลาจลในเบลเยียมและเนเธอร์แลนด์ หลังทีมโมร็อกโกชนะเบลเยียม 2:0...\n", + "ความขัดแย้งในอิหร่าน แผ่เข้าแข่งฟุตบอลโลกที่กาตาร์\n", + "ความวุ่นวายทางการเมืองในอิหร่านแผ่เงาเข้ามาครอบคลุมการแข่งขันฟุตบอลโลกนัดที่ 2 ที่ทีมชาติอิหร่านพบกับทีมชาติเวลส์....\n", + "ปธน.เอมิเรตส์-กษัตริย์จอร์แดน หารือขยายความร่วมมือในอาบูดาบี\n", + "ประธานาธิบดีสหอารับเอมิเรตส์ กับ กษัตริย์อับดุลเลาะฮ์ ที่ 2 แห่งจอร์แดน หารือเพิ่มความแข็งแกร่งในความสัมพันธ์ระหว่าง 2 ประเทศ ...\n", + "ตอลิบันลงโทษเฆี่ยนครั้งแรก หลังว่างเว้นมา 32 ปี\n", + "ตอลิบันใช้ชาริอะฮ์ลงโทษเฆี่ยนผู้กระทำผิด นับเป็นครั้งแรกในอัฟกานิสถานหลังว่างเว้นมา 32 ปี...\n", + "รู้กันหรือไม่? ลูกฟุตบอลโลก 2022 ผลิตในอินโดนีเซีย\n", + "รู้กันหรือไม่ ลูกฟุตบอลที่ใช้อย่างเป็นทางการในฟุตบอลโลก 2022 ผลิตในอินโดนีเซีย...\n", + "FIFA ห้ามแฟนบอลอังกฤษ สวมพร็อพชุดครูเสด \"อาจดูหมิ่นมุสลิม\"\n", + "ฟีฟ่าแจ้งให้แฟนบอลชาวอังกฤษทราบว่า พวกเขาไม่ควรสวมชุดพร็อพเลียนแบบครูเสด มาชมฟุตบอลโลกนัดที่จะแข่งในวันที่ 25 พฤศจิกายน ซึ่งเป็นคู่ระหว่างสหรัฐกับอังกฤษ...\n", + "มาเลเซีย ประชุมปลดล็อกเลือกนายกรัฐมนตรี\n", + "ประมุขแห่งรัฐทั้ง 8 ของมาเลเซีย ประชุมนัดพิเศษร่วมกับสมเด็จพระราชาธิบดี ที่พระราชวังอิสตานา เนการา เพื่อหารือในการแต่งตั้งนายกรัฐมนตรี...\n", + "อันวาร์ อิบรอฮีม ขึ้นเป็นนายกฯมาเลเซีย รอคอยกว่า 20 ปี!\n", + "รอคอยกว่า 20 ปี ที่ประชุมสุลต่านผู้นำแห่งรัฐดัน อันวาร์ อิบรอฮีม ขึ้นตำแหน่งนายกมาเลเซีย คนที่ 10...\n", + "ทีมเยอรมนีปิดปากถ่ายรูป ประท้วงฟีฟ่าห้ามหนุนรักร่วมเพศ\n", + "ทีมเยอรมนีปิดปากถ่ายรูปหมู่ ประท้วงฟีฟ่าห้ามสวมปลอกแขนที่สนับสนุนรักร่วมเพศ...\n", + "ฟุตบอลโลก 2022 ชาวปาเลสไตน์ใช้โอกาส เรียกร้องให้สนใจปัญหา\n", + "ชุมชนชาวปาเลสไตน์ขนาดใหญ่ในโดฮารู้ดีว่า ทั่วโลกกำลังให้ความสนใจในการแข่งขันฟุตบอลโลก 2022 ที่กาต้าร์ และนี่เป็นโอกาสสำคัญที่พวกเขาไม่ได้รับบ่อยนัก ...\n", + "เปิดฉากงาน “ฮาลาลมหานคร” ซีคอนสแควร์ ศรีนครินทร์\n", + "เปิดฉากงาน “ฮาลาลมหานคร” ซีคอนสแควร์ ศรีนครินทร์ มหกรรมอาหารฮาลาลยิ่งใหญ่แห่งปี จัดเต็ม 11 วัน...\n", + "by Mnet\n", + "Copyright © 2018 Muslimthaipost. All rights reserved.\n", + "https://www.apscuf.org/slot-gacor/slot gacorslot onlineslot gacorslot gacorslot gacorslot gacorslot gacorhttps://bxartsfactory.org/slot-gacor-maxwin/https://www.splayce.eu/slot-pulsa/https://esign.bogorkab.go.id/vendor/bin/https://snip.eng.unila.ac.id/wp-content/uploads/slot-gacor/http://desa-bolali.klatenkab.go.id/files/slot-gacor/https://www.jurnal.stimsurakarta.ac.id/public/journals/https://kobar.umkm.kalteng.go.id/files/slot-gacor/https://www.uniqhba.ac.id/assets/slot-gacor/https://www.staipibdg.ac.id/-/slot-online-gacor/https://disdagperin.bekasikota.go.id/slot-gacor/https://journal.widyatama.ac.id/slot-gacor/https://stis.ac.id/slot-gacor/https://gradosyposgrados.ucjc.edu/https://ejurnal.iainlhokseumawe.ac.id/public/slot-deposit-pulsa/ https://sshj.in/public/slot-deposit-dana/https://mbmscience.com/public/slot88/situs slot gacorhttps://peshawarhighcourt.gov.pk/slot-gacor/https://www.doutoresdoexcel.com.br/-/slot-gacor/https://mccm.ptcer.pl/slot-demo/https://academconsult.ru/slot-gacor/https://nje.org.na/slot-deposit-dana/https://journals.tma.uz/slot-gacor/https://muru.com.co/slot-deposit-pulsa/https://coresdaterra.com.br/slot-gacor/https://sasurie.com/slot-gacor/https://thejrns.org/slot-gacor/http://a0729171.xsph.ru/https://zombiigrice.com/slot-gacor/https://ijohmn.com/public/slot-gacor/https://www.kuhoo.com/wp-content/uploads/slot-deposit-dana/http://clc.cet.edu/judi-bola/https://www.ijmaberjournal.org/slot-gacor/https://ijorces.org/slot-gacor/https://virtusclean.com/slot-online/https://modernacademy-journal.synceg.net/slot-gacor/https://artescienza.org/wp-content/uploads/slot-gacor/https://journal.icter.org/public/slot-gacor/https://rumosdainformacao.ivc.br/5unsur3/https://dailyexpresstop.com/https://livepublicnews.com/https://cosy.univrab.ac.id/slot-online/https://www.unaki.ac.id/togel88/https://staialakbarsurabaya.ac.id/slot-online/https://iat.alfithrah.ac.id/slot-gacor/https://krti.unesa.ac.id/slot-deposit-pulsa/https://scuto.co.id/slot-online/http://jurnal.umsu.ac.id/public/\n", + "\n", + "doc\n", + "คดีแรก มีการอุทธรณ์ ฎีกา ศาลฎีกาพิพากษายกคำพิพากษาศาลล่างทั้งสอง ให้ศาลชั้นต้นดำเนินกระบวนพิจารณาใหม่\n", + "คดีหลัง หลังจากศาลยกฟ้องเพราะดำเนินกระบวนพิจารณาซ้ำแล้ว ก็มีการอุทธรณ์ ฎีกา เช่นกัน ศาลฎีกาคดีหลังวินิจฉัยว่า เมื่อคดีแรกศาลฎีกายกคำพิพากษาศาลล่าง เท่ากับว่าคำพิพากษาของทั้งสองศาลสิ้นผลไป เท่ากับว่าศาลชั้นต้นคดีแรกยังไม่มีคำวินิจฉัยในประเด็นข้อพิพาท คดีหลังจึงไม่เป็นการดำเนินกระบวนพิจารณาซ้ำ ให้ยกคำพิพากษาศาลล่างทั้งสอง ให้ศาลชั้นต้นดำเนินกระบวนพิจารณาและพิพากษาต่อไป\n", + "สรุปหลัก\n", + "คดีแรกศาลชั้นต้นวินิจฉัยในประเด็นแห่งคดีเดียวกัน คดีหลังเป็นดำเนินกระบวนพิจารณาซ้ำ ไม่มีอำนาจฟ้อง\n", + "แต่คดีหลังก็อาจกลับมาเป็นฟ้องที่ไม่เป็นการดำเนินกระบวนพิจารณาซ้ำได้ หากคดีแรกถูกพิพากษายกย้อนสำนวนให้กลับมาพิจารณาคดีใหม่ที่ศาลชั้นต้น\n", + "\n", + "doc\n", + "กี่ครั้งที่แผ่นหลังบางกระแทกลงกับเตียงนอนนุ่ม และกายร้อนรุ่มที่ส่งแรงอารมณ์ประโคมเข้าหา เซียวจ้านในสายตาของชายหนุ่มเป็นเพียงแค่ของขัดดอกที่ตระกูลส่งมา และไม่มีทีท่าว่าหวังอี้ป๋อจะรักเขาจริงๆบ้างเลย\n", + "\n", + "doc\n", + "ต้องลงรายละเอียดให้ชัดเจนครบถ้วน จดประกอบหรือยังไงก็ต้องบอก บอกไม่หมดจะเหมาว่าไม่จริงใจขายของ กระทู้จะโดนลบ\n", + "ต้องลงรูปจริงประกอบเสมอ ไม่มีรูปไม่ได้ อ้างว่ายังไม่ถ่ายก็ไม่ได้ อ้างว่าใส่รูปไม่เป็นก็ไม่ได้ ทุกกระทู้ที่ไม่มีรูปจะถูกลบ\n", + "ต้องลงราคาเสมอ ราคาขายรวมทั้งหมด ลงแค่ราคาดาวไม่ได้ ไม่ลงราคาแสดงว่าไม่จริงใจจะขาย ผู้ขายจะถูกแบน\n", + "ห้ามลงขายซ้ำๆในหลายบอร์ด ถึงว่าจะทำให้ขายได้เร็วกว่าเหรอ หรือการศึกษาโครตต่ำ กระทู้จะถูกลบและผู้ขายจะโดนแบน\n", + "\n", + "doc\n", + "เผยสูตรชนะเขย่าไฮโลออนไลน์ด้วยโปรแกรม ai ซึ่งเป็นกลยุทธ์การสร้างแต้มต่อในการเล่นเกมเดิมพันที่มีความนิยมระดับตำนานแต่ส่งต่อความฮิตมาถึงวันนี้โดยหลายๆคนเลือกใช้งานโปรแกรมโกงไฮโลออนไลน์ที่มีการคำนวณจากประสบการณ์ให้การนำไปใช้เทสสูตรก่อนได้แล้วเลือกห้องเล่นในห้วงเวลาที่เหมาะสมสามารถกดที่ภาพโปรแกรมไฮโลได้เลยหน้านี้ค่ะ https://www.casinothai168.co/program-sicbo.php จากนั้นก็เข้าไปอ่านรายละเอียดการใช้ที่มีระบุอย่างละเอียดในหน้าคู่มือและแนวทางไกด์ไลน์ให้เราได้อ่านเพื่อประสิทธิภาพที่สูงสุดในการใช้งานโปรแกรม จะว่าไปแล้วหากสนใจเลือกสูตรอื่นๆก็อ่านได้จากเมนูสูตรหรือแม้แต่ใครที่ต้องการทดสอบสกิลแบบวางเบทจริงก็เลือกป้ายวิบๆสนใจแบรนด์ใดก็คลิ๊กเพื่อสมัครได้เลยเนื่องจากป้ายปรากฏกระพริบๆนั้นสงวนเพื้นที่แสดงเฉพาะผู้ให้บริการระดับ vip และสายเปย์เล่นได้จ่ายจริงจึงอุ่นใจได้ค่ะโดยเฉพาะใครที่ตามหา Thai Hi Lo ค่าย Kingmaker กดป้ายตามไปเลือกค่ายได้ค่ะ\n", + "โค๊ด: [Select]\n", + "\n", + "\n", + "doc\n", + "มัดรวมของฝากเมืองภูเก็ต สวัสดีจ้ะทุกคน วันนี้แอดไม่นร้านแม่จู้ ของกำนัลจังหวัดภูเก็ตใกล้ทางออกไปท่าอากาศยาน เสนอแนะว่ามาท่องเที่ยวจังหวัดภูเก็ตแล้วจะต้องมีของกำนัล 3 อย่างงี้ติดไม้ติดมือไป ภูเก็ต วิลล่า ห้ามพลาดเลย ที่จะซื้อไปฝาก ไม่เช่นนั้นได้ว่ามาไม่ถึงจังหวัดภูเก็ตกันอย่างยิ่งจริงๆ ร้านค้าม่าม้าจู้ ของกำนัลเมืองจังหวัดภูเก็ต ชี้แนะของกำนัลจังหวัดภูเก็ต 3 อย่าง Phuket Villas เเอดเลยขอเลือกผลิตภัณฑ์ที่นับได้ว่าเป็นที่นิยมที่สุดเมื่อมาเยี่ยมจังหวัดภูเก็ตต้องจับติดไม้ติดมือไป… เพียงแต่ 3 อย่างที่ห้ามพลาดโดยเด็ดขาด! เเล้วสหายๆรู้สึกว่าของดีจังหวัดภูเก็ตโน่นเป็นอย่างไรกันบ้างเอ่ย\n", + "ของหวานเต้าส้อ\n", + "เป็นของหวานที่ให้มาจังหวัดภูเก็ตแล้วจำเป็นต้องได้ทาน เนื่องจากตัวของหวานมีความเป็นเอกลักษณ์ แป้งบาง กรอบ ร่วน ไส้ที่คนจังหวัดภูเก็ตนิยมเอามาทำเต้าส้อเป็นไส้เค็ม และก็ไส้หวาน สำหรับในรูปภาพที่มองเห็นนี้เป็นของหวานเต้าส้อไส้หวานจ้ะ ทำจากถั่วเขียว ยิ่งทานคู่กับกาแฟร้อน\n", + "ต้าส้อ คำนี้มาจากภาษาจีนฮกเกี้ยน ในจังหวัดพังงาและก็จังหวัดภูเก็ต เป็นของหวานที่คนไทยเชื้อสายจีนฮกเกี้ยนนิยมทำกิน เต้าส้อเป็นของหวานมงคล เดิมมี 2 ไส้หมายถึงไส้หวานซึ่งทำมาจากถั่วกวน และก็ไส้เค็ม แต่ว่าเดี๋ยวนี้มีการปรับเปลี่ยนทำให้มีไส้ รสต่างๆเพิ่มมากขึ้น เป็นต้นว่า ไส้มะม่วง,ไส้ทุเรียน,ไส้ชาเขียว โครงการภูวิลล่า ภูเก็ต\n", + "ของหวานเต้าส้อ มีเนื้อแป้งที่กรอบนอกนุ่มในแล้วก็แป้งบาง ของหวานกรอบและก็นุ่มเมื่อกัดลงไปทุกคำ ของหวานเต้าส้อทำจากถั่วเขียวบดผสมกับน้ำตาล ซึ่งมีอีกทั้งไส้หวานแล้วก็ไส้เค็ม แล้วก็มีการใส่ไข่แดงเค็มผสมในไส้ด้วยทำให้รสอร่อยมากขึ้น จริงอยู่ที่ของหวานเต้าส้อมีลักษณะก็จะคล้ายของหวานเปี๊ยะ แม้กระนั้นส่วนใหญ่แล้วของหวานเปี๊ยะจะมีขนาดใหญ่ และก็ไส้จะเป็นไส้ฟัก(ขนมจันอับ) หรือไส้ถั่วเหลืองเพียงอย่างเดียว\n", + "เต้าซ้อแม่บุญธรรม ร้านค้านี้เขาเป็นร้านค้าที่ทำเต้าซ้อมาช้านาน รวมทั้งมี “โกหัว” ผู้เป็นพ่อค้าหิ้วของหวานขายในอดีต จนกระทั่งตอนนี้ร้านค้าได้มีการเปลี่ยนแปลง แล้วก็ปรับปรุงให้มีความนำสมัย สะอาด มีมาตราฐาน Phuket Villas จากวัยรุ่นยุคสมัยใหม่เป็น“คุณจูน” ผู้สืบทอดสูตรเต้าซ้อร้านค้าแม่บุญธรรม เต้าซ้อของที่ร้านค้า จะไม่เสมือนเต้าซ้อของร้านค้าอื่น ครั้งก่อนขนาดของเต้าซ้อที่ร้านค้าจะมีขนาดเล็กกว่าร้านค้าอื่น ในช่วงเวลานี้ได้ปรับให้มีขนาดธรรมดาแล้ว แม้กระนั้นหากผู้ใดกันแน่ยังคิดดวงใจกับขนาดเล็กอยู่\n", + "ก็สามารถออเดอร์ได้เลย จำกัดออเดอร์ไม่เกิน 20 กล่อง/ วัน เพียงแค่นั้นนะคะ กล่าวถึงรสของไส้เต้าซ้อทางร้านค้าเปลี่ยนแปลงมาหลายรอบ จนบัดนี้ได้สูตรที่พอดี ไม่มัน แล้วก็อร่อยชาวพื้นเมือง รวมทั้งนักเดินทาง” ฟังแบบงี้แล้ว ต้องการลองกันแล้วใช่ไหมล่ะขา แม้กระนั้นพวกเราจะพาไปบุกมองกรรมวิธีผลิตเต้าซ้อกันก่อน เพิ่มน้ำย่อยให้ล้นกระเพาะเลย\n", + "เต้าซ้อของตรงนี้จะขายวันต่อวัน แล้วก็จะปั้นเต้าซ้อ พร้อมอบของหวาน วันละ 2 รอบ อีกทั้งตอนเช้า และก็บ่ายกันเลย! เรียกว่า ปั้นกันตลอดทั้งวันขนาดนี้ ก็ยังขายไม่ทันนะคะ อบเสร็จปุบปับ หมดปั๊บเลย ผู้ใดจะไปซื้อหลายๆกล่อง ชี้แนะให้โทรจองก่อนเลย ถ้าเกิดอดรับประทานประเดี๋ยวจะกล่าวหาไม่เตือน! ของเขาขายดิบขายดีเป็นเทน้ำเทท่าจริงๆเริ่มกันที่ผสมแป้ง รวมทั้งนวดแป้งให้ได้ตามสูตรของของหวานเต้าซ้อ หลังจากนั้นเอามาหั่นให้เป็นก้อนๆเพื่อเตรียมตัวไว้สำหรับในการปั้นเต้าซ้อ ใช้ไม้กดรีดแป้งให้บาง แล้วม้วนเป็นก้อนๆพักไว้จัดแจงใส่ไส้\n", + "ไส้ของเต้าซ้อ จะทำจากถั่วเขียวกวน ตัวไส้หวาน จะเป็นถั่วเขียวกวนใส่น้ำตาล ส่วนไส้เค็ม เป็นถั่วเขียวกวนกับเกลือ น้ำตาล และก็พริกไทย เป็นสูตรที่เปลี่ยนแปลงรสให้พอดีมาแล้ว ทั้งคู่ไส้จะมีแบบใส่ไข่เค็ม และไม่ใส่ด้วยนะคะ ปั้นกระทั่งเสร็จครบสองถาด ก็ตระเตรียมเอาเข้าอบกันได้เลยนะ ทางซ้ายเป็นไส้เค็ม ใช้งาเป็นเครื่องหมาย home แล้วก็ทางด้านขวาเป็นไส้หวาน แป้งเรียบเนียนเชียว ได้แบบงี้และจากนั้นก็เอาเข้าตู้อบเลย ได้ออกมาเป็นเต้าซ้ออบใหม่ ร้อนๆกลิ่นหอม ยั่วยวนใจมากมายๆเลยจ้ะ คนไหนได้มายืนหน้าเตาแบบงี้ ยืนยันว่าควรจะมีน้ำลายสอ ท้องร้องกันเลย คณะทำงานพวกเราเช็ดน้ำลายแทบจะไม่ทันเลยล่ะ\n", + "แกงไตปลา\n", + "แกงไตปลาเป็นเอกลักษณ์ของคนภาคใต้อยู่แล้วใช่ไหมค่ะ แม้กระนั้นของร้านค้าม่าม้าจู้ พวกเรามีความพิเศษเป็น มีให้เลือกร่วมกันถึง 3 สไตล์ อย่างเช่น แกงไตปลาน้ำ, แกงไตปลาแห้ง รวมทั้งแกงไตปลาคั่วเกลือก นอกเหนือจากนั้น ทางร้านค้ายังมีกรรมวิธีการผลิตที่ต่ออายุการเก็บแกงไตปลาได้นานถึง 1 ปี โดยไม่ใส่วัตถุกันเสียอีกด้วยจ้ะ\n", + "แกงไตปลา จังหวัดภูเก็ต หรือราษฎรจังหวัดภูเก็ตมักเรียกว่า ” แกงพุงปลา ” แกงไตปลา หรือ แกงพุงปลา นับว่าเป็นของกินของคนใต้ ยอดนิยมมากมาย ซึ่งน้ำพุงปลา ทำจากส่วนของพุงปลา โดยการนำมามัก ใส่เกลือเก็บไว้จนได้ที่ แนวทางการแกง ราวกับแกงทั่วๆไป โดยมีส่วนประกอบ ปลาย่าง เม็ดมะม่วงหิมพานต์สด หน่อไม้ดอง ถั่วค้าง มันฝรั่ง หรือตามแต่ที่ผู้แกงนิยม แกงไตปลา หรือ แกงพุงปลานั้น มีรสค่อนข้างจะรสจัด โดยเฉพาะอย่างยิ่งรสเผ็ดจะเผ็ดมากมาย เหตุเพราะที่จะต้องมีรสจัดเพื่อกำจัดกลิ่นคาวของพุงปลา\n", + "แกงไตปลา เป็นอีกหนึ่งรายการอาหารของชาวภาคใต้ที่นิยมกินกัน ซึ่งแกงไตปลาที่อร่อยควรจะมีรสที่จัดจ้า โดยยิ่งไปกว่านั้นรสเผ็ดต้องเผ็ดมากมาย สามารถทานคู่อาหารงามร้อนๆหรือ จะทานกับขนมจีนก็ได้ บ้านจัดสรร แทบกล่าวได้เลยว่าหากพวกเราไปกินอาหาร หรือ ข้าวแกงที่ใด ทุกๆที่ ควรจะมีรายการอาหาร แกงไตปลา ให้พวกเราได้รับประทานกัน และก็ตอนนี้ก็ยังได้มีการนำแกงไตปลามาดัดแปลง เป็นแกงไตปลาแห้ง ซึ่งสามารถเก็บไว้ได้นาน สบายแก่การนำเอา สามารถนำกลับไปเป็นของฝากติดไม้ติดมือได้\n", + "“แกงไตปลา” หรือ “แกงพุงปลา” ที่ใช้เรียกกันในภาคใต้ ซึ่งเป็นของกินไทยที่โด่งดังของจังหวัดพัทลุง แกงไตปลามีสีที่เป็นเอกลักษณ์ แล้วก็รสอันเผ็ดร้อน แม้ผู้ใดกันได้ลอง ยืนยันเลยว่าจำเป็นต้องพึงใจแน่ๆ วันนี้ก็เลยนำสูตรพร้อมการทำแกงไตปลากล้วยๆซึ่งสามารถให้ทานเองถึงที่กะไว้บ้าน\n", + "น้ำพริกกุ้งทิ่ม\n", + "อย่างท้ายที่สุดแต่ว่าไม่ในที่สุด! ห้ามพลาดเด็ดขาด ด้วยเหตุว่าเมื่อระลึกถึงจังหวัดภูเก็ต ก็จำต้องระลึกถึงสมุทร… เเละกุ้งแทงก็เป็นอาหารทะเลอีกนึงอย่างที่ขึ้นชื่อลือนามเฉพาะในจังหวัดภูเก็ต / จังหวัดพังงา / กระบี่เพียงแค่นั้น ก็เลยนับได้ว่าเป็นของกำนัลสุดพิเศษจากจังหวัดภูเก็ตจริงๆจ้ะ น้ำพริกกุ้งแทงทำมาจากเครื่องเทศ อย่างเช่น พริก หอม กระเทียม กะปิเอามาตำให้ถูกกัน แล้วผสมกับกุ้งแทง แต่งรสด้วยเครื่องปรุง ดังเช่น เกลือ น้ำตาล มะนาวหรือมะขามแฉะ รูปแบบของน้ำพริกกุ้งแทงทั่วๆไปจะออกจะแห้งจ้ะ เหมาะสมจะทานกับผักสดรวมทั้งผักต้มได้ตามที่ใจต้องการเลยจ้า ไม่ว่าจะเป็น แตงร้าน สะโคน ถั่วค้าง มะเขือ ข้าวโพดอ่อนต้ม กะหล่ำดอกต้ม และก็ที่จำเป็นเลยเป็นข้าวสุกร้อนๆสรุปว่าเด็ด บ้าน\n", + "ดารานำชายของรายการอาหารนี้คงจะหนีไม่พ้น “กุ้งทิ่ม” ต้องการแน่ๆ โดยกุ้งแทงเป็นการรักษาอาหารอย่างหนึ่งของภาคใต้ เป็นการนำเอากุ้งใหม่ๆมาแทงไม้ปิ้งทั้งยังเปลือกแล้วก็รมควันจากกาบมะพร้าวจนได้กุ้งที่มีกลิ่นหอมสดชื่นแม้กระนั้นที่สำคัญจำต้องไม่ไหม้นะคะ กุ้งเสียบนิยมเอามาทำเป็นน้ำพริกทานกันในครอบครัวรวมทั้งปรับปรุงรสจนกระทั่งเปลี่ยนมาเป็นของดีของเด่นประจำแคว้นในขณะนี้\n", + "รสของน้ำพริกกุ้งทิ่ม ร้านค้า แม่จู้ จังหวัดภูเก็ต : กุ้งแทงในน้ำพริกค่อยข้างกรอบจ้ะ รส หวาน เค็ม เผ็ด ครบ 3กระทรวงแรงงานและสวัสดิการสังคมทานแล้วรสหวานรสเค็มมาพร้อมเพียงกันจ้ะ ตามและก็ด้วยความเผ็ดเป็นชั้นท้ายที่สุดจ้ะ ส่วน Packaging เป็นแบบเริ่มแรกเลยนะ กระปุกพลาสติกใสแบบแบน เปิดปิดแบบหมุนเข้าหมุนออกจ้ะ สบายดี เหมาะสมกับการซื้อเป็นของฝากแบบไม่น้อยเลยทีเดียวหลายๆกระปุก นอกจากนั้นยังมีขนาด 70 กรัม ราคา 80 บาท รวมทั้งขนาด 150 กรัม ราคา 150 บาทด้วยจ้ะ\n", + "คนใดถูกใจความเผ็ดจำเป็นต้องกระปุกนี้เลยจ้ะ เผ็ดร้อน เผ็ดนาน ทานอาหารงามร้อนๆผ่านเลยจ๊า ส่วน Packaging เป็นขวดแก้วใสจ้ะ มองเห็นตัวน้ำพริกภายในแบบแจ่มกระจ่างจ้ะ ใช้สีแดงเป็นหลักเด่นสะดุดตามากมายจ้ะ บ้านหรู เป็นของฝากได้สบายเลย คำแรกที่ทานได้เรื่องหอมของพริกแล้วก็กระเทียมสดมากมายเลยนะ รสไม่เผ็ดมากมาย หวานเค็มพอดิบพอดีกัน เด่นที่กลิ่นหอมยวนใจของน้ำพริก ส่วน Packaging เป็นขวดแก้วใสและไม่สูงมากมายจ้ะ มีฉลากข้างขวดบอกเนื้อหาแจ่มกระจ่างดีจ้ะ\n", + "\n", + "doc\n", + "สารบัญ สมัครสมาชิก สล็อตเว็บตรง ข้อดีของเว็บสล็อตเว็บตรงเป็นเว็บที่มีคนเล่นเยอะที่สุด เพราะเป็นเว็บที่น่าสนใจ เป็นสล็อตเว็บตรงไม่ผ่านเอเย่นต์มีรูปแบบการให้บริการที่มีความทันสมัยมากขึ้นและใช้งานง่ายเหมาะสำหรับการลงเดิมพันในยุคปัจจุบันที่ใช้ชีวิตเร่งรีบในการตัดสินใจ ซึ่งสล็อตเว็บตรงได้ถูกออกแบบมาอย่างตอบโจทย์ผู้เล่นเป็นอย่างดีเพราะเว็บสล็อตเว็บตรง มีข้อดีดังนี้ สามารถเข้าใช้งานได้ง่าย เป็นเว็บสล็อตเว็บตรงที่มียอดผู้ใช้งานเพิ่มขึ้นอย่างต่อเนื่อง เพราะเป็นเว็บสล็อตที่สามารถเข้าถึงได้ง่ายมีเกมให้เลือกลงเดิมพันมากมายหลากหลายเกมที่ควบคุมทุกระบบการใช้งาน ระบบของเว็บมีความทันสมัย มีความปลอดภัยและมีความมั่นคงทางด้านการเงิน ทางเว็บมีการรักษาข้อมูลของผู้เล่นไว้เป็นอย่างดี จึงได้รับความไว้วางใจจากนักเดิมพันหลายๆคนเพราะด้วยระบบการทำงานของเว็บที่มีความทันสมัยสามารถเข้าใช้งานได้ง่ายไม่ยุ่งยากอีกต่อไป เพราะได้รับการตรวจสอบจากผู้ดูแลพัฒนาระบบที่สนับสนุนเว็บไซต์สล็อตเว็บตรงไม่ผ่านเอเย่นต์อย่างถูกต้องตามกฎหมายกล้าการันตีได้เลยว่าเป็นสล็อตเว็บตรง ที่มีความพร้อมทางด้านการให้บริการอย่างเต็มรูปแบบ มีเกมสล็อตให้เลือกเล่นมากมายจากทุกค่ายเกมดัง แน่นอนว่าสล็อตเว็บตรงเป็นแหล่งรวมเกมสล็อตมากมายจากหลายค่ายเกมดังครบจบในเว็บเดียว เพิ่มช่องทางการทำรายได้ให้กับผู้เล่นมากยิ่งขึ้น อีกทั้งยังมีเกมสล็อตให้เลือกเล่นกว่า 1000 เกมที่พร้อมคัดสรรนำมาให้ผู้เล่นเลือกใช้บริการ ที่รับรองได้เลยว่าถูกใจผู้เล่นอย่างแน่นอน ระบบต่างๆเป็นระบบอัตโนมัติ เป็นเว็บสล็อตเว็บตรงที่อำนวยความสะดวกให้กับผู้เล่นเป็นพิเศษเพื่อให้ระบบการทำงานคลับเคลื่อนไปอย่างรวดเร็วเพราะผู้เล่นสามารถทำรายการฝากถอนได้เองผ่านระบบอัตโนมัติใช้เวลาไม่นานในการเติมเครดิตก็สามารถร่วมลงเดิมพันได้เลยทันที ผู้เล่นทุกคนสามารถไว้วางใจได้อย่างแน่นอนเพราะเป็นเว็บที่มีผู้ดูแลที่เชี่ยวชาญทางด้านคอมพิวเตอร์ในการพัฒนาดูแลระบบเพื่อให้เกิดความขัดข้องน้อยที่สุด จัดหนักจัดเต็มทั้งโปรโมชั่นและสิทธิพิเศษสุดคุ้ม สล็อตเว็บตรงไม่ผ่านเอเย่นต์พร้อมเปิดให้บริการตลอด 24 ชั่วโมงและมีโปรโมชั่นมาให้ผู้เล่นเลือกมากมายมีกิจกรรมมาให้ผู้เล่นครบทุกเดือนเพื่อเป็นจุดดึงดูดให้มีสมาชิกเข้าใช้งานเพิ่มขึ้นอย่างต่อเนื่องแถมยังมีโปรโมชั่นมากมายเช่นโปรโมชั่นเชิญชวนเพื่อน โปรโมชั่นคืนยอดเสีย 5% ,โปรโมชั่นวันเกิดและยังมีโปรโมชั่นอื่นๆอีกมากมายที่มีมาให้ผู้เล่นติดตามข่าวสารกันอย่างต่อเนื่องผ่านหน้าเว็บสล็อตเว็บตรงเพื่อความสะดวกรวดเร็วในการเลือกเข้าใช้บริการ วิธีสมัครสมาชิกเว็บตรง 2022 สล็อตเว็บตรง เว็บสล็อตแตกง่ายสามารถเข้าร่วมเป็นสมาชิกกับเว็บตรง 100% แตกง่ายได้เงินจริงพร้อมให้บริการที่มีความทันสมัยมากขึ้นสมัครง่ายในไม่กี่ขั้นตอนก็สามารถร่วมลงเดิมพันได้เลยทันที เลือกสมัครสมาชิกสล็อตเว็บตรงเข้าใช้บริการกับสล็อตเว็บตรงที่มียอดผู้ใช้งานเพิ่มขึ้นอย่างต่อเนื่องและเป็นเว็บที่มีความปลอดภัยและมีความมั่นคงทางด้านการเงิน กรอกข้อมูลชื่อ-นามสกุลของผู้สมัครให้ถูกต้องเพื่อความสะดวกรวดเร็วในการตรวจสอบข้อมูล กรอกข้อมูลเบอร์โทรศัพท์ให้ถูกต้องของผู้ที่ต้องการสมัครอยู่ไหนเพื่อความสะดวกรวดเร็วในการเข้าสู่ระบบและการติดต่อ ตั้งรหัสผ่านที่มีความปลอดภัยสูงเพื่อความปลอดภัยในการเข้าสู่ระบบและรักษาข้อมูลของผู้เล่นเองป้องกันไม่ให้ข้อมูลรั่วไหล กรอกหมายเลขบัญชีธนาคารอย่างถูกต้องและตรวจสอบหมายเลขอีกครั้งเพื่อความแม่นยำ และความสะดวกรวดเร็วในการทำรายการฝากถอนผ่านระบบอัตโนมัติที่จะช่วยเพิ่มอำนวยความสะดวกให้กับผู้เล่นมากยิ่งขึ้นและที่สำคัญชื่อบัญชีธนาคารจะต้องตรงกับชื่อที่ใช้สมัครไว้ ไม่สามารถใช้ชื่อบัญชีธนาคารผู้อื่นแทนได้ สมัครง่ายในไม่กี่ขั้นตอนก็สามารถร่วมลงเดิมพันได้เลยทันที สมัครง่ายไม่เสียค่าสมัครสามารถสมัครได้ด้วยตัวเองง่ายๆผ่านหน้าเว็บไซต์ของ สมัครสมาชิกเว็บตรง คืนยอดเสีย กับสล็อตเว็บตรงดีอย่างไร สล็อตเว็บตรงแตกง่ายใครที่กำลังตามหาเว็บสล็อตที่มีความปลอดภัยจะต้องไม่พลาดกับสล็อตเว็บตรงเว็บที่ตอบโจทย์ทุกระบบการใช้งานและมีความมั่นคงทางด้านการเงิน เอาใจใส่ทุกการให้บริการเป็นอย่างดี มาพร้อมเกมสล็อตแตกง่ายที่มาพร้อมโปรโมชั่นสิทธิพิเศษสุดคุ้มอีกเพียบและมีการแจกรางวัลโบนัสและรางวัลแจ็กพอตกันอย่างเต็มที่ …\n", + "ข้อดีของการ สมัครสมาชิกเว็บตรง คืนยอดเสีย เกมสล็อตแตกง่ายที่เยอะที่สุด Read More »\n", + "เว็บเกมสล็อตคุณภาพ ไม่ผ่านเอเย่นต์ แตกง่าย รวมเกมครบทุกค่าย\n", + "สล็อตเว็บตรง / June 22, 2022 June 22, 2022\n", + "สารบัญ สมัครสมาชิก สล็อตเว็บตรง สล็อตเว็บตรง ไม่ผ่านเอเย่นต์ ผู้ให้บริการเกมสล็อตออนไลน์ที่ดีที่สุด เว็บคุณภาพที่ได้รับความนิยมจากนักเดิมพันทั่วโลก เป็นสล็อตเว็บใหญ่ที่สุด ศูนย์รวมเกมสล็อตออนไลน์ที่มีเกมสล็อตออนไลน์มากกว่า 1000 เกมจากค่ายดังยอดฮิตยอดนิยมชั้นนำของประเทศ ซึ่งคัดสรรแต่เกมที่ดีมีคุณภาพโดยผู้ผลิตและสร้างสรรค์เกมสล็อตออนไลน์มืออาชีพ พัฒนาเกมสล็อตออนไลน์และอัปเดตเกมใหม่ๆ เพื่อผู้เล่นสล็อตออนไลน์อยู่เสมอ สล็อตเว็บตรง แตกง่าย มีอัตราการจ่ายเงินรางวัลที่สูง แจ็กพอตแตกง่าย แตกหนัก แตกทุกวันไม่มีกั๊ก ได้รับเงินง่าย ได้รับเงินจริง เพราะเว็บตรง 100% มีความปลอดภัยและน่าเชื่อถือ มีรีวิวจากประสบการณ์ผู้เล่นจริงอย่างหนาแน่นเป็นตัวการันตีว่าปลอดภัยอย่างแน่นอน เพราะปัจจุบันนี้มีเว็บไซต์สล็อตออนไลน์เปิดให้บริการเป็นจำนวนมาก และเสี่ยงโดนโกงเป็นจำนวนมาก แต่หากเลือกเล่นเว็บตรง100% ไม่มีปัญหาการโกงอย่างแน่นอน เพราะทางเว็บได้รับการตรวจสอบโดยหน่วยงานที่สนับสนุนและพัฒนาเว็บตรงสล็อตอย่างถูกต้องถูกกฎหมาย มั่นคงทางการเงินสูง และยังมีระบบการฝากถอนอัตโนมัติที่ไม่มีขั้นต่ำจากเทคโนโลยีที่ทันสมัย มีความสะดวกรวดเร็วและสร้างความเชื่อมั่นให้แก่ผู้เล่นในบริการทางด้านทางการเงิน ซึ่งผู้เล่นสล็อตออนไลน์ เว็บตรง สามารถทำรายการฝากถอนได้ด้วยตนเองผ่านหน้าเว็บไซต์ได้ด้วยตนเองตลอด 24 ชั่วโมง ใช้เวลาในการทำรายการไม่เกิน 15 วินาที ด้วยความรวดเร็วทันใจ หมดปัญหาการฝากถอนเงินไม่เข้าระบบ สล็อต เว็บตรงไม่ผ่านเอเย่นต์ไม่มีขั้นต่ำ ลงเดิมพันได้อย่างไม่จำกัด มาสมัครสมาชิก สล็อตเว็บตรง และร่วมสนุกทำกำไรรับโบนัสแจ็กพอตแตกกลับบ้านในทุกๆ วัน เว็บเกมสล็อตคุณภาพ ไม่ผ่านเอเย่นต์ คืออะไร ? …\n", + "เว็บเกมสล็อตคุณภาพ ไม่ผ่านเอเย่นต์ แตกง่าย รวมเกมครบทุกค่าย Read More »\n", + "สัญลักษณ์ Wild และ Scatter มีหน้าที่อะไรใน PG SLOT\n", + "PGSLOT / June 22, 2022 June 22, 2022\n", + "สารบัญ สมัครสมาชิก สล็อตเว็บตรง PG SLOT มีเกมสล็อตออนไลน์มากกว่า 500 เกม 500 รูปแบบ จะมีสัญลักษณ์ WILD และ SCATTER ทุกๆเกมในค่าย PG SLOT สำหรับผู้เล่นมือใหม่ที่พึ่งเข้ามาเล่นเกมสล็อตออนไลน์ก็อาจจะสงสัยว่าสัญลักษณ์ WILD และ SCATTER มีไว้ทำอะไร ทำไมถึงมีทุกเกม และวันนี้บทความสล็อตเว็บตรงจะมาแนะนำให้กับผู้เล่นมือใหม่ว่าสัญลักษณ์ WILD และ SCATTER มีไว้ทำอะไรบ้าง สัญลักษณ์ WILD และ SCATTER เป็นสัญลักษณ์พิเศษ ที่จะทำให้การเล่นเกมสล็อตออนไลน์ของผู้เล่นชนะได้ง่ายมากยิ่งขึ้น สัญลักษณ์ WILD และ SCATTER จะมีความพิเศษตามดังต่อไปนี้ สัญลักษณ์ WILD สัญลักษณ์ WILD เป็นสัญลักษณ์พิเศษ​ที่จะมีอยู่ในเกมสล็อตออนไลน์ของค่าย PG SLOT ทุกเกม สัญลักษณ์ WILD จะมีหน้าที่แทนสัญลักษณ์อื่นๆในเกมสล็อตออนไลน์ทุกสัญลักษณ์ เพื่อที่จะทำให้การเล่นเกมสล็อตออนไลน์ของผู้เล่น สล็อตแตกง่ายมากยิ่งขึ้น ไม่ว่าสัญลักษณ์ WILD จะอยู่ที่แถวไหนรีลไหน …\n", + "\n", + "doc\n", + "บางทีคุณอาจตระหนักว่าการเล่นโป๊กเกอร์ทำเงินได้ง่ายกว่า เซ็กซี่บาคาร่า คุณสามารถทำได้ แต่คุณไม่รู้จริงๆ ว่าทำอย่างไร บ่อยครั้งที่คุณได้ยินเกี่ยวกับผู้เล่นที่ประสบความสำเร็จที่โต๊ะ พวกเขามักจะถูกผู้เล่นโจมตี และการสูญเสียนั้นง่ายพอๆ กับการสูญเสียในเท็กซัส โฮลเด็ม เราจะตรวจสอบวิธีการต่างๆ สองสามวิธีที่ผู้เล่นที่ประสบความสำเร็จเพื่อเชี่ยวชาญในโป๊กเกอร์ที่นี่ และคุณมักจะได้เรียนรู้มากกว่าแค่วิธีการเล่น\n", + "เมื่อคุณได้เรียนรู้เกี่ยวกับเกมมาบ้างแล้ว คุณมักจะพบรูปแบบการเล่นที่แตกต่างจากผู้เล่นคนอื่นๆ หากคุณยังไม่ได้ทำเงินจำนวนมากในการเล่นโป๊กเกอร์ ให้ลองเล่นเกมอื่น หรือแม้แต่สำรวจเกมโป๊กเกอร์ใหม่ ในโลกออนไลน์ ห้องโป๊กเกอร์หลายแห่งมีโต๊ะเล่นเงิน ทดสอบทักษะของคุณ และแม้กระทั่งให้คุณเล่นเกมเงินจริงได้ฟรี เกมที่มีความเสี่ยงต่ำ\n", + "ไพ่ที่แจกในเกมโป๊กเกอร์ไม่เหมือนกับเกมบนบก Texas Hold’em เป็นตัวอย่างที่ดีของเรื่องนี้ เมื่อคุณและเพื่อนของคุณเล่น Texas Hold’em คุณมักจะเห็นผู้เล่นสร้างสแต็คสั้น ๆ โดยการตีมือที่ดีกว่า แม้ว่าจะมีไพ่สองใบที่แจกให้ผู้เล่นแต่ละคนในเท็กซัส โฮลเด็ม แต่ถ้าคุณได้ไพ่ที่ดีกว่า คุณก็จะเพิ่มโอกาสในการชนะเงินในเกม หากคุณยังไม่ประสบความสำเร็จในเกม ทำไมไม่ลองลดความแข็งแกร่งของผู้เล่นด้วยการเรียกการเดิมพันแบบรวมทั้งหมดดูล่ะ\n", + "โดยปกติเมื่อคุณเรียกการเดิมพันแบบ all-in มันจะเป็นการเล่นที่ให้ผลกำไรสำหรับคุณ ปัญหาเกิดขึ้นเมื่อคุณยกขึ้นใหม่ บ่อยครั้งคู่ต่อสู้ของคุณจะคิดว่าคุณมีมือดีที่สุด และคุณจะได้รับค่าตอบแทนบ่อยกว่าที่คุณจะได้รับ เมื่อคุณเพิ่มระดับใหม่ คุณจะเห็นไพ่โป๊กเกอร์ที่บริสุทธิ์ ดังนั้นคู่ต่อสู้ของคุณอาจต้องการหมอบตัวเอง\n", + "หากคุณได้อ่าน “ทฤษฎีโป๊กเกอร์” คุณอาจตระหนักดีว่าคุณต้องเริ่มเล่นไม่กี่มือ หากคุณต้องการเอาตัวรอดในรอบแรก คุณจะต้องอยู่บนปุ่มหรืออยู่ทางขวาของปุ่ม ที่ปุ่มนี้ คุณจะเป็นผู้ควบคุมเกมมากที่สุดเนื่องจากคุณเป็นคนสุดท้ายที่ลงมือ\n", + "อย่างไรก็ตาม ทางด้านขวาของปุ่ม คุณจะเป็นคนสุดท้ายที่ลงมือ เนื่องจากคุณอยู่นอกตำแหน่ง คุณมีความได้เปรียบด้านตำแหน่งเหนือคู่ต่อสู้ของคุณ สิ่งนี้ไม่มีประโยชน์ในสถานการณ์ที่ต้องแจ้งให้ทราบล่วงหน้า เนื่องจากคุณออกจากตำแหน่งแทบตลอดเวลา ในตำแหน่งนี้ คุณเปิดรับการเพิ่ม หรือแม้แต่การขโมยแบบตาบอด\n", + "ปัญหาทั่วไปของผู้เล่นในบลายด์คือพวกเขาก้าวร้าวเร็วมาก เป็นเรื่องปกติที่จะต้องการปกป้องคนตาบอดของคุณ แต่ในความเป็นจริง คุณจะต้องเสียเงิน ตัวอย่างบางส่วนของสิ่งนี้กำลังเล่นเกิน flop โดยไม่มีอะไร หรือแม้กระทั่งไม่มีมือสำหรับ flop\n", + "ในตำแหน่งใด ๆ คุณต้องก้าวร้าวอย่างมาก บ่อยครั้งคุณจะไม่ต้องการเล่นไพ่ใบอื่นนอกเหนือจากมือระดับพรีเมียมในบลายด์ คุณสามารถประสบปัญหาได้หากพบความล้มเหลวเช่น 6-2-K หรือ 2-2-8 แน่นอนว่ามือที่มีความเสี่ยงต่ำจะทำได้ แต่คุณต้องมีกลยุทธ์ที่ดุดัน หากคุณถูกเรียก คุณยังมีโอกาสที่ดีที่จะเพิ่มเป็นสองเท่า หากคุณถูกเลี้ยงดูมา คุณจะต้องมีมือที่แข็งแกร่งเพื่อที่จะเอาตัวรอดจากการถูกเลี้ยงซ้ำ\n", + "มีคำกล่าวในวงการฟุตบอลว่าให้มองหา “คนยิง” เพื่อเสี่ยงโชค เซ็กซี่บาคาร่า เพเซอร์สไปที่ซูเปอร์โบวล์ และในเอ็นบีเอ เราสามารถมองว่าทีมตะวันตกแข็งแกร่ง และบอกว่าสเปอร์สหรือซันจะไปได้ไกล ใน NFL อาจเป็น Chiefs, Broncos หรือ Browns คุณสามารถคาดเดาได้เล็กน้อย แต่อย่าเดิมพันด้วยปากของคุณที่เปิดอยู่ เดิมพันด้วยสมองและหัวใจของคุณ และไม่เสียค่าใช้จ่ายมากเกินไป\n", + "\n", + "doc\n", + "คู่มือติดตามผลผู้เชื่อใหม่ “คุณเป็นครอบครัวของพระเจ้า” ช่วยให้ผู้เชื่อใหม่มั่นใจว่าเขาเป็นบุตรของพระเจ้าและไม่มีอะไรทำให้เขาขาดจากความรักของพระองค์ได้ รวมถึงรู้จักการสารภาพบาปเพื่อคืนการสามัคคีธรรมกับพระเจ้าได้\n", + "\n", + "doc\n", + "เสือมังกรเล่นยังไง ufabet CN บอกวิธีและ เทคนิคการเล่นเสือมังกรให้ได้เงิน เสือมังกรเล่นยังไง เกมไพ่ เหมือนหรือต่างไหมจาก บาคาร่า ด้วยรูปแบบเกมที่หลายเป็นอันดับต้นที่คนเข้ามาเล่นบนแหล่งลงทุนหารายได้ คาสิโนออนไลน์ ทุกแห่งต้องจัดแต่งห้องเพียงพอต่อความต้องการบาง เว็บ ufabet เปิดเฉพาะเจาะกลุ่มลูกค้า เนื่องจากคนเล่น เกมไพ่ มีจำนวนตามเกณฑ์แล้วมากว่าเกมชนิดอื่นอยู่มาก ใครต่างต้องการปรับตัวให้ไว ซึ่งการดวลพนันออนไลน์เกมไพ่ไม่ใช่สิ่งแปลกใหม่เพียงปรับเปลี่ยนเข้ามาอยู่ในรูปแบบที่เอื้ออำนวยต่อการพนันในคอมพิวเตอร์และมือถือ ช่วยให้เราเดิมพันได้ง่ายดายตลอด 24h แค่นั้นมันจึงเป็นสิ่งแรกที่คนมักจะนึกถึงเมื่อต้องการเลือกเกมพนันเดิมพันสักอย่าง โดยหลักแล้วก็จะแยกกลุ่มออกจากจุดเริ่มต้นสองทางระหว่าง บาคาร่า เกมที่ต้องอาศัยลีลาการรุกเร้าเอาไหวพริบเข้าสู้ กับเสือมังกรเกมรุกเฉียบขาดด้วยโอกาสพลิกไพ่เพียงใบเดียวเท่านั้น มันจึงขึ้นอยู่กับสไตล์ความชอบของนักพนันแต่ละคนด้วยเหตุผลประกอบกันว่าเกมไพ่รูปแบบไหนจะสนองความต้องการและเป็นเกมที่ใช่ มาดูกันว่ามันแตกต่างหรือเหมือนกันยังไงไปดู เทคนิคเล่นเสือมังกร ยังไงให้ได้เงิน Ufabet Cn มีคำตอบ สมัครยูฟ่าเบท เริ่มเล่นได้เลยไม่ต้องรอ ขึ้นชื่อว่าเกมไพ่ในโลก เสือมังกรเล่นยังไง ก็สามารถนึกขึ้นมาได้ทันที ไม่เอาดี บาคาร่า มือถือ หรือเสือมังกร ต้องมารอท่าให้ทุกคนท้าทาย สำหรับ เว็บพนันยูฟ่า การเล่นทั่วไปบอกเลยว่าคล้ายกันแทบทั้งหมด ซึ่งหากว่าเล่น เว็บตรง ufabet ต้องอาศัยไพ่เป็นใบเบิกทางในการดวลเกมเพื่อคว้าชิงเงินรางวัล เดิมพันด้วยไพ่ใครแต้มใหญ่กว่าถือว่าชนะไปในแต่ละรอบ รวมถึงการวางเงินเดิมพันในรูปแบบที่หลากสไตล์ที่มาพร้อมกับอัตราการจ่ายที่ต้องศึกษาเพิ่มเริ่ม คราวนี้มาดูกันว่า บาคาร่ากับ โต๊ะเสือมังกร มีอะไรแปลกไป แตกต่างอย่างไร เพื่อประกอบการตัดสินใจในการเล่นไพ่พนัน เวลามีผลต่อการเดิมพัน เสือมังกร Casino เฉียบทันใจ หรืออาศัยการตัดสินใจเพิ่ม สิ่งสำคัญของการเดิมพันบางครั้งมีเวลาเป็นตัวกำหนด โดยเฉลี่ยเสือมังกรจะเป็นเกมที่จบไว เพราะไม่จำเป็นต้องคิดอะไรให้ปวดประสาท ความสามารถขึ้นอยู่ที่ไพ่ใบเดียวใช้เวลาในแต่ละรอบเพียง 15 วินาทีนับเป็นข้อดีของคนที่ชอบวิธีเอาชนะแบบเร่งด่วนเห็นผลทันที ต่างจากบาคาร่าเพิ่มเวลาเข้ามานิดหน่อย ด้วยต้องอาศัยประสบการณ์ความเก๋าของนักพนัน ดูลาดเลาเค้าไพ่เป็นหลักก่อนที่จะตักตวงใจว่าจะเลือกรุกเกมอย่างไรดีมีให้เลือกทั้งเจ้า… PG slot เว็บตรง UFABETCN บริการเกมสล็อตออนไลน์ ครบทุกค่าย ไม่ต้องดาวโหลด PG slot เว็บตรง ไฮไลท์พนันที่ใครก็ต้องเล่น ความได้เปรียบของคนเหยียบสนามพนัน นอกจากฝีมือฟาดฟันความสามารถที่มันอัดอั้นและเป็นตัวการันตีความสำเร็จบนเส้นทางนักเดิมพัน สิ่งที่มีความสำคัญไม่แพ้กัน มันต้องถูกที่ถูกทาง การวางระบบมาเพื่อสิ่งใดสิ่งหนึ่งโดยตรง แสดงถึงเป้าประสงค์เห็นได้ชัด แม้ว่าการพนัน ทุกวันนี้จะมีฟังก์ชันการเล่นที่หลากหลายเติมเต็มสาพัดแนวทางการสร้างเงินออนไลน์ผ่านรูปแบบการเดิมพันที่เพียบพร้อมทุกสิ่ง บางเว็บยิ่งกว่าคาสิโนยกมาเอง UFABET มีครบจบที่เดียว แต่นั่นก็แสดงให้เห็นถึงข้อด้อยมากกว่าเว็บที่พยายามขายฟังก์ชันเดียวโดยตรง จริงอยู่… ถ้ามีครบมันก็ดีลูกค้ามีโอกาสในการเลือกที่มาก แต่ก็ต้องตามมาด้วยการจัดวางระบบที่เราต้องรับมือกับหลายสิ่งให้ทันซึ่งมันก็อาจเกิดข้อผิดพลาดหรือยากในการดำเนินการ เทียบไม่ได้กับผู้เชี่ยวชาญนำเสนอผ่านรูปแบบการเล่นลักษณะเดียวก็สามารถนำเสนอจุดขายได้ดีกว่า ตอบโจทย์ ตรงที่ ตรงจุด ตรงเป้า สิ่งที่คาดหวังของเรามันยิ่งชัด ในเมื่อเลือกแล้วที่จะเดินเส้นทางที่ถนัด เว็บตรงชี้ชัดพร้อมวัดกับคุณโดยตรง เริ่มลงเดิมพัน แล้วคุณจะรู้ว่าเล่นเว็บตรง PG slot ทุกช็อตไม่เหมือนกันกับเว็บพนันทั่วไป สล็อตออนไลน์ PG SLOT เว็บตรง รูปแบบใหม่ ทดลองเล่นฟรี เล่นแล้วได้เงินจริง รู้จุดตอบโจทย์ลูกค้า พัฒนาเกมได้ตอบสนองกว่า ด้วยเป็นเกม PG slot เว็บตรง ที่นำเสนอชูตัวหลักเป็นสล็อตอย่างเดียว การที่มีประสบการณ์จากลูกค้าที่ชอบเล่นสล็อตก็คงชำนาญมากเป็นพิเศษ ควรปรับหรือขยับส่วนใด กราฟิก ดีไซน์ นำเทรนทันสมัย สร้างความประทับใจในการเดิมพัน สร้างฟังก์ชันตอบโจทย์ผู้ใช้งานจริงคงไม่ใช่เรื่องยาก สรรสร้างสล็อตเกมมากกว่า one hundred เกมให้กลายเป็นๆเครื่องมือที่นักพนันพึ่งพาในการสร้างกำไรได้ถล่มทลาย ความหลากหลาย ความถนัด ความง่าย รองรับลูกค้าได้ครบถ้วน ความหลากหลาย อัตราการจ่ายคุณเลือกได้เอง ความเป็นผู้นำในการพัฒนา pg slot เว็บหลัก ประสบการณ์ออกแบบรูปแบบเกมสล็อตนับไม่ถ้วน ล้วนเข้าถึงกลไกของการสร้างสล็อตให้สร้างแรงกระตุ้นดึงดูดใจ โดเฉพาะโอกาสในการทำกำไรของพนันสล็อตแต่ละชนิดก็ไม่เหมือนกัน ดังนั้นมันเป็นอีกฟังก์ชันเสริมที่เข้ามาเติมเต็มผลประโยชน์ที่คุณเลือกได้ เกมไหนง่ายหรือยาก กำไรมากหรือน้อย ทุกคนก็จัดสรรบริหารกันเองได้ตามความพึงพอใจ เน้นสนุก เน้นกำไร เน้นเติบโตไวอยู่ที่เลือกใช้เลย เริ่มต้นด้วยทุนน้… พนันออนไลน์ เว็บไหนดี คาสิโนเว็บตรง ufabet ชื่อนี้รับประกัน จ่ายชัวร์ เล่นได้ 24h คาสิโนเว็บตรง ufabet มือโปร เล่น เว็บพนันยูฟ่า ช่วยดัน ก้าวสู่ถึงรางวัลได้ดีกว่า บางทีอาศัยการเล่นมันก็มีคนเก่งเยอะมากมาย แต่เคยไหมอาจจะต้องผิดพลาดขึ้นมาอย่างน่าเสียดาย ไม่ว่าคุณจะเก่ง สู้จนแทบตาย สุดท้ายขึ้นอยู่กับเว็บที่เล่นด้วยว่าจะเป็นตัวช่วยหรือจะทำให้คุณซวยขึ้นมา ด้วยระบบออนไลน์ที่เขามาเปิดพื้นที่แสวงหาผลกำไรกว้างกว่า แต่ต้องยอมรับเลยว่าข้อเสียติดตามมาก็มี ด้วยระบบสัญญาณที่ต้องอาศัยตัวกลางในการวางเดิมพันแบบไม่ประชันหน้า พูดง่าย ๆ คือว่าเราเล่นพนันอยู่บนโลกเสมือนจริง ความเสี่ยงที่จะเจอเว็บร้ายที่ทำให้คุณพ่ายตั้งแต่เริ่ม อย่างว่าใครเปิดประเดิมก็ต้องอยากไปได้ดี แต่ด้วยกระแสมาแรงใครก็ต้องการร่วมสนุกขนาดนี้ เลี่ยงไม่ได้ที่จะมีมิจฉาชีพหรือกลุ่มบุคคลที่ไม่ประสงค์ดีคอยฉกชิงโอกาสนี้กอบโกยผลประโยชน์เข้าตัว เหตุนี้ทำให้นักล่ารางวัลที่กำลังตัดสินใจว่าจะก้าวขาลงเดินบนเส้นสายพนันไหม มันไม่ได้หน้ากลัวขนาดนั้น ด้วยเว็บเดิมพันมันก็มีวิธีดูแนวทางเลือกเล่นเดิมพันกันอยู่ เราสามารถเช็คดูได้ หรือง่ายสุดต้องเดิมพันโดยไม่ผ่านเส้นสายสร้างรายได้กับเว็บตรงที่ถูกควบคุมโดยบริษัทแม่ คาสิโนออนไลน์เว็บตรง เว็บแท้เมื่อเกิดปัญหาก็สามารถเอาผิดหรือเรียกร้องได้ทันที อีกทั้งยังเป็นตัวนำส่งคุณได้ง่ายกว่าเว็บทั่วไปที่มีกันเกลื่อนเลื่อนไปไหนผุดขึ้นมาใหม่นับร้อย จงฉกชิงผลพลอยได้เพื่อแสวงหาเว็บไม่สร้างความเสียหาย แต่เป็นประตูแห่งการสร้างรายได้ เว็บตรงจะช่วยคุณได้ เล่นเว็บง่าย คุณก็จบเกมง่ายด้วย มาดูว่า สมัครเว็บพนันออนไลน์ จะทำให้คุณรวยแบบยืนยง ยังคงเดินต่อไปได้ เพราะลงสนามพนันมาแล้วมันถอยไม่ได้ เงินรางวัลที่คาดหมายอยู่ปลายทาง ใครจะอยากวางมือ เดิมพันต้องมีแหล่งเดิมพันที่เรายึดถือ มันคือสิ่งที่คอยเสริมแรงผลักดัน เล่นเว็บตรงไม่ขายฝัน ไขว่คว้ากำไรจากเว็บพนันแบบมือโปร สมัครยูฟ่าเบท คาสิโนออนไลน์ เว็บใหญ่ การเงินมั่นคง จ่ายทุกบิล มีโปรโมชั่นคืนยอดเสียทุกเดือน เติบโตไม่ขายฝัน คาสิโนเว็บตรง ufabet เล่นพนันเว็บตรงเท่านั้น เงินรางวัลไม่หาย ความมั่นคงของผลลัพธ์ถือเป็นเป้าหมายในการสร้างรายได้กับแหล่งพนันออนไลน์ ทางเข้า ufabet มือถือ กลายเป็นสถานที่สร้างความสุข เติมความหวัง การแสวงหาผลประโยชน์แบบก้าวกระโดดที่ใครจะตามทัน เจาะแหล่งนักล่าเงินรางวัลที่มีมูลค่ามหาศาล แต่ก็คงถูกบิดเบือนไม่น้อย หากเล่นแล้วได้โชคลาภ แต่กล… แทงบอลยูฟ่า แทงบอลออนไลน์ UFABET ราคาบอลที่ถูกที่สุดเพียง4ตังค์ แทงบอลยูฟ่า เลี้ยงลูกบอล ต้องอาศัยลูกเล่น สร้างความโดดเด่นให้คุณเป็นผู้ชนะเว็บ แทงบอลออนไลน์ การเติบโตของคาสิโนมาแรงไม่หยุด ไม่เคยหลุดฟอร์มเป็นที่ยอมรับของลูกค้า กลุ่มผู้เล่นที่เข้ามาหวังคว้าผลประโยชน์ไปให้ได้ ซึ่งมันก็มีโอกาสที่จะทำได้ แต่ก็ไม่ใช่ทุกคนที่จะเอามันมาง่ายขนาดนั้น กลุ่มลูกค้าส่วนใหญ่ที่เข้ามาเดิมพันมีหลายแบบ หากแยกกันจริงให้ง่ายคนที่เล่นได้ทำกำไรกับเว็บแทงบอลอย่าง UFABET สม่ำเสมอเราจะเจอน้อย ส่วนกลุ่มคนที่เล่นได้บ้างแต่มักขาดทุนเสียมากกว่าก็เป็นสัดส่วนที่พอตัว เชื่อว่าใครก็อยากเดินบนสายนักพนันที่คว้ากำไรออกไป แม้จะได้มากหรือน้อยเท่าไหร่ อย่างไรก็ขอให้ไม่ขาดทุน แทงบอลยูฟ่าเบท เป็นตัวเชื่อมอีกอย่างในการสร้างแรงบันดาลใจ นอกเหนือจากเชียร์สนุกเอามันลุ้นกับการแข่งขันไปเรื่อย ดีกว่าไหมหากเล่นแล้วมันสร้างกำไรผลประโยชน์ให้เรา สนุก รวย ต้องช่วยเสริมกันมันก็ต้องเล่นให้มีชั้นเชิง การลงทุนทุกอย่างที่หวังสร้างผลกำไรทุกคนต้องเตรียมใจและเตรียมพร้อมให้ดี เมื่อการเดินเกมผิดเริ่มต้นที่ความคิด ปิดเกมพลาดเป็นบ่อนทำลายคอยช่วงชิงโอกาสจากคุณไป ผลมันก็ออกมาตามที่เห็น เล่นยังไงไม่ให้โดนเล่น อยู่ให้เป็นแล้วคุณจะเห็นชัยชนะในที่สุด เปลี่ยนความคิดของการแทงบอลปกติทั่วไป ใส่รายละเอียดอีกนิด การเดิมพันบอล UFABETWIN ผลที่ออกมาไม่ได้เกิดจากโชคชะตาหรือดวงคุณไม่มี การที่จะเป็นดาวเด่น เขาต้องมีลูกเล่นเป็นตัวซับพอร์ตให้คุณรอดทุกสนาม อยากรู้ว่าทำไงก็ตามมา ตามหาข้อผิดพลาดความคิดของนักพนันรุ่นใหม่ที่บั่นทอนความสำเร็จในการแทงบอลออนไลน์ กลบฝังมันให้หาย จากผู้ซ้ำร้ายคุณจะกลายเป็นผู้รอดตายฟื้นคืนชีพ รู้แล้วรีบประยุกต์แล้วจะเห็นว่าพนันมันสุขแค่ไหน แทงบอลยูฟ่า มั่นใจกับ เว็บตรง UFABET แทงบอล ออนไลน์ ประสบการณ์​กว่า10ปี บอลสเต็ป บอลเดี่ยว 1×2 มีครบ โลกหมุนไปตามความคิดหลายคนไม่ได้พุ่งชนเป้าหมายด้วยความเชื่อมั่นในการ แทงบอลยูฟ่า จริงอยู่ที่การเดิมพันขึ้นชื่อว่าพนันมันต้องมากับดวงและโชค แต่ก็ไม่ใช่ทุกอย่างไม่งั้นจะพยายามสร้างตัวตนให้พัฒนาเพื่อก้าวหน้าบนเส้นทางสายนี้ไปทำไม ถ้าการตัดสินมันขึ้นอยู่ที่ดวงตลอดไป คนไม่มีดวงก็ไม่ประสบผลสำเร็จสิ หากเรามองให้ลึกลงไปปัจจัยอีกหลายอย่างเป็นตัวสร้างหล่อหลอมฟอร์มการเล่น ทักษะการวิเคราะห์เกมแข่งขันก่อนแทงบอลที่เว็บ ufabet เข้าสู่ระบบ เกิดจากทักษะความสามารถที่มีเฉพาะคน…\n", + "เกมยิงปลา ยูฟ่าเบท เกมตู้คาสิโน Fish hunter จาก joker recreation เกมยิงปลา ยูฟ่าเบท รู้จุดสุ่มยิงปลา กำไรวิ่งเข้าหา เงินตามมาหลายเท่าตัว ด้วยพนันมันก็มีเกมเดิมพันให้เลือกสรรสารพัดชนิด อีกยอดอันดับคนติด ฮิตลงทุนล่าเงินรางวัล ด้วยรูปแบบของเกมที่ดูง่ายไม่ต้องใช้ทักษะ ยิ่งมือใหม่แทบจะไม่ต้องทำอะไรเลยทีเดียว จุดเด่นของคนเล่นอยู่ที่ความแม่นในการยิงเข้าตัวปลาเพื่อหากำไร ดังนั้นสิ่งสำคัญที่ทำให้ได้เงินรางวัลจาก คาสิโนออนไลน์ คงไม่มีอะไรเกินกว่ารู้ว่ายิงยังไงปลาตายดี ของแบบนี้มันต้องมีชั้นเชิงกันบ้าง ตราบใดที่คุณยิงปลาตายมากเท่าไหร่กำไรคุณก็จะสะสมเพิ่มขึ้น ด้วยข้อจำกัดของเวลาและกระสุนที่คุณมีไม่ได้มากจากทุนที่ต่างกัน การยิงเพื่อให้ได้ประสิทธิภาพสูงสุดในการเดิมพันจึงจำเป็นที่ต้องนำมาใช้เพื่อกอบโกยกำไรกลับไปให้มากที่สุด บทความนี้จึงนำเสนอขั้นตอนการยิงปลาที่น่าสนใจและให้ผลลัพธ์ดีเกิดคาด เพื่อการเก็บเกี่ยวกำไรเต็มกำมือ ยิงปลาใครเล่นก็ได้ แต่กำไรที่คาดหมายอาจไม่ใช่ทุกคนที่ได้ตามหวัง ยิงมั่ว หมดตัว ไปไม่เป็น การรู้แนวทางจับจุดการเล่น นอกจากพัฒนาฝีมือคุณให้โดดเด่น กำไรที่เห็นบอกเลยว่าหลายเท่าตัว ยิงปลายังไงกำไรไหลเข้ารัว ๆ ยิงให้ชัวร์ลองตามนี้ สูตรเกมยิงปลา เล่นยังไงให้ได้เงิน แนะนำวิธีการเล่น เกมยิงปลา ปี 2022 โดย Joker game แม่น รัว ตัวต่อตัว เอาให้อยู่หมัด วิธีนี้ต้องอาศัยความแม่นยำกับความไวในการลั่นไกปืน จับจุดตั้งเป้าปลาที่เราคาดหวัง เล็งให้แม่นเน้นยิงรัวเข้าใส่ไม่ยั้ง อยากว่ามันต้องไวมาก เพราะปลาเคลื่อนไหวตลอด แต่ถ้าทำได้นอกเหนือจากประหยัดเวลา ปลายังตายง่ายในทันทีมีโอกาสในการหาตัวใหม่สร้างกำไรเพิ่มอีก ปักหมุดตัวปลาตายไว ประหยัดกระสุนได้ โอกาสทำกำไรก็เพิ่ม เริ่มสำรวจตัวเองให้ดีว่าเล่นพนันแบบนี้หรือไม่ แน่นอนว่าการยิงปลากระสุนที่มีต่างจำกัด ยิ่งใช้ไปมากเท่าไหร่ โอกาสของการทำกำไรก็ยิ่งลดน้อยลงทุกที จริงอยู่หากยิงแล้วถูกที่ แต่เท่าที่เห็นมาลั่นไกปืนรัวไม่ตายสักตัวเลยก็มี ดังนั้นการจำเพาะกลุ่มเป้าหมาย เล็งให้แม่นเฉพาะปลาที่ตายง่าย แต่นั่นก็เป็นอีกข้อเสนอหนึ่งเนื่องจากปลาที่ตายง่ายกำไรที่ได้อาจจะไม่หวือหวา ในทางกลับกันมันก็ยังดีกว่าไม่ได้อะไรกลับมาเลย เล็งแม่น มั่นใจ ไม่ต้องไว ก่อนลั่นไกต้องชัวร์ ด้วยรูปแบบกราฟิกและฟังก์ชันที่ถูกพัฒนาให้หน้าตาของเกมยิงปลามันสร้างความน่าตื่นเต้น เพราะคุณจะได้เห็นปลาสารพัดชนิดแหวกว่ายกันเล่นเต็มไปหมด… ยูฟ่าคาสิโน โดย ufabet รวมเกมคาสิโนครับครัน สล็อต บาคาร่า เกมไพ่ ไว้ที่เดียว ยูฟ่าคาสิโน ทำไมถึงตอบโจทย์เติบโตช่วงวิกฤติโควิด ทุกอย่างแทบจะขับเคลื่อนไปไม่ได้ ซึ่งก็นานพอควรที่จะเห็นความเปลี่ยนแปลงของหลายสิ่ง เริ่มจมหาย เริ่มจมดิ่ง หรือถูกทิ้งไว้กลางทาง บางอย่างแทบจะถูกปิดตัวหรือไม่มีวันหวนหลังตั้งกลับขึ้นมาใหม่ได้ เอาจริงมันก็ไม่ใช่เรื่องง่ายที่ทุกอย่างจะสามารถในสภาวะการควบคุมที่ไม่ได้ตอบโจทย์จนกลายเป็นการตอกย้ำของระบบโครงสร้างที่เป็นตัวเบิกทางความจมดิ่งลงไปทุกที แต่ยังมีธุรกิจบางจำพวกที่ยังไปได้ดี ผูกขาดอิสรเสรีเหมือนกับไม่มีผลกระทบเลยด้วยซ้ำ เอาจริงเราก็ไม่ได้อยากบอกว่าเกิดเหตุวิกฤตินี้อาจส่งผลดีด้วยซ้ำ เพราะต่างก็ไม่มีใครอยากให้มันเกิดขึ้นทั้งนั้น เนื่องด้วยสถานการณ์หากปกติก็ยังไม่ได้ดีเช่นเดียวกัน UFABET เติบโตสวนทางกับเหตุการณ์ปัจจุบันอย่างสิ้นเชิง นั่นนับว่าเป็นการชี้ให้เห็นว่าความไม่แน่นอนมันน่ากลัวแค่ไหน หลายคนจึงต้องตระหนักว่ายิ่งเตรียมพร้อมคุณภาพชีวิตตนเอวให้สามารถรองรับวิกฤติในอนาคตอีกต่อไปที่ไม่รู้ว่าจะมีอะไรเกิดขึ้นบ้างเป็นสิ่งที่ขาดไม่ได้ และปฏิเสธไม่ได้ว่าต้องทำ หลายคนคงเห็นแล้วว่าการไม่มีเงินมันน่ากลัวแค่ไหน ยิ่งวิกฤติทำพิษยิ่งไปกันใหญ่ บางคนไม่เหลืออะไรและต้องอยู่อย่างไร้ความหวังเพียงเพราะตังไม่มี คาสิโนออนไลน์ จึงเป็นอีกวิถีหนทางส่องสว่างที่ยังพอมีให้เก็บเกี่ยวสร้างรายได้ในตอนนี้ กลายเป็นแลนด์มากสุดนิยมสูงสุดที่มีผู้ใช้มหาศาล สิ่งที่ทำให้ ยูฟ่าเบท อยู่นานและผ่านทุกวิกฤติแบบชนิดลอยตัว รายได้ไม่ตายตัว บางครั้งเราจะมาหวังเงินเพียงจำนวนน้อยนิดเป็นสัปดาห์ หรือเดือน ไม่ว่าใครอยากที่ต้องการอิสระในการหาเงินได้มากเท่าไหร่ตามที่ใจต้องการ ยูฟ่าเบทคาสิโน เป็นอีกสถานคอยบริการรายได้ไม่คงที่ แน่นอนเล่นเสียก็ไม่มี แต่ถ้าเล่นดี กล้าการันตีคุณไปได้ดีอันนี้ก็มีรายได้ระยะยาวสบาย เงินจับต้องได้ หาง่าย จ่ายคล่อง ปัจจัยสำคัญที่ทำให้ทุกคนอยู่รอด ซึ่งเห็นกันได้ในยามนี้ ใครไม่มีก็ล้มหายตายจากไปให้เห็นกันอย่างง่ายได้ ดังนั้นการลงทุนหรือแสวงหารายได้จึงเป็นเป้าหมายหลัก ซึ่ง UFABETCN นามนี้เป็นที่รู้จักทุกสำนักทั่วโลก แหล่งบันเทิงให้โชคด้วยการเดิมพันเนรมิตเงินรางวัลเพียงมือสัมผัสเท่านั้น นั่นเป็นอีกแรงจูงใจด้วยการพนันมันเหมาะสำหรับคนต้องการเงินด้วยเงินไว จับต้องได้เห็นด้วยตาทันที จ่ายคล่องไม่มีบิดเบือน ไร้ขีดข้อจำกัด งดข้อผูกมัดผูกขาด เปิดโอกาสสำหรับคนท… สมัคร สล็อตxo เว็บตรง one hundred pc ค่ายใหญ่ เล่นผ่านเว็บ ระบบ Auto ไม่ต้องดาวโหลด วัดดวงโชติช่วง เดินเกมไม่ให้ร่วงง่ายนิดเดียว สล็อตxo “แจ๊กพ็อต” ความก้าวหน้าบนเส้นทางสายนักพนันที่มีเงินรางวัลเป็นตัวล่อ ไม่ว่าแพ้ล้มลุกคลุกคลานสักกี่ครั้ง ยอมรับเลยว่าหลายคนพยายามเข้ามา ต่อสานสัมพันธ์อยู่กับมันให้ได้ บางทีเราก็ไม่ได้มีทางเลือกมากมาย แล้วสิ่งที่รู้พนันออนไลน์ UFABET มันก็เป็นทางออกสุดท้ายของการสร้างรายได้ที่ให้ประโยชน์คุ้มค่ามากกว่าที่ไหน แม้จะร่วงกี่ครั้ง พังไม่เป็นท่ามากเท่าไหร่ บางคนก็ไม่เคยยอมแพ้ซึ่งมันก็ถูกต้องแล้วที่เป็นเช่นนั้น การที่จะมานั่งจมปักกับสิ่งที่ผ่านมาคงไม่สามารถทำให้อะไรดีขึ้นมาได้ นอกเหนือจากการเติมเต็มและพัฒนาตนเองให้สมบูรณ์แบบเท่าที่ทำได้ แม้ว่ามันจะไม่ง่าย อาจไม่ได้เห็นผลเลยทันที เพราะเราไม่รู้ว่าตอนไหน เวลาใด เราจะเข้าใกล้สิ่งที่คาดหวังกับ สมัครสล็อตxo แต่ก็คงทำอะไรไปมากกว่านี้ไม่ได้แล้ว การประคับประคองตนเองให้คลาดแคล้ว เล่นแล้วไม่เจ็บหนักไม่หลงทางกับดักแหล่งพนันที่มันพร้อมฉุดเราลงก็คงทำให้รอดไปได้ การก้าวข้ามขีดจำกัดความสามารถสั่งสมประสมการณ์เพื่อเพิ่มขีดความสามารถของตนเองให้เต็มที่ เชื่อเลยว่าสิ่งดี ๆ ตามมาแน่ เคล็ดลับ การทำเงินง่ายๆ สล็อตXO สม้ครรับเครดิตฟรี เว็บดัง ระบบดี ของคนไทย เล่น สล็อตxo อย่าเผลอทำ เงินที่ได้เป็นกอกเป็นกำ หายเกลี้ยง พฤติกรรมการเล่นส่งผลต่อรูปแบบการทำกำไรและผลลัพธ์สุดท้ายของเกมที่แสดงออกถึงการเดิมพันที่มันต้องวางหมากการเล่น โดยจะมีพฤติกรรมบางอย่างที่เราอาจมองข้ามเผลอทำแล้วอาจนำหายนะมาให้ สล็อต XO ฟรีเครดิต จากเงินที่งอกเงยสร้างผลประโยชน์ที่เราคาดหวังไว้ จากกำไรเป็นกอกเป็นกำอาจได้รับกรรมมาแทน ดังนั้นเราต้องวางแผนให้รัดกุม เพื่อจะได้ไม่ต้องกลุ่มคราวหลัง อยากปังได้ผลตอบรับตามสั่งอย่างพลั้งเดินเกมผิด เกมสล็อตจะเปลี่ยนชีวิตคุณได้ แค่ไม่ทำคุณสบายรายได้ไหลเข้าแน่ ไม่เชื่อลองสมัคร สติ อารมณ์จมหายเตรียมตัวตายได้เลย ด้วยรูปแบบการเล่นที่เร็วไว ด่วนเร่งกระตุ้นเร้าให้ใจมันไปแทบเตลิด การเปิดเกมหากขาดสติหรือควบคุมตนเองไปได้ ก็สามารถลบล้างประสิทธิภาพการเดิมพัน ให้ต่ำลงได้ ถึงแม้สล็อตจะเป็นเกมที่ไม่ต้องใช้ทักษะมากมาย จังหวะ เวลา เป็นส่วนหนึ่งที่คุณจำเป็นต้องเดาทางให้ได้ เดิมพันมั่ว หมดตัวไม่วางแผนการเดินเงิน การเล่นสล็อตรูปแบบของการเข้าถึงรางวัลแจ๊กพ็อต การเงินถือเป็นสิ่งนำส่งคุณ หากบริหารจัดการได้ดี การเข้าใช้งานได้… เซฟรหัสไว้ เผื่อกรณีที่ท่านลืมรหัสในการเข้าใช้งาน หากไม่ได้เซฟไว้ สามารถติดต่อแอดมินได้ตลอด 24 ชม.\n", + "UFABET เว็บบอลค่าน้ำดี แทงบอลออนไลน์ ได้เยอะที่สุด คืนยอดเสีย5%ทุกเดือน เว็บบอลค่าน้ำดี อัตราต่อรองมือใหม่ต้องใช้คำนวณ ค่าน้ำสนามประชันมันก็มีกลไกในการแปรผลที่ต่างกันไป นักพนันที่ต้องใช้จำเป็นที่ต้องติดตามอัพเดทสร้างความใจ ส่วนหนึ่งเพื่อความปลอดภัยจากการใช้งาน ด้วยเกมเดิมพัน เว็บพนันบอล ดีที่สุด มีปัจจัยหลายส่วนผันผวนต่อการสร้างมูลค่า หรือกำหนดเม็ดเงินในแต่ละครั้งที่เข้ามาร่วมสนุกไม่เหมือนกัน ทั้งราคา อัตราต่อรอง ค่าน้ำของ UFABET หลากมุมมองที่เราต้องมาเคลียใจคลายข้อสงสัย ด้วยคู่มือฉบับนักพนันหน้าใหม่พึ่งเดินลงสูสนามท้าประตูชัย ยิงเป้าประตูต้อวงรู้อะไร สร้างความมั่นใจก่อนเตะ ไม่เละกลางทาง UFABETCN เว็บบอลค่าน้ำดี ที่คุณต้องไม่พลาด อัตราต่อรองดีที่สุด ได้เยอะเสียน้อย ราคาบอล เป็นตัวกำหนดอันเกิดจากการวางหมากการเล่นที่ต่างกัน เว็บอลค่าน้ำดี ยูฟ่าเบทการเล่นพนันมีแนวทางเดิมพันหลายตัวเลือกเพื่อเข้าลุ้นรางวัล แทงบอล ขั้นต่ำ10 บาท ซึ่งมันก็แสดงถึงความเสี่ยงแต่ละระดับส่งผลต่อการกำหนดราคาที่ผันผวน โอกาสเดาทางถูกชนะเกมง่ายราคาบอลที่จ่ายก็ต่ำ โอกาสทำแต้มด้วยวีการเดาทางยากอัตราการจ่ายมันก็มากด้วย ดังนั้นการเรียนรู้ถึงกลวิธีดูราคาช่วยให้ลูกค้าวางแผนการเล่นว่าคุณจะเลือกเดินสายไหนหรือต้องการผลกำไรตามเป้าที่หวังไว้ต้องเดินเกมรุกอย่างไรถึงมีโอกาส แทงบอลได้ทุกคู่ เช่น ราคาเสมอ ผลสกอร์เมื่อออกเสมอ ไม่มีทีมได้ได้หรือเสียเปรียบกันก็ถือว่าผลสรุปเกมเจ๊ากัน ไม่ได้ไม่เสียเท่าทุน ราคาเสมอควบครึ่ง ทีมต่อต่อให้ทีมรอง zero.25 ลูกก่อน หากสกอร์เสมอ (0-0.25) ทีมต่อได้ครึ่ง ทีมรองได้ครึ่ง หากทีมต่อชนะได้เต็มจำนวนเดิมพัน ราคาครี่งลูก ทีมต่อต่อให้ทีมรอง 0.50 ลูกก่อน หากสกอร์เสมอ (0-0.50) ทีมต่อเสียเต็ม ต้องชนะอย่างเดียวถึงจะได้เงิน ราคาครึ่งควบลูก ทีมต่อต่อให้ทีมรอง zero.75 ลูกก่อน หากสกอร์ทีมต่อชนะ 1 ลูก ได้เงินครึ่งเดียว ทีมรองเสียครึ่ง แต่หากทีมต่อชนะ 2 ลูกขึ้นไป ได้เงินเต็มจำนวน ทีมรองเสียเต็มจำนวนด้วยเช่นกัน และท้ายสุด ราคา 1 ลูก ทีมต่อต่อให้ทีมรอง 1 ลูก หากสกอร์เสมอ (0-1) ทีมต่อเสียทีมรองได้ สกอร์ทีมต่อได้ 1 ลูกก็ถือว่าเสมอกัน แม้ทีมรองจะเตะไม่เข้าสักลูกก็ตาม ดังนั้นทีมต่อต้องชนะ 2 ลูกเท่านั้นถึงจะได้เงินเดิมพัน เว็บบอลยูฟ่า ขึ้นแท่นอันดับ 1 ของเอเชีย เว็บที่มียอดผู้เล่นสูงที่สุด ราคาบอล4ตังค์ คืนยอดเสีย5%ทุกเดือน หลายคำถามของคอบอลที่ถูกเฉลยผ่าน UFABETC… เซ็กซี่บาคาร่า อันดับ 1 สมัคร horny gaming ง่ายๆเล่นได้ทุกค่ายที่ UFABET เซ็กซี่บาคาร่า อันดับ 1 บันไดสู่ความสำเร็จ เล่นเสร็จรวยทุกคน การคาดหวังผลกำไร ถือเป็นสิ่งที่ไม่น่าแปลกใจ เพราะใครก็อยากรวยถึงเข้ามาร่วมสนุกหาเครื่องมือช่วยทำเงิน Sexy Gaming อันดับ 1 ถือเป็นช่องทางในการวางรากฐานชีวิตที่หลายคนผูกติดพัวพัน มันถือเป็นอีกแหล่งบันเทิงสร้างสรรค์ นอกเหนือจากความสนุกที่สร้างแรงจูงใจให้เรามีไฟ ผลตอบแทนที่คาดหวังไว้ถือเป็นส่วนสำคัญให้เรามีกำลังใจจะสู้ต่อ คงไม่มีใครกล้าปฏิเสธเลยว่าแหล่งเดิมพันเป็นจุดเริ่มต้นของนักล่ารางวัล บาคาร่าออนไลน์ ทั้งนี้การประสบความสำเร็จบนเส้นทางสายนี้ต้องมีลำดับขั้น การแบ่งระดับการเล่นตามฝีมือมันมีการแบ่งชนชั้น เล่นดี เล่นได้ เล่นเก่งไม่เท่ากัน ส่งผลต่อเงินรางวัลที่ได้ด้วย ถึงแม้จะมีช่องทางสร้างเงินที่เข้ามาช่วยให้คุณเข้าถึงความรวยได้ไวขึ้น อย่างบาคาร่าที่มีลีลาน่าสนใจ รูปแบบเกมการเล่นที่ง่ายแต่ทำเงินได้มากล้น แต่ก็ต้องข้ามพ้นอุปสรรคซึ่งมาในรูปแบบเกมแต่ละด่านที่เราต้องผ่านไปให้ได้ ไม่ว่าเกมรุกจะมาไม้ไหน ตราบใดที่คุณไม่ตาย หงายไพ่เหนือมันเงินรางวัลก็ตกเป็นของคุณ ทดลองเล่น บาคาร่า เซ็กซี่บาคาร่า อันดับ 1 กับ เว็บพนันออนไลน์ ที่มั่นคง เพื่อผลกำไร ที่แน่นอน UFABET CN ฝึกเล่นทดลอง เซ็กซี่บาคาร่า อันดับ 1 ค่อยมาปล่อยของโต๊ะจริง ถือเป็นโอกาสที่วัดความสามารถตนเองได้ ด้วยระบบออนไลน์ บาคาร่าเซ็กซี่ เปิดบริการทดลองเล่นฟรีมากมาย บางเว็บติดตั้งโปรแกรมจำลองการเล่นบาคาร่าจริงเต็มรูปแบบแทบแยกไม่ออก จึงเป็นผลพลอยได้นอกจากจะได้ใช้ความสามารถว่ามีพร้อมและเอาชนะมันได้มากน้อยแค่ไหน เพื่อปรับปรุงพัฒนาตนเองให้อยู่ในสนามประชันเพิ่มประสิทธิภาพการเดิมพันที่เป็นไปสมบูรณ์แบบ เพราะการจะเล่นพนันบาคาร่าได้ดีต้องมีความเข้าใจถ่องแท้ไม่ใช่แค่ลองเล่น บาคาร่าออนไลน์ วงเงินมีเท่าไหร่ กำหนดไว้ก่อนเข้าใช้คาสิโน ถือเป็นการควบคุมความประพฤติที่เลยเถิด ลงสนามแล้วความโลภมักมากมันเกิดขึ้นเสมอ การวางเดิมพันต้องรู้เท่าทันแบ่งมันเป็นส่วน ควรเล่นในจำนวนเม็ดเงินมากน้อยแค่ไหน แล้วหากไม่ชนะเลยยอมรับการสูญเสียไปได้ไหม วิธีนี้จะช่วยลดโอกาสการเสียเงินเกินความจำเป็น เล่นแบบพอตัว ได้ก็ไม่กลัว เสียก็ตั้งรับไหว กำไรตามเป้า อย่าเอาต่อ เลิกเล่นทันที อาจจะมองว่ามันเป็นการตัดโอกาสของการแสวงหากำไรที่มันกำลังไปได้ดี แต่ด้วยการแข่งขันมันต้องมีจุดพลาดท่าเราต้องมานั่งเสียเวลาตามเก็บ… เซ็กซี่บาคาร่า อันดับ 1 สมัคร attractive gaming ง่ายๆเล่นได้ทุกค่ายที่ UFABET เซ็กซี่บาคาร่า อันดับ 1 บันไดสู่ความสำเร็จ เล่นเสร็จรวยทุกคน การคาดหวังผลกำไร ถือเป็นสิ่งที่ไม่น่าแปลกใจ เพราะใครก็อยากรวยถึงเข้ามาร่วมสนุกหาเครื่องมือช่วยทำเงิน Sexy Gaming อันดับ 1 ถือเป็นช่องทางในการวางรากฐานชีวิตที่หลายคนผูกติดพัวพัน มันถือเป็นอีกแหล่งบันเทิงสร้างสรรค์ นอกเหนือจากความสนุกที่สร้างแรงจูงใจให้เรามีไฟ ผลตอบแทนที่คาดหวังไว้ถือเป็นส่วนสำคัญให้เรามีกำลังใจจะสู้ต่อ คงไม่มีใครกล้าปฏิเสธเลยว่าแหล่งเดิมพันเป็นจุดเริ่มต้นของนักล่ารางวัล ทั้งนี้การประสบความสำเร็จบนเส้นทางสายนี้ต้องมีลำดับขั้น การแบ่งระดับการเล่นตามฝีมือมันมีการแบ่งชนชั้น เล่นดี เล่นได้ เล่นเก่งไม่เท่ากัน ส่งผลต่อเงินรางวัลที่ได้ด้วย ถึงแม้จะมีช่องทางสร้างเงินที่เข้ามาช่วยให้คุณเข้าถึงความรวยได้ไวขึ้น อย่างเว็บ UFABET ที่มีลีลาน่าสนใจ รูปแบบเกมการเล่นที่ง่ายแต่ทำเงินได้มากล้น แต่ก็ต้องข้ามพ้นอุปสรรคซึ่งมาในรูปแบบเกมแต่ละด่านที่เราต้องผ่านไปให้ได้ ไม่ว่าเกมรุกจะมาไม้ไหน ตราบใดที่คุณไม่ตาย หงายไพ่เหนือมันเงินรางวัลก็ตกเป็นของคุณ ทดลองเล่น บาคาร่า เซ็กซี่บาคาร่า อันดับ 1 กับ เว็บพนันออนไลน์ ที่มั่นคง เพื่อผลกำไร ที่แน่นอน UFABETCN ฝึกเล่นทดลอง ค่อยมาปล่อยของโต๊ะจริงถือเป็นโอกาสที่วัดความสามารถตนเองได้ด้วยระบบออนไลน์ เซ็กซี่บาคาร่า อันดับ 1 เปิดบริการทดลองเล่นฟรีมากมาย บางเว็บติดตั้งโปรแกรมจำลองการเล่นบาคาร่าจริงเต็มรูปแบบแทบแยกไม่ออก จึงเป็นผลพลอยได้นอกจากจะได้ใช้ความสามารถว่ามีพร้อมและเอาชนะมันได้มากน้อยแค่ไหน เพื่อปรับปรุงพัฒนาตนเองให้อยู่ในสนามประชันเพิ่มประสิทธิภาพการเดิมพันที่เป็นไปสมบูรณ์แบบ เพราะการจะเล่นพนันบาคาร่าได้ดีต้องมีความเข้าใจถ่องแท้ไม่ใช่แค่ลองเล่น วงเงินมีเท่าไหร่ กำหนดไว้ก่อนเข้าใช้คาสิโน บาคาร่าเซ็กซี่ ถือเป็นการควบคุมความประพฤติที่เลยเถิด ลงสนามแล้วความโลภมักมากมันเกิดขึ้นเสมอ การวางเดิมพันต้องรู้เท่าทันแบ่งมันเป็นส่วน ควรเล่นในจำนวนเม็ดเงินมากน้อยแค่ไหน แล้วหากไม่ชนะเลยยอมรับการสูญเสียไปได้ไหม วิธีนี้จะช่วยลดโอกาสการเสียเงินเกินความจำเป็น เล่นแบบพอตัว ได้ก็ไม่กลัว เสียก็ตั้งรับไหว กำไรตามเป้า อย่าเอาต่อ เลิกเล่นทันที อาจจะมองว่ามันเป็นการตัดโอกาสของการแสวงหากำไรที่มันกำลังไปได้ดี แต่ด้วยการแข่งขันมันต้องมีจุดพลาดท่าเราต้องมานั่งเสียเวลาตามเก็บในทุกครั้งที่แพ้ การเดิมพันแล้… เว็บแทงบอลดีที่สุด ufabet pr ทางเข้า เว็บแม่ ยูฟ่าเบท แทงบอลออนไลน์ 10 บาท ufabet pr คาสิโนถูกกฎหมาย นอกเหนือจากผลกำไร ยังให้ประโยชน์เหลือล้น นักเล่นก็คงทนไม่ไหว และไม่เข้าใจว่าการพนันทำไมยังกลายเป็นสิ่งที่ถูกยับยั้งและปิดกั้น เพราะส่งผลต่อการเล่นที่อาจจะเกิดปัญหาติดตามมาตลอด เว็บเด้ง เว็บหาย เว็บพนันทั้งหลายถูกลบเกลื่อนเลื่อนไปก็ไม่เจอเผลอ ๆ หายปิดตายไปซะงั้น ด้วยรูปแบบของการแข่งขันที่มีเงินรางวัลเป็นตัวล่อ ฐานลูกค้าก็ต่อแถวกันเข้าร่วมไม่เคยเว้นว่าง แต่หลายหน่วยงานก็ยังพยายามปลูกฝังด้วยมโนภาพที่ไม่รู้ใครสร้างขึ้นมา แต่เราก็ต้องยอมรับว่าทุกสิ่งมันมีทั้งข้อดีและข้อขัดแย้งกันเสมอ แต่หากมองเข้าไปแล้วทำความเข้าใจใหม่ การเดิมพันธุรกิจพนันก็เป็นสิ่งที่น่าสนใจ ufabet สร้างประโยชน์ให้กับคนใช้ นอกจากคุณไม่มีความสามารถพอ วิธีเล่น ufabet pr ให้ได้เงินไวที่สุด ทดลองเล่นฟรี สมัครยูฟ่าเบท ได้ตลอด24ชั่วโมง รายได้ไหลเวียนลูกค้าผลัดเปลี่ยนทั่วทุกมุมโลก แน่นอนว่าธุรกิจการพนันอย่าง ufabet pr ยิ่งปรับเปลี่ยนเข้าสู่ระบบออนไลน์ การขยายพื้นที่เข้าถึงทุกคนยิ่งมีมากขึ้น ด้วยเขตที่ไร้พรมแดน อิสระทางการขยายกลุ่มลูกค้าที่เข้ามาได้ทั่วโลก ถ้าประเทศที่เปิดแหล่งพนันถูกกฎหมาย ส่วนหนึ่งกลายเป็นธุรกิจที่สร้างรายได้ให้ประเทศล้นหลาม หรือคาสิโนสถานที่จริงก็จะกลายเป็นแหล่งดินแดนสวรรค์เรียกลูกค้าเข้ามาท่องเที่ยวส่งผลต่อเศรษฐกิจได้ด้วย ความสุขแตกต่าง แต่สร้างเงิน กลายเป็นแหล่งบันเทิงเริงใจ สร้างสีสันความสนุกสนานผ่านประสบการณ์รูปแบบสไตล์เกมพนันสารพัดชนิด แทงบอลออนไลน์ ความสุขที่เกิดขึ้นได้ทุกเวลาตราบใดที่ต้องการ เข้าถึงง่าย สะดวก แถมยังสร้างเงินบวกได้ด้วย เฮฮากับเกมที่พัฒนาเต็มสตรีมสุดทันสมัย ยังเต็มอิ่มพอใจกับรายได้ที่ให้ถือเป็นโชคซ้ำซ้อน อิสรภาพการเดิมพันไร้ข้อจำกัดเงื่อนไข ถูกกฎหมายเป็นความหวังที่นักล่ารางวัลหลายคนหวังจะให้มี เพื่อประสิทธิภาพในการเดิมพันที่ดียิ่งขึ้น ไม่ต้องคอยกังวล เล่นหลบ ๆ ซ่อน ๆ อรรถรสในการเล่นก็ยิ่งมีความสุขแบบเปิดเผย โทษหนักที่ถูกท้วงติง ufabet888 คาสิโนทำให้หายนะจริงหรือ กล่าวอ้างถึงประโยชน์ที่เหลือล้นทุกคนยอมรับและเข้าใจ แต่ต่างความคิด หลายมุมมองก็ยังไม่เปิดรับสักเท่าไหร่ ทุกอย่างมันอาจไม่ได้ดีเสมอไป เว็บพนันออนไลน์ จึง ถูกวิพากษ์วิจารณ์กันไปต่าง ๆ นา ๆ ซึ่งเราจะนำเสนอจุดบอดหรือข้อเสียของการเดิมพันว่ามันมีไหม ที่หลายคนบอกว่าคาสิโนไม่เคยมีใครประสบผลสำเร… ยูฟ่าสล็อต88 พร้อมให้บริการแล้วในไทย UFASLOT ส่งตรงจากเว็บแม่ UFABET ยูฟ่าสล็อต88 สอนจัดงบ แนวทางประสบความสำเร็จ ทุนตั้งต้นเป็นสิ่งที่นักพนันทุกคนต้องเตรียมตัววางแผนมาล่วงหน้าก่อนจะเข้ามาสมัครเฉิดฉาย เปิดสกิลสร้างรายได้ ซึ่งจุดตั้งต้นของทุกคนที่มีมาไม่เหมือนกัน เป็นสิ่งที่ทำให้เกิดภวงค์พอสมควร ด่วนสรุปเหลือเกินว่าการที่มีต้นทุนที่น้อยกว่าแสดงให้เห็นแล้วว่าประสบความสำเร็จได้น้อยกว่าคนที่ต้นทุนสูง สำหรับนักล่ารางวัลเล่นพนันที่มีผลการแข่งขันเป็นตัวชีวิตสร้างมูลค่าชี้ชะตาว่าคุณจะจบหรือพบเงินรางวัลเป้าหมาย ทั้งหลายเกินจากความสามารถ จริงอยู่ คุณมีมากก็อาจจะทำให้เข้าถึงโอกาสทำกำไรได้ไวกว่าใครเขา แต่ถ้าเอามาบ่งบอกถึงเส้นชัยที่มาหาเราว่าไม่เกี่ยว การที่จะไปยืนในจุดหมายปลายทางที่วางไว้ ฝีมือถือเป็นสิ่งสำคัญ การจัดสรรงบ สล็ดต88 ต้องรู้วิธีเดินหมากเท่าทันเพื่อผลการเล่นพนัน UFABET ที่มีประสิทธิผลสูง แม้ว่าคุณจะเข้ามาด้วยเงินตราที่น้อยขนาดไหนก็ตาม ค้นหานักล่ารางวัล ยูฟ่าสล็อต88 เว็บเกมออนไลน์ UFA ทางเข้าหลัก เล่นตรงกับบริษัทแม่ ตั้งเป้ากำไรทุนที่มีต้องไม่สวนกัน รางวัลที่ทุกคนต่างตั้งหน้าตั้งตาคอยด้วยความหวังมันมีมากใช่ย่อย ยูฟ่าสล็อต88 คือลาภลอยที่ใครก็ต่างรอคอยจะได้มันมา ก้าวขาลงบนสนามประลองต่างพยายามที่จะไขว่คว้ายิ่งมากเท่าไหร่ก็แสดงให้เห็นว่าผลกำไรมันมหาศาล แต่นั่นก็เป็นส่วนหนึ่งของปลายทางเป็นผลมาจากการวางแผนการใช้เงินซึ่งเป็นสื่อกลางในการต่อทุน การตั้งเป้าผลตอบแทนที่คาดไวทำให้เรามีแรงกำลังใจให้เดินไปถึงมัน แต่นั่นก็ส่งผลต่อมาเห็นว่าได้ก็ยิ่งคาดหวังสูงไปหน้า แต่หันมาดูเงินในกระเป๋ายังเท่าเดิม ความน่าจะเป็นก็ยิ่งลดลง สวนทางกับความกดดันว่ามันจะเป็นไปได้ไหมเพิ่มขึ้นทุกที การเล่นพนันให้ผลลัพธ์อยู่ในระดับพอดี เงินทุนที่มีต้องสอดคล้องกับผลกำไรที่ต้องการด้วยจะช่วยให้พอมีแรงฮึดสู้ ไปใช้เงินมีอยู่เท่ามด แต่ความคาดหวังไม่ลดลงเลย อันนี้มันก็อาจเกินกำลัง สิ่งที่ได้กลับมาคือพังพินาศ แบ่งสัดส่วนต้นทุน กำไร ไม่ปนกัน ความชัดเจนจะทำให้ สล็อตเว็บตรง ไม่สับสนมมึนงง ผู้เล่นบางคนเล่นทีสักแต่ว่าได้กำไรจนบางทีบวกลบคูณหารดูแล้วไม่ได้อะไรเท่าทุน การเดิมพันต้องจัดสรรแบ่งแยกผลตอบแทนที่ได้กับเงินทุนที่เหลือเพื่อให้เห็นพัฒนาการความก้าวหน้าของตนเองว่าต้องหาเพิ่มมากเท่าไหร่ ถ้าเอาปนกันเม็ดเงินก้อนนั้นจะดูใหญ่ บางทีเผลอใจมีกำลังเพิ่มใจมันยิ่งพองโตอยากโชว์สกิลเพื่อสร้างผลประโย…\n", + "3เหตุผลที่ควรเล่น บาคาร่าsaclub7 ทำเงินง่าย คาสิโนออนไลน์ อันดับ1 บาคาร่าsaclub7 ฉบับเคล็ดวิชาที่หาได้เอง ทุกวันนี้คนจะเก่งได้เกิดจากหลายสิ่งประกอบสร้าง การพัฒนาตนเองให้ก้าวหน้า แน่นอนไม่ว่าอะไรคุณก็จะผ่านไปได้เสมอ การเห็นถึงจุดเด่นจุดด้อยเพื่อนำมาประยุกต์ใช้หรือแก้ไขให้ทันท่วงที ส่งผลดีต่อประสิทธิภาพการเดิมพันซึ่งนั่นแสดงถึงผลกำไรเงินรางวัลที่คุณจะได้ด้วย เพราะลงสนามประลองมาแล้วใครก็อยากรวยทั้งนั้น มันก็ต้องแลกมาพร้อมกับความสามารถที่ต้องให้เท่าทัน เราก็รู้ดีว่า เว็บเกมบาคาร่า แต่ละเกมที่เราประชันมันพร้อมฟาดฟันเราลงได้ทุกเมื่อ แต่นั่นก็คงไม่ใช่สิ่งที่เราต้องมานั่งจมทุกข์ สัญชาตญาณต้องมีการปรับตัวทำยังไงก็ได้ให้เราเป็นฝ่ายได้เปรียบเพื่อช่วงชิงความสุขจากการทำกำไร ถ้างั้นคงไม่เกิดเซียนพนันที่ไม่ว่ารูปแบบพนันจะมาไม้ไหน UFABET มีหน้าที่ตั้งรับปรับจุดให้เหมาะสมเพื่อเหยียบมันให้จมลงไป เพราะหากเราพ่ายมันก็พร้อมเหยียบเราจมหายไปเช่นเดียวกัน 3เหตุผลที่ควรเล่น และเทคนิคเล่น บาคาร่าsaclub7 ทำเงินได้จริง เข้ามาเล่นเดิมพันมีทางเดียวเท่านั้นต้องชนะมันให้ได้ ซึ่งถือเป็นความโชคดีของระบบออนไลน์ บาคาร่าsaclub7 อย่างง่าย กระทั่งการเข้าถึงหาความรู้ ข้อมูล องค์ประกอบหลักที่ทำให้การเดิมพันของเราสมบูรณ์ได้ แต่ก่อนก็อาจจะน้อยคนที่มีโอกาสได้เล่นจนเป็นเซียนพนันซึ่งต้องใช้เวลา ประสบการณ์ในการลองผิดลองถูก คิดค้นแนวทาง วางรากฐานเคล็ดวิชา คาสิโนไลฟ์สด ทุกอย่างเกิดขึ้นเพื่อสนองความต้องการและตอบโจทย์ผู้เล่นที่ต้องการพัฒนาตนเอง ซึ่งส่วนนี้เราได้ผลแปประโยชน์เพราะไม่จำเป็นต้องลองผิดลองถูกเอง เอาประสบการณ์จากคนอื่นมาเป็นแรงคุ้มกันอะไรมันดีก็จำไปทำ อะไรเสี่ยงมากก็อย่าก้าวล้ำทำตาม ส่งผลให้นักพนันหน้าใหม่เติบโตได้รวดเร็ว ไม่ว่าจะฐานะ เสถียรภาพทางการเงิน ที่สำคัญฝีมือพนันเก่งกาจมีความสามารถเพิ่มต้องเริ่มต้นที่ความเข้าใจ ความรู้ทั่วหลักพนันบาคาร่า เข้าใจตัวเลขบนหน้าไพ่ แต้มต่ำสูงระดับความเสี่ยงไหนรอดหรือร่วง ขั้นพื้นฐานแม้ว่า เว็บบาคาร่า อันดับ1 จะเป็นกฎกติกาทั่วไป ไม่แตกต่างอะไรจากการเล่นไพ่ใครแต้มใหญ่แต้มน้อย สำหรับนักพนันมือใหม่ก็คงต้องอ่านไพ่ดูแต้มกันก่อน โดยค่ากำหนดเลขหน้าไพ่เราตัดสินผลด้วยการรวมเลขระหว่างไพ่ 2 ใบอยู่ในมือ บาคาร่าเอาจริงเป็นเกมที่ไม่ได้ใช้ทักษะฝีมือ แต่ดวงคือสิ่งที่มาอันดับต้น ด้วยความที่เราไม่สามารถกำหนดได้ว่าเลขแต้มไหนจะเข้ามาถึงเรา หวังอย่างเดียวแต… WM 88 Ufabet win เว็บแทงบอลออนไลน์ ส่งตรงจาก ยูฟ่าเบท บนมือถือ ดีที่สุด ufabet win แค่ยอมรับ เงินก็ไหลย้อนกลับมาหาคุณได้ มันเป็นสิ่งที่เราทุกคนทำได้ แต่ก็ไม่ง่ายที่หลายคนจะทำ นักพนันที่มีแรงจูงใจและเป้าประสงค์แรงกล้า การที่ก้าวขาเข้ามาสนามเดิมพันเพื่อประชันคว้าเงินรางวัลที่เป็นปลายทางสุดท้ายที่วางไว้ อย่างที่บอกมันก็คงไม่มีอะไรที่มาง่าย แม้แต่พนันที่เข้ามามีบทบาทและช่วยเสริมสร้างรายได้จะตอบโจทย์การใช้งานและเป็นแหล่งลงทุนเดียวที่กล้าพูดเลยว่าง่ายมากที่สุด หลายคนก็ยังต้องหยุดและหลุดออกจากระบบ ด้วยระหว่างทางการเดิมพัน ufabet เราต่างต้องพบหรือเผชิญหน้ากับรูปแบบกลไกของเกมที่พร้อมเข้าฟันฝ่าและฆ่าคุณลงได้เสมอ นักพนันจึงได้เจอประสบการณ์เดิมพันที่ไม่เหมือนกัน บางคนอาจมองว่ามันเป็นของขวัญเนื่องจากได้เงินรางวัลติดไม้ติดมือกลับไป ในทางตรงกันข้ามก็ยังมีอีกหลายชีวิตที่พยายามปีนไต่เพื่อไปคว้าผลตอบแทนที่คาหวังไว้ แต่ต้องหยุดเพราะอุปสรรคที่ก้ามข้ามมันไปไม่ได้สักที การปรับเปลี่ยนเพื่อให้มันเข้าที่ “การยอมรับกับกลไกการเดิมพัน” นับเป็นสิ่งที่เหล่านักพนันต่างต้องใช้ทักษะในการเรียนรู้เพื่อ ประคับประครองตนเองให้อยู่ในเกมมากเท่าที่ทำได้ ด้วยหลักการง่าย ๆ แล้วมาดูกันว่าประสิทธิภาพการเล่นคุณ จะง่ายขึ้นจริงไม่ แทงบอลออนไลน์ เว็บเดียวจบ ufabet win ครบทุกการเดิมพัน ยอมรับความเสี่ยงเลี่ยงไม่ได้ ใช้หลักการกระจายรายได้ของเว็บ ufabet win ความเสี่ยงที่เกิดจากการแข่งขัน ผลของมันก็คงออกมาเพียงแค่สองฝ่าย ท้ายที่สุดทุกคนต่างต้องหยุดจอดไม่รอดไปได้ ต้องมีพลาดพลั้งเล่นแล้วไม่ได้สมหวังทุกรอบหรอก แต่นั่นก็เป็นตัวการณ์สำคัญที่มันจะลดทอนกำลังใจคุณลงเลยทีเดียว การยอมรับความพ่ายแพ้ว่ามันเป็นเรื่องธรรมดา ยูฟ่าเบท จะเป็นสิ่งที่นำพาทุกท่านข้ามผ่านมันไปแบบไม่ต้องกังวลใจสักนิด ตราบใดที่การเล่นของเรายังมั่นใจยังไงไฟที่มีก็ไม่มอดรับพร้อมรับมือแก้เกม ยอมรับว่าตัวเองเสียเปรียบ ดีกว่าโดนเหยียบเพราะทะเยอทะยาน หวังเล่นพนันแบบเซียนให้ผ่านฉลุย เตรียมพร้อมลุยทุกสถานการณ์ อย่าลืมว่ากว่าจะข้ามผ่านก็ใช่ว่าจะไม่เจออุปสรรคอะไร ยาขมหม้อใหญ่ที่อาจเปลี่ยนเป็นฆ่าคุณตายด้วยคิดว่าคุณรับมือไหว ด้วยกลไกยังไงคุณก็ไม่มีวันได้เปรียบ โดยเฉพาะต้นทุนที่คุณไม่มีวันชนะ เพียงแต่การเล่นพนัน ufabet เว็บตรง มันลัดเลาะเอาแต่พอเหมาะจะอยู่ได้ มั่นหน้าเกินไปก็ไม่ดี ความทะเยอทะยานว่าคุณต้องผ่านมันไปได้ทุกที อันนี้น่ากลัว ยอมรั… บอลสเต็ปคืนคอม แทงบอลออนไลน์ เว็บตรง UFABET คืนค่าคอมสูงสุด 5% ทุกเดือน บอลสเต็ปคืนคอม ข้อสำคัญที่นักพนันจำเป็นต้องทราบ หลายคำถามต้องติดตามเก็บให้พร้อมรับมือ ค่าคอมเป็นส่วนหนึ่งข้อเสนอในแต่ละเว็บยื่นมาให้แก่สมาชิก เป็นระบบหนึ่งใน การแบ่งสันปันส่วนกำไร เว็บพนันบอล คืนค่าคอม แต่ผลลัพธ์มากน้อยแค่ไหนอยู่ที่ผู้ใช้เป็นตัวบ่งชี้ ค่าคอมสำหรับการแทงบอลกีฬาเกิดจากการนำผลวางเดิมพันยอดได้หรือเสียมารวมกันของนักพนันแต่ละคน แล้วนำมาคำนวณให้เปอร์เซ็นวิเคราะห์ในการคืนส่วนต่างให้ลูกค้า ซึ่งส่วนใหญ่นักล่ารางวัลก็จะหาเว็บพนันซึ่งเราแนะนำ UFABET เพราะให้อัตรา เว็บบอลค่าคอมสูง เพราะมันเป็นส่วนกำไรที่นอกเหนือจากผลประโยชน์ที่เราได้รับในการเดิมพันนอกสนาม โดยอัตราการจ่ายก็จะแตกต่างแต่สร้างความพึงพอใจให้ลูกค้า ถึงแม้อาจจะไม่ได้มากมายอะไรแต่เราสามารถนำเงินส่วนนี้ไปต่อยอดให้เกิดเป็นผลกำไรเพิ่มเติมได้มากขึ้น บอลสเต็ปคืนคอม UFABET เว็บแทงบอล คุณภาพดี แทงบอลสเต็ป2คู่ แทงบอลออนไลน์มือถือ ถือเป็นรูปแบบการเล่นแทงบอลที่นักพนันใช้ได้ผลจริง ซึ่งมีความโดดเด่นและเอกลักษณ์ของการเดิมพัน บอลสเต็ปคืนคอม เฉพาะตัวที่น่าสนใจ โดยเฉพาะการทำกำไรให้เพิ่มขึ้นได้อย่างง่ายเพียงแค่ใช้กลวิธีมีชั้นเชิงเพียงเล็กน้อย จากเงินน้อยอาจเปลี่ยนเป็นลาภลอยชุดใหญ่เขาถึงขุมทรัพย์ได้เหนือกว่ากัน เนื่องจากเป็นการเดิมพันที่มีอัตราการได้เปรียบในการเอาชนะสูงมากเพียงแต่ต้องใช้ทักษะในการวิเคราะห์เจาะลึกแต่ละคู่ให้ขาด แล้วโอกาสในการทำกำไรที่ติดตามมาสูงกว่าเดิมมาก โดยปกติบอลสเต็ปเป็นการวางพนันแทงบอลตั้งแต่ 2 คู่ขึ้นไปหรือที่เรียกว่า แทงบอลสเต็ป2คู่ แต่ไม่เกิน 15 คู่ ซึ่งดำเนินการเสร็จสิ้นภายในบิลเดียวได้ถือว่าเป็นสิ่งที่ง่ายและตอบโจทย์สำหรับคอกีฬาที่มีความชอบหลากหลาย แต่มันก็ติดตามมาด้วยเงื่อนไขเพียงอย่างเดียว ต้องชนะเดิมพันเท่านั้นถึงจะได้เงินรางวัลกลับไป วางพนันแทงบอลหลายคู่ตามใจ แต่ต้องทุกคู่ที่เชียร์ต้องชนะร้อยเปอร์เซ็น แสดงถึงการทำกำไรที่ทวีคูณทบขึ้นแปด้วยเช่นกัน ถือเป็นแนวทางการวางเดิมพันที่อาศัยทุนน้อยนิด แต่ผูกติดผลกำไรที่ให้มหาศาลทีเดียว อย่างที่รู้ เทคนิคแทงบอล ที่อาศัยผลลัพธ์คะแนนแต่ละคู่เป็นตัวกำหนดทิศทางในการวางกำไร แต่มันก็มีความเสี่ยงเพิ่มขึ้นตามระดับการเลือกคู่เดิมพันมากน้อยแค่ไหนมาด้วย การที่จะช่วยให้การวางหมากไม่ยากเกินจนเกินไปหรือความคาดหวังใหญ่จนเกินตัว ถ้ามัน ไม่พอดีไปเสียหมด โอกาสการเข้าถึงเ…\n", + "โปรเด็ด UFABET SLOT three,000 บาท แจกทุนฟรี สำหรับสมาชิกใหม่ โปรเด็ด 12.12 ufabet slot ฮิตติเทรนนำลิ่ว รีวิวแจ๊กพ็อตโตแตกไว ขึ้นชื่อรางวัลใหญ่ พนันสล็อต ufabet เป็นสิ่งที่หลายคนนึกถึงลำดับแรกก็คงไม่แปลกอะไร ด้วยรูปแบบปรับเปลี่ยนพัฒนาแตกต่างจากเดิมมากกว่า อีกทั้งรายได้มากหลายเท่าเกินกว่าที่เราคาดคิด มันก็เพียงพอที่จะเป็นเหตุผลว่าคนทำไมถึงติด และหลายเว็บเชิดชูเกมนี้ถูกจัดอันดับยอดฮิตคนติดเล่นกันงอมแงม การขับเคลื่อนด้วยการพัฒนาฟังก์ชันให้อรรถรสเดิมพันสล็อตสุขสันต์เหนือขั้นยิ่งขึ้น ประกอบกับเว็บที่ได้คุณภาพโดยตรงนำส่งพนันดีคอยบริการทุกพื้นที่อย่าง slot ufabet การเติบโตแห่งการสร้างกำไรยิ่งง่ายกว่าที่ไหนเคยมี เพราะสล็อตของเราไม่เหมือนทุกที่ ข้อได้เปรียบตรงนี้จะทำให้คุณไปเหยียบเส้นชัยคว้ารางวัลแจ๊กพ็อตก่อนใคร เพราะอะไรไปดู เสี่ยงดวงต้อนรับปีเสือ สมัครสมาชิก UFABET SLOT เล่นครบทุกเกม สล็อตทดลองฟรี ufabet slot พัฒนาฝีมือให้ชำนาญ ถือเป็นตัวช่วยให้เราไม่ตื่นสนาม การคลุกคลีอยู่กับสล็อตหลายแบบทำให้เราเรียนรู้ความแตกต่าง จุดเด่น จุดด้อย เพื่อปรับใช้ในการลงเดิมพันจริงได้ เพราะสล็อตแต่ละแบบต่างมีเอกลักษณ์เฉพาะ ทั้งโอกาสเข้าทำแต้ม ตัวคูณ สัญลักษณ์ที่ต้องอาศัยความเข้าใจ ไม่ใช่เล่นแล้วปล่อยไปโดยที่ไม่รู้อะไรเลย หลากสล็อตหลายสไตล์ เลือกได้ตามความถนัด บีบอัดรวมแน่นให้คุณโลดแล่นด้วยความสามารถที่ตรงจุดถูกที่ สล็อตมีตัวเลือกที่หลากหลายยิ่งเพิ่มโอกาสให้ผู้เล่นเข้าถึงแหล่งรายได้ที่เหมาะสม สิ่งเหล่านี้จะทำให้การเล่นมีประสิทธิภาพ ส่งผลต่อประสิทธิผลในการสร้างผลกำไรเพิ่มขึ้นด้วย ถือเป็นตัวช่วยเพิ่มอัตราการชนะได้ ด้วยเพลย์ไลน์ที่สร้างมาไม่ซ้ำจำเจ ทำให้สามารถวางรูปแบบการเล่นที่กำหนดได้เอง ไหลลื่น ไม่สะดุด ไม่หยุดชะงัก ระบบถือเป็นตัวกลางในการสร้างอรรถรสที่ส่งผลต่อกำไร เล่นไปหยุดชะงักติดขัดก็คงไม่เข้าท่าเท่าไหร่ เดิมพันเกมที่ต้องอาศัยความไหลลื่นในการหมุนและออกรางวัล การวางระบบจึงต้องครบครันและพัฒนามาอย่างดี แม้ว่าฐานลูกค้าเข้ามาจากมากขึ้นแต่ต้องรองรับให้ได้ สมัคร ufabet slot อยากเติบโตต้องรับผิดชอบ คำตอบของผู้เล่นที่ประสบผล การรับผิดชอบเป็นหัวใจสำคัญของนักพนันที่ต้องการแชวนชีวิตไว้กับความเสี่ยง โดยทั่วไปเราก็คงได้ยินกันหนาหูว่าพนันมันมีผลลบและจุดจบแต่ละคนก็ไม่ได้สวยเหมือนเริ่มแรกที่ตั้งเป้า แต่สังเกตไหมว่าพนันก็ยังยืนหยัดมีผู้ใช้ไม่เคยเว้นว่างด้วยเหตุเป็นใบเบิกทางให้ใครอีก… Ufabet thai vip ตอบโจทย์ นักแทงบอลมืออายชีพ UFABET ได้รับความนิยมสูงสุด ufabet thai vip เก่าสู่ใหม่ คาสิโนแหล่งเดิมพันอะไรเปลี่ยนไปบ้าง ค่านิยมชมชอบต้องยอมรับเลยว่า คนมีความหวังกับการลุ้นรางวัลรับโชคผ่านการเสี่ยงทายก็กลายเป็นชีวิตประจำวัน เข้ามาพัวพันในแวดวงของ การเดิมพันที่กลายเป็นไอเท็มลับฉบับคนเร่งรัดหาเงินไว ด้วยเหตุของสถานบันเทิงเดิมพันมันง่ายต่อการใช้ ผนวกเข้ากับระบบออนไลน์ทุกอย่างถูกสร้างเชื่อมติดกันได้แม้แต่คาสิโน ufabet123 ซึ่งเป็นเรื่องยากมากแต่ก่อนเก่า กว่าจะได้เล่นทีต้องมีความตั้งใจจริงและส่วนใหญ่ไม่ได้ขยายกลุ่มลูกค้ามากขนาดนี้ เอาง่าย ๆ คนทั่วไปเอื้อมไม่ค่อยถึง หนึ่งคุณต้องมีการวางแผนในการไปเล่นบ่อนสถานที่จริง ซึ่งมีค่าใช้จ่ายสารพัดอย่าง คนที่มีความพร้อมด้านทุนทรัพย์รองรับเท่านั้นถึงจะเล่นพนันได้ ด้วยความล้ำหน้าพัฒนาทุกอย่างเข้าสู่โลกไซเบอร์เป็นตัวกลาง การจัดวางอาศัยบริบทเทคโนโลยี ทำให้การใช้ชีวิตของเราง่ายขึ้นเกือบทุกทาง ไม่แปลกใจเลยว่าคนยุคนี้จะมีอีกหลายทางเลือก โดยเฉพาะการสร้างตัวตนและรายได้ที่เสาะค้นอยู่ตลอดเวลา อัตราค่าเฉลี่ยสัดส่วนของคนอายุน้อย จึงลอยลำนำไปไกล อายุไม่เท่าไหร่ก็ประสบความสำเร็จซึ่งนั่นก็เกิดจากความพร้อมหลายอย่างที่เข้าที่เข้าทาง การวางอนาคตก็เลยคาดเดาได้กระทั่งสร้างรายได้ ยูฟ่าคาสิโน เปลี่ยนสภาพสู่โหมดออนไลน์ แตกต่างอย่างมีสไตล์ ออนไลน์เต็มฟอร์ม พร้อมแล้วไปดูกันว่าแหล่งทำเงินเรานั้นดียิ่งกว่าเดิมอย่างไร ข้อได้เปรียบการวางระบบแพลตฟอร์มใหม่ วางกลไกยังไงระบบเก่าถึงตามไม่ติด ยูฟ่าคาสิโน ใจดีอัพเกรดลูกค้า ufabet thai vip พร้อมรับโปรโมชั่นพิเศษ ไม่ต้องทำกิจกรรม รับสิทธิ์ได้ทันที วางระบบครบวงจรเพื่อรอรับการใช้งาน ufabet thai vip ทุกขั้นตอนเน้นความง่าย ได้ประสิทธิภาพสูง อันดับแรกที่แปลกไป ความง่ายเป็นหัวใจหลักในการเรียกทักลูกค้าเข้ามา ต้องเข้าใจว่าจำนวนลูกค้าก็มีหลายส่วน แต่แนวโน้มที่มีมากละเป็นลูกค้าเก่าอยู่แล้วค่อนไปทางวัยทำงานถึงช่วงรุ่นใหญ่เลย การปรับเปลี่ยนระบบให้ก้าวหน้าพัฒนาให้ก้าวล้ำเป็นสิ่งจำเป็น ส่วนหนึ่งเป็นการแข่งขันในแวดวงการที่คุณด้อยเมื่อไหร่ เว็บเปิดใหม่ปาดหน้าทันที ดังนั้นลูกค้าอาจจะมีความสามารถในการใช้งานที่ต่างกัน มันจึงต้องทำทุกขั้นตอนให้ง่าย ตั้งแต่การสมัครเข้าใจ ทุกช่วงเวลาถูกวางระบบให้ครบครันตอบโจทย์ผู้ใช้งานทั่วถึงกันแบบเต็มสตรีม ความพิเศษเกินใคร ข้อเสนอจัดสรร นักพนันพึงพอใจเพิ่มขึ้น จุด… เว็บ บอล ufabet คืนยอดเสีย5% ทุกเดือน แทงบอล ออนไลน์ 24ชั่วโมง เว็บ บอล ufabet ชัยชนะเหมือนกัน แต่ผลรางวัลต่าง หลักการวางบอลออนไลน์ หลายคนพยายามตั้งหน้าตั้งตาศึกษาความรู้เพื่อพัฒนาตนเองให้พร้อมรับกับทุกสถานการณ์ที่กำลังเผชิญหน้า เพื่อหวังว่าจะเอาชัยชนะมาอยู่ข้างเรา บางทีอาจมองข้ามไปว่าหลักของการเดิมพันมันไม่ได้ถูกสร้างมาเพียงฟังก์ชันเดียว สังเกตได้เลยจากพนันเกือบทุกชนิดการที่จะปิดเกมสวย การที่จะรวยได้มีหลากหลายแนวทางการเล่น ใช่..ชัยชนะเป็นสิ่งที่ทุกคนจำเป็นต้องไปให้ถึง แต่สิ่งหนึ่งควรรู้ไว้กับหลักการเดิมพัน เว็บแทงบอล ufabet ชนะเหมือนกัน แต่ผลตอบแทนนั้นมันต่าง สำหรับมือใหม่ต้องทำความเข้าใจส่วนนี้ให้ดีเลย เนื่องจากคุณจะได้ไม่ต้องไปหน้าแหกโวยวายไม่เข้าท่าเนื่องจากไม่ศึกษาให้ละเอียดถี่ถ้วน เดี๋ยวได้ม้วนตัวกลับเก็บเศษหน้ากันไม่ทัน อีกอย่างเพื่อป้องกันผลประโยชน์ให้กับตัวเองในระดับหนึ่ง ตราบใดที่นักเตะต่างต้องมีลูกเล่นหลากหลายวิธีในการยิงฟุตบอลเข้าโกล์เพื่อช่วงชิงประตู ก็ขอให้ผู้เล่นเดิมพันรู้ไว้ว่าแนวทางก้าวย่างเข้าสู่เส้นชัยข้างหน้าก็มีหลายกลุยุทธ์ ถ้าเดิมพันถูกจุดสิ่งที่ได้กับมาถือว่าคุ้มค่ากับที่เสียเวลา มิหนำซ้ำอาจจะได้ผลตอบแทนที่ดีกว่าจากการวางพนันแตกต่างกันออกไป จุดมุ่งหมายทุกคนหวังแค่เพียงชนะเพื่อเข้ารอบไปคว้าเงินรางวัลต่อไป แต่หากผลกำไรที่คาดหวังไว้มันได้กลับมาดีโดยที่ใช้กลวิธีเท่าเดิมอันนี้ก็เป็นส่วนเสริมในการเพิ่มประสิทธิภาพการเล่นอย่างน่าสนใจ สมัคร เว็บ บอล ufabet เดิมพันให้ลูกเล่นส่งผลต่อผลตอบแทนที่เห็นได้ชัด แทงบอลออนไลน์ เว็บ บอล ufabet ดีที่สุดในไทย แทงบอลขั้นต่ำ10บาท สเต็ปจ่ายหลักล้าน แทงบอลออนไลน์ มองให้ขาด เว็บ บอล ufabet แค่ไม่ประมาทก็อยู่ได้ ตามหลักคำสอน ความประมาทเป็นหนทางนำไปสู่ความหายนะ ดังนั้นการลดแรงปะทะ ทำอะไรไตร่ตรองให้รอบคอบด้วยไหวพริบ สติควบคุมพร้อมด้วยปัญญา ไม่ว่ารูปแบบพนันจะมาไม้ไหน เรื่องอะไรจะต้องกลัว ความเสี่ยงที่อาจคอยเป็นกำแพงกั้นบังเป็นสิ่งที่นักพนันควรระวังรู้ตัวอยู่เสมอ การเผชิญหน้ากับรูปแบบพนันที่ต้องเจอบอกเลยว่าห้ามกระพริบตา ด้วยการพัฒนาไปถึงขีดสุด กล้าพูดได้เลยว่าความท้าทายที่มีส่งผลต่อการเดิมพันโดยตรง ซึ่งก็ถือว่าเป็นอีกอรรถรสความแปลกใหม่ที่คุณจะไม่เคยสัมผัสจากที่ไหนแน่ อย่าง แทงบอลออนไลน์ ที่หลายคนชอบ และตอบโจทย์ผู้เล่นสายกีฬาพารวยกับ เว็บ แทง บอล ufabet ก็ไม่ต่างที่ต้องเจอกับอุปสรรคที่คอย…\n", + "Previous\n", + "Ufabet เว็บไซต์แทงบอลออนไลน์ พนันออนไลน์ ที่ดีที่สุด Ufabet168\n", + "Next\n", + "Fifty One คาเฟ่สุราษฎร์ธานี ใหม่ๆสวยๆ 2022 ร้านกาแฟสุราษฎร์ธานี นั่งชิว นั่งสบาย ปังๆ\n", + "Be the first to comment\n", + "Leave a Reply ยกเลิกการตอบ\n", + "Your email address will not be published.\n", + "Comment\n", + "Name *\n", + "Email *\n", + "Website\n", + "Save my name, email, and website in this browser for the next time I comment.\n", + "Δ\n", + "เรื่องล่าสุด\n", + "ทำ Search Engine Optimization Fanpage Fb ยังไงให้ติดหน้า Google\n", + "Slotxo: เว็บพนันสล็อตออนไลน์อันดับ 1 ในทวีปเอเชีย\n", + "Three สิ่งที่คนมักเข้าใจผิดเกี่ยวกับ Digital Marketing\n", + "รวมสล็อตเว็บใหญ่ ค่ายดังอันดับ 1 มาแรงที่สุด\n", + "เว็บสล็อตใหม่ล่าสุด ค่ายดังทุกค่าย มีเกมหลากหลายประเภท\n", + "ป้ายกำกับ\n", + "casino casino online Gold Deluxe Joker Game PG SLOT SA GAMING Sexy Baccarat กางล็คแจ็ค คาสิโน คาสิโน ทุนน้อย คาสิโน ทุนน้อย slotxo คาสิโนสด คาสิโนออนไลน์ คาสิโนเครดิตฟรี คาสิโน เล่นง่าย คาสิโนเว็บตรง น้ำเต้าปูปลา บาคาร่า บาคาร่าออนไลน์ พนันออนไลน์ ยิงปลา รูเร็ต รูเล็ต สมัครแทงบอล สล็อต สล็อตออนไลน์ สล็อตเครดิตฟรี สล็อตเว็บตรง สล็อตแตกง่าย เกมคาสิโน เกมสล็อต เกมส์สล็อต เล่นคาสิโน เล่นสล็อต เว็บคาสิโน เว็บคาสิโนออนไลน์ เว็บตรง เว็บพนันออนไลน์ เว็บสล็อต เสือมังกร แทงบอล แทงบอลออนไลน์ ไพ่เสือมังกร ไฮโล ไฮโล/สิกข์โบ\n", + "Backlink\n", + "789bet ufabet allcasino texas gaming สมัครบาคาร่า 123bet บาคาร่าออนไลน์ BETFLIX ufabet ufabet เว็บหวย สล็อตเว็บตรง betflix betflix betflix sexy game เว็บตรงไม่ผ่านเอเย่นต์ หวยยี่กี เว็บเล่นสล็อต ฟุตบอลโลก seo สายเทา ฟุตบอลโลก SBOBET pgslot สล็อตเว็บตรง xoslot ufabet BETFLIX betflix PG SLOT สล็อตออนไลน์ banball บาคาร่า เว็บบาคาร่า Sbobet24hr pokdeng hotgraph prettygaming pgslot มังกรฟ้า sexygaming dreamgame agbet ebet sagaming romaslot Joker Gaming แทงมวย SBOBET API bk8 สล็อตเว็บตรง UFABET BETFLIX BETFLIX BETFLIX บาคาร่า สล็อตเว็บตรง g2gbet slotxo lsm99 เว็บสล็อต เว็บเล่นสล็อต g2gbet สล็อต บาคาร่า betflik เบทฟิก เว็บสล็อต lava66 lava168 สล็อตเว็บตรง pg slot สล็อตแตกง่าย สล็อตเว็บตรง สล็อตแตกง่าย แทงบอลออนไลน์ดีที่สุด BETFLIK มังกรฟ้า betflix BETFLIX เบทฟิก\n", + "\n", + "doc\n", + "Red Phoenix Rising คงมีหลายท่านมีต้องลำบากในยุคที่เศรษฐกิจที่ไม่เป็นดั่งใจแบบนี้ให้ตัวเกมที่มีชื่อว่าRed Phoenix Rising ที่จะมาแก้ไขปัญหาต่างๆ ให้เบาบางลงอีกทางหนึ่งในรูปแบบของตัวเกม Slot Online สำหรับท่านที่ยังไม่ค่อยคุ้นเคยกับตัวเกมสไตล์นี้เสียเท่าไหรก็ขอให้อย่าพึ่งถอดใจเพราะตัวเกมไม่ได้น่ากลัวอย่างที่ท่านคิดแน่นอน\n", + "เนื่องจากผู้เล่นสามารถที่จะเลือกอัตราการลงทุนได้ตามใจชอบ เช่นการลองลงทุนจากขั้นต่ำไปก่อนหากคว้ากำไรมาได้ก็สามารถที่จะลงให้เยอะขึ้นได้ตามความต้องการ เป็นต้น ข้อดีอีกอย่างของตัวเกมRed Phoenix Rising ผู้เล่นไม่จำเป็นที่จะต้องรีบร้อนเล่นจนเกินไปเพราะตัวเกมจะให้ความเป็นส่วนตัวแก่ผู้เล่นที่เข้ามาแบบสุดๆ\n", + "รูปแบบต่างๆ ที่น่าสนใจภายในเกม Red Phoenix Rising\n", + "สิ่งสำคัญที่ควรจะพูดถึงอย่างยิ่งสำหรับตัวเกมRed Phoenix Rising ที่จะทำให้ผู้เล่นได้คว้ากำไรเป็นแบบเต็มที่ ก่อนที่ผู้เล่นควรรับรู้ก็คือตัวเกมนี้ได้พัฒนามาจากทางค่าย Red Tiger ที่เป็นแกนหลักในการขับเคลื่อนตัวเกมนี้ ต่อกันที่สิ่งแรกที่ผู้เล่นจะได้พบเจอเมื่อเข้าสู่ตัวเกมมาแล้วก็จะเป็นตารางที่แบ่งเป็น 5 รีล 4 แถว ที่อยู่ในลักษณะที่กำลังพอดีให้ผู้เล่นได้สังเกตได้ครบถ้วน ไลน์เพลย์ของเกมจะมีประมาณ 40 ไลน์ ด้วยกันให้ผู้เล่นได้นำเอาความสำเร็จไปครอง\n", + "ส่วนของสัญลักษณ์พิเศษจะมีอยู่ 2 แบบ ได้แก่ Scatter ทำหน้าที่ให้ผู้เล่นได้รับฟรีสปินไปแบบไม่จำเป็นต้องเสียต้นทุนอีกทั้งยังเป็นกุญแจที่ไขไปสู่ฟีเจอร์ของเกม และ Wild ช่วยคูณให้สัญลักษณ์ภายในตารางมีค่าที่สูงขึ้นไปกว่าเดิม ตามมาด้วยฟีเจอร์ของเกมที่จะจะทำงานต่อเมื่อผู้เล่นได้รับสัญลักษณ์ที่จับคู่กันครบ 3 ครั้ง แล้ว ให้ผู้เล่นสังเกตบริเวณซ้ายมือของหน้าจะมีผลึกเวทมนต์ปรากฏขึ้น หลังจากที่ผู้เล่นกดจับคู่ให้ผลคูณครบเต็มหลอดแล้วจะได้รับไข่นกฟีนิกซ์เป้าหมายของผู้เล่นให้กดจนกว่าไข่จะแตกที่จะแสดงให้เห็นถึงจำนวนของผลกำไรที่ผู้เล่นจะได้รับ\n", + "เทคนิคการคว้ากำไรจากRed Phoenix Rising ถือว่าเป็นอีกตัวเกมเรียกกำไรชั้นเลิศที่ผู้เล่นไม่ควรพลาดเลย แม้จะต้องใช้ความเข้าใจเสียหน่อยในช่วนแรกของเกมแต่ก็ไม่ยากเกินไปที่ผู้เล่นจะคว้ากำไรไปจาก Slot Online ก็จำเป็นที่จะต้องมีเทคนิคกันบ้าง แนะนำให้ผู้เล่นใส่ใจในเรื่องของการลงเดิมพันให้ดีควรมีสติทุกครั้งก่อนที่จะเริ่มเดิมพัน ต่อด้วยการจับคู่กับสัญลักษณ์สำคัญเพราะจะทำให้การคว้ากำไรอยู่ไม่ไกลเกินเอื้อมเลย\n", + "สนใจเว็บไซด์เกมRed Phoenix Rising สามารถติดตามได้ที่ คาสิโนออนไลน์รวมเกมค่ายดัง ทางเข้าCASINO ONLINE เว็บตรง เล่นผ่านมือถือ\n", + "\n", + "doc\n", + "คลิปสวิงกิ้ง VIP ความสุขทางเพศสัมพันธ์คนเราไม่เหมือนกัน ผัวโทรจ้างทีม SWG มารุมเย็ดเมียตัวเอง ดูเธอมีความสุขมากๆ\n", + "19 Views0 Comments0 Likes\n", + "การ์ตูนโป๊ล้อเลียน (สคูบี้ดู Scooby doo porn) เพื่อนสนิทสุดซี้สาวแว่น จับชักควยแล้วโม๊คก่อนจะเย็ดกันจนน้ำแตก E Hentai เสียงครางอย่างเสียว\n", + "13 Views0 Comments0 Likes\n", + "คลิปเสี่ยเย็ดสาวรับงานN มาแล้วสาวสวยรับงานเอ็นโดนเสี่ยพาไปต่อในโรงแรมเอาสุดมันส์หีโหนกสวยซะด้วย\n", + "26 Views0 Comments0 Likes\n", + "คลิปหลุดทางบ้าน คู่รักแต่งงานใหม่จัดในอ่างอาบน้ำเย็ดท่าหมา หน้าอกใหญ่ยาน\n", + "33 Views0 Comments0 Likes\n", + "หนังโป๊ออนไลน์ เธอเป็นคนเซ็กจัด ชอบให้เลียหี หีสวยแบบนี้ใครก็อยากเลียให้ค่ะ\n", + "27 Views0 Comments0 Likes\n", + "อมควยมิดด้ามเย็ดทีหีกระจายร้องลั่นบ้านเลย\n", + "45 Views0 Comments0 Likes\n", + "คำค้นหา\n", + "คลิปหลุดหนังavหนังโป๊ญี่ปุ่นหนังโป๊ไทยช่วยตัวเองหนังxหนังโป๊คลิปโป๊เย็ดคลิปนักศึกษาหีชักว่าวคลิปสวิงกิ้งxxxน้องแนทเลสเบี้ยนคลิป18นมใหญ่pornเลียหีสาวใหญ่xvideoyoujizzดูหนังโป๊เย็ดหีเกย์ควยหีสวยหนังโป๊ออนไลน์คลิปเกย์หนังxxxpornhubหนังyoupornหนังxญี่ปุ่นthaipornxvideosเงี่ยนดูหนังโป๊ออนไลน์หีใหญ่pornxxxเอากันro89xxxญี่ปุ่นporntubexhamsterthaixxxxxxxดูหนังxxxเย็ดกันสาวไทยredtubejapanxxxwww.heedum.compornhdx99bbแตกในbeegไทยsexนักศึกษาxnxxเย็ดกับแฟนหีนักศึกษาน่าเย็ดขย่มควย18+อมควยjizznuvidตัวเล็กหีไร้ขนนมน่ารักxxtube8โชว์xxx18avvideoดูดควยขายหีxvdoหนังโป้ใหม่rโม๊กควยdetubetubthaiเกvideosหนังเกย์agayxxxhardsextubethreesome\n", + "\n", + "doc\n", + "คลิปหลุดทางบ้าน | หนังโป๊ออนไลน์ หนังโป๊ฟรี หนังโป๊ใหม่ หนังAV หนังอาร์ หนัง18+ คลิปโป๊ คลิปหลุด แอบถ่าย หี เย็ด PORN\n", + "หนังโป๊ออนไลน์ หนังโป๊ฟรี หนังโป๊ใหม่ หนังAV หนังอาร์ หนัง18+ คลิปโป๊ คลิปหลุด แอบถ่าย หี เย็ด PORN\n", + "porn\n", + "หนังโป๊มาใหม่\n", + "คลิปหลุด\n", + "การ์ตูนโป๊ Hentai Doujin\n", + "นักเรียน นักศึกษา\n", + "หนังโป๊ญี่ปุ่น\n", + "หนังโป๊ฝรั่ง\n", + "หนังโป๊ไทย-เรทอาร์\n", + "เกย์\n", + "แอบถ่าย\n", + "Tag: คลิปหลุดทางบ้าน\n", + "คลิปโป๊แอบถ่าย หลุดจากกลุ่มลับ ห้องเชือดนักศึกษา นิสิตสาวรับงานไซด์ไลน์ เจอหนุ่มขี้เงี่ยนจับล้วงหีแล้วลงลิ้น จับเลียไข่ดูดควยเลียหัวควยอย่างเด็ด ขึ้นขย่มเย็ดควยแล้วแหกขากระเด้าเย็ดหี ก่อนจะโดนตะแคงเย็ดหีรัวๆตามด้วยท่าหมากระแทกเน้นๆไม่ยั้งครางเสียวลั่นจนเสร็จ\n", + "คลิปหลุดแอบถ่าย ตั้งกล้องเย็ดกับแฟน แนวบ้านๆสาวเงี่ยนจับผัวอมควยสดๆ แล้วใส่ถุงขึ้นขย่มเย็ด โดนผัวพลิกกลับมากระเด้าหีเอาควยถูๆแล้วเย็ดต่อท่ายากอีกหลายท่า ลีลาการเย็ดขั้นเทพเย็ดไปคลึงหีไปจนแตก เสียวจนไม่รู้ว่าโดนแอบถ่าย\n", + "คลิปโป๊หลุด18+ เย็ดสาวชุดสไปเดอร์แมน แหวกหีเย็ดขึ้นโยกควยร้องโคตรเสียว จากยิงใยกลายเป็นยิงน้ำเงี่ยนกันแทน\n", + "หลุดแอบถ่าย ทหารหนีเวรเพราะเงี่ยนจัด กระหน่ำเย็ดหีกะหรี่ซอยไม่ยั้ง กระแทกหีท่าหมารุนแรงนมกระเพื่อม เหมือนเก็บกดไม่ได้เจอหีนาน\n", + "ดูคลิปโป๊ไทย18+ งานจากทางบ้านแฟนสาวสวมชุดนอนไม่ได้นอน เจอแหวกกางเกงในเย็ดกันหีแฉะ\n", + "คลิปโป๊หลุดไทย น้องคลื่น Twitter อมควยให้ผัวเจอเล่นหีแล้วจับเย็ด กระแทกจนน้ำหีพุ่งร้องว่าพอ แต่ผัวไม่พอกระหน่ำเย็ดหีจนร้องลั่น\n", + "คลิปโป๊หลุด18+ สาวธนาคารหุ่นสุดx โดนจับยกขาเย็ดข้างกำแพง แล้วขึ้นขย่มควยต่ออย่างแรง\n", + "ดูคลิปโป๊ IXXX ช่วงนี้ติดโควิดเลยต้องถ่ายทำแบบใส่แมส เจอควยใหญ่อดใจที่จะอมไม่ไหว เลยเอาแมสมาปิดหน้า เลยดูดควยได้อย่างสบายๆ\n", + "คริปโป๊หลุดไทย นักศึกษาสาวสวยหุ่นอวบอึ๋ม แถมเอวดีพริ้วมาก ร่อนหีบดควยซะเสียวจนเกือบน้ำแตกคาหี IXXX เย็ดทั้งทีขอเย็ดสดเลย\n", + "ดูคริปโป๊หลุด18+ เมื่อกะหรี่สาวต้องไปขายหีให้พี่สุดหล่อ แถมยังเย็ดเก่งมาก รู้แล้วว่าพี่เข้าดงี่ยนจริง สงสัยช่วงโควิดไม่ได้ไปปลดปล่อยที่ไหนเลย\n", + "ดูคลิปโป๊ Cham Of Love เมื่อสาวสวยให้พี่ตากล้องช่วยอาบน้ำให้ ตัวเปียกทั้งคู่ สงสัยได้เปียกน้ำเงี่ยนในห้องน้ำแน่นอน\n", + "คลิบโป้ XXX ดูสาวสวยชวนเสียว Cham of love แอบร่วมเพศกับเพื่่อนสามี นอนตกเบ็ดอยู่ดีๆเพื่อนผัวรีบเข้ามาเสียบหีเลย\n", + "คริปโป๊ไทย เอาสดกับเด็กน้อยสุดร่าน ClipXXX ตัวแค่นี้แต่เย็ดมันส์มาก โดนกระเด้าจับแหกหีเสียบไม่ยั้ง รูหีบานเปิดกว้างพรัอมรับควยสุดๆ\n", + "คลิปโป๊หลุด18+ ชวนผัวไปเย็ดที่ลานจอดรถ เปลี่ยนบรรยากาศบ้าง ขึ้นไปเอากันชั้นบน ยืนเย็ดเสียวจนน้ำแตก\n", + "หลุดไทย18+ น้องเนตรนารีโดดเรียนมาหาแฟนที่บ้าน เรียนอยู่แล้วทำไมถึงเงี่ยน แม่ส่งไปเรียนไม่ได้มาหาผัว แต่ถ้าอยากเย็ดผัวก็จัดให้\n", + "คลิปโป๊ฟรี 18+ สาวหมวยงานดีหีน่าเย็ด นั่งขย่มควยเย็ดอย่างแรง เอวดีมาก ร่อนจนเสียวน้ำหีไหลเต็มควยเลย\n", + "คลิบหลุดห้องลับ ถ่ายเองเย็ดเองนักเลงพอ มาพร้อมมะเขือยาวนอนแหกหีเอามะเขือเสียบจนมิดด้าม หีตอดเก่งมากถ้าเป็นควยจริงคงเสียวน่าดู\n", + "หลุดไทย18+ 2พี่น้องเหงาหีชวนผัวมาสวิงกิ้งกัน ผลัดกันเอาควยเดียวกัน วนเย็ดหีกระแทกแรงถึงใจจนน้ำแตกทุกคน\n", + "หลุด18+ น้องโยชิเปิดไลฟ์ระดมทุน ใครจ่ายเยอะจะได้ดูหีด้วย เปิดมาทีละชิ้นเอาซะเงี่ยนควยกันเป็นแถบ\n", + "หลุดไทย18+ ตัวท็อปย่านสุขุมวิตรับงานขายหีถึงคอนโด ลีลาเด็ดมากขึ้นควยร่อนหีจนครางเสียวลั่น กลีบหีเนียนมากจนนลูกค้าเงี่ยน\n", + "คลิปหลุดไทย XXXXX นักศึกษาสาวแอบนัดลูกค้าไปเย็ดบนดาดฟ้าโรงแรม ล่อหีกันบนบันไดหนีไฟไม่พอ ไปจัดต่อท่าหมาบนดาดฟ้าจนน้ำแตก\n", + "คลิปหลุด18+ นักศึกษาขายหีคาชุด โดนลูกค้าหื่นจับเย็ดไม่ยั้ง เห็นหีอวบแน่นเลยเย็ดเพลิน เผลอแตกในหีซะเลย\n", + "หลุดXXX เสี่ยหมีจอมหื่นเย็ดกับลูกจ้างพม่าสาวสวย แม้จะเบื่อแต่ต้องยอม เพราะให้เย็ดหี จะได้มีงานทำช่วงโควิด\n", + "คลิปเสียวxxx เย็ดเก่งจนนึกว่าดาราหนังโป๊ หมอยดกดำเอาหีบดควยไม่ยั้ง เอวดีมากดูแล้วเงี่ยนสุดๆ\n", + "คลิปหลุดจากกลุ่มลับ XXX คู่เทพเย็ดกันมันส์มาก ขึ้นควบควยอย่างไว ซอยหีใส่รัวๆเลย เอวพริ้วแบบนี้ทำเอาคนดูเงี่ยนไปด้วยเลย\n", + "ดูคลิปโป๊หลุด จับแฟนกดหน้าลงโต๊ะ เย้ดแรงอย่างกับหมูกับหมา XXX ซอยหีรัวไม่มียั้งจนเจ็บหี ไม่รุ้จะเย็ดแรงไปไหน น้ำหีไหลจนเกือบหมดตัว\n", + "หลุด18+xxx น้องพิมพ์ ปัทมาเย็ดกับพี่เทพ คลิปเสียวส่วนตัวถ่ายไว้แล้วหลุดออกมา เอาแรงครางเสียวดังลั่นมาก ขย่มเย็ดแรงจนหีน้ำแตกเยิ้ม\n", + "คลิปหลุด งานแรร์ VJ สาวน้อยน่ารักดัดฟันโคตรน่าเย็ดเลย เกี่ยวเบ็ดช่วยตัวเองจนเสียว ยิ่งดูยิ่งเงี่ยนกลีบหีขาวๆแบบนี้อยากเลียให้เลย\n", + "คลิปหลุดxxx ถือกล้องนอนคว่ำให้ผัวซอยอย่างแรง เย็ดกันท่าหมาฟินๆต้อนรับปีใหม่ หน้าสวยมากโดนเย็ดแรงจนหน้าเคลิ้มเลย\n", + "คริปหลุด18+ น้องโมนิก้าเด็ดมาก เปิดไลฟ์สดโชว์หุ่นยั่วๆน่าเย็ดมาก เนื้อนมไข่มากแม่คุณ ถามจริงๆทำไมถึงไม่โดนเย็ดหี\n", + "หลุดxxx18+ นักเรียนสาวโดนตาลุงข้างห้องทำเสียว เห็นพ่อแม่ไม่อยู่เลยบุกเข้ามาเย็ดถึงที่ เห็นส่งสายตาให้ตลอดนึกว่าชอบ\n", + "หลุด18+ วัยรุ่นเย็ดกันมันส์มาก ขย่มเย็ดอย่างแรง เอวดีสุดๆร่อนจนผัวครางซี้ดลั่น น้ำแตกเต็มๆรูเลย\n", + "คริบโป๊ไทย18+ ชวนเพื่อนมานอนที่หอ แต่ผัวดันกลับมาพอดี เลยเงี่ยนชวนผัวเย็ดโชว์เพื่อนซะเลย\n", + "คลิบหลุด นักศึกษาครางเสียว โดนผัวเย็ดท่าหมาอย่างแรงจนดังตับๆ clipxxx รีบเย็ดรีบไปเรียนต่อ ต้องรีบเอาให้น้ำแตก\n", + "หลุดไทย18+ วันเกิดโดนแฟนเซอร์ไพร้ให้ของขวัญด้วยการให้เย็ดสด XXX เจอแบบนี้ก็รีบจัดสิครับไม่รอช้าแตกในด้วยเลย\n", + "หลุด18+ นักร้องหนุ่มดังในติ๊กต๊อกเย็ดกับแฟนในท้องนา โดนแฟนอมควยเสียวจนต้องจับเย็ดตรงนั้น\n", + "หลุดคู่เทพ18+ นางฟ้าเอวอย่างไว ควบควยซอยรัวจนร้องซี้ดเลย ฟินควยสุดๆ ต้องกลั้นน้ำไว้ยังไม่อยากรีบแตกใส่หี\n", + "คลิปหลุดไทย แอบถ่ายเย็ดกับเมียเพื่อน 18+ เปิดเต้าโชว์ขนาดนี้ใครเห็นจะไม่เงี่ยน จุกนมบานมากขอดูดให้หายเงี่ยนเลย\n", + "คลิปแอบถ่าย xxx พริตตี้เปลี่ยนเสื้อในห้องน้ำเมืองทอง เห็นหมดทั้งตัว นมใหญ่ของจริงไม่พึ่งฟองน้ำ แถมหีขาวจั๊วะน่าเย็ด\n", + "คลิปโป๊หลุดxxx ครูสาวอมควยผัวทั้งดูดทั้งเลีย สงสัยจะดูดเก่งมาก ทำซะผัวไม่ทันได้เย็ดน้ำแตกคาปากเลย\n", + "คริปโป๊กลุ่มลับ XXX เริ่มมาก็โดนดูดหีเลย น้ำหีไหลเยิ้มเลยนะ สงสัยจะเงี่ยนแล้ว รีบจับแหกหียัดควยใส่ให้ไว\n", + "คลิปหลุดxxx โดนแฟนตั้งกล้องถ่ายเย็ดท่าหมา 18+ จับกระแทกหีเย็ดแรงคาชุด เอาซะร้องครวญครางดังลั่น เย็ดเหมือนเงี่ยนมานาน\n", + "คลิปXXXX ตั้งกล้องเย็ดกับแฟนแต่เช้าตรู่ ให้แฟนโมกควยให้จนเสียวเกือบน้ำแตก ผัวเลยต้องรีบจับเย็ดหีให้ไวเลย\n", + "หลุดแอบถ่าย พริตตี้นวดกะปู๋เอวดีลีลาเด็ด ขึ้นขย่มควยให้ลูกค้าอย่างฟิน 18+ แถมยังตกเบ็ดตัวเองจนน้ำนอง พอโดนควยเย็ดยิ่งเสียว\n", + "ดูคริบหลุด18+ แอบถ่ายตอนเย็ดกับแฟน เจอสาวเอวดีควบควยขย่มให้จนผัวเสียวคราง อยากจะแตกใส่หีเธอใจจะขาดแต่ทำไม่ได้\n", + "ดูคลิปโป๊หลุด18+ กะหรี่ตัวท้อปเย้ดกับลูกค้าเบื่อแล้ว เลยลองมาเล่นเสียวขายหีให้ผัวดูบ้าง ผัวก็เล่นสมบทบาทซื้อกะหรี่กินจนชิน\n", + "หลุด18+ สาวสวยกระหรี่ไทยรับงานเย็ดกับฝรั่งนอกรอบ โดนฝรั่งพามาเย็ดที่ห้อง เจอจัดท่ายาก ร้องเสียวลั่นห้อง\n", + "หลุดxxxไทยมาใหม่ เย็ดหีนักศึกษาสาวคาชุด เพิ่งกลับมาจากมหาลัยก็โดนผัวปี้หี จับแทงซะยับคาชุดนิสิตเลย\n", + "->\n", + "1\n", + "2\n", + "3\n", + "หนังโป๊ออนไลน์.com - เว็บดูหนัง18+ออนไลน์ ดูหนังโป๊ใหม่ๆฟรี หนังx หนังโป๊แนวเรทอาร์ หนังโป๊ไทย หนังโป๊ญี่ปุ่น AVเต็มเรื่อง หนังRเกาหลี ดูหนังโป๊เกาหลี หนังโป๊จีน XXX หี PORN เอากัน เย็ดกัน ดูได้ฟรีๆโดยไม่เสียค่าบริการใดใดทั้งสิ้น คัดเนื้อหา หนังโป๊ วีดีโอ เด็ดๆระดับคุณภาพ ให้ท่านผู้ชมได้เสพความหื่นกาม โดยที่ไม่เน้นให้ได้รายได้ ไม่มีโฆษณาให้รำคาญก่อนรับชม พร้อมด้วยคุณภาพหนังชัดที่สุดในชั่วโมงนี้และรวดเร็วที่สุดในบรรดาเว็บไซต์ดูหนังผู้ใหญ่แห่งประเทศไทย\n", + "หนังโป๊ออนไลน์.com - ผ่านการรับรองจากองค์กรณ์ RTA Lebel เป็นองกรณ์หน่วยงานป้องกัความมั่นคงของเด็กที่อายุต่ำกว่า 18 ปีเข้าดูสื่อลามกอนาจารย์ หากต้องการป้องกันยับยั้งการเข้าถึงโปรดอ่านหน้านี้\n", + "ติดต่อลบได้ที่นี่ - Advertising-ติดต่อโฆษณา\n", + "หนังโป๊ออนไลน์.com - the ultimate porn videos and free porn experience with 1,000,000's of porn videos\n", + "ลิขสิทธิ์ 2022 © หนังโป๊ออนไลน์ หนังโป๊ฟรี หนังโป๊ใหม่ หนังAV หนังอาร์ หนัง18+ คลิปโป๊ คลิปหลุด แอบถ่าย หี เย็ด PORN ดูหนังโป๊เพื่อระบายความเงี่ยน\n", + "\n", + "doc\n", + "MotulEvo คือ การดูแลระบบเกียร์อัตโนมัติของรถคุณที่ครบวงจรทั้งด้านผลิตภัณฑ์ที่มีคุณภาพและการบริการอย่างมืออาชีพ ที่จะช่วยเพิ่มโอกาสการเติมโตทางธุรกิจให้กับคุณ\n", + "\n", + "doc\n", + "บาคาร่าออนไลน์ ต่างประเทศ โดยในปัจจุบันนี้มีเกมไพ่ออนไลน์ให้เลือกเล่นอย่างมากมาย โดยทำการถ่ายทอดสดจากบ่อนคาสิโนชื่อดังทั่วโลก และนักพนันทุกคนทำความเข้าใจก่อนเข้าเล่นเกม บาคาร่าออนไลน์ ต่างประเทศ ที่ได้รับความนิยมมากที่สุด โดยมีวิธีการเล่นคล้ายกับเกมไพ่บาคาร่า ซึ่งเริ่มต้นการเล่น เสือมังกรทดลองเล่น ดูก่อนด้วยเครดิตเงินฟรีที่เราได้รับ\n", + "ก่อนที่จะเติมเงินเข้าใช้บริการในภายหลังเมื่อมีความมั่นใจ ด้วยความคล้ายคลึงของเสือมังกรและบาคาร่า นั่นคือวางเงินเดิมพันได้ทั้ง 2 ฝั่ง โดยเกมไพ่บาคาร่าวางเดิมพันได้ทั้งฝั่งผู้เล่นและฝั่งเจ้ามือ ส่วนเกมไพ่เสือมังกรวางเดิมพันได้ทั้งฝั่งซ้ายและฝั่งขวา นั่นคือฝั่งซ้ายและฝั่งมังกรนั่นเอง และยังสามารถวางเดิมพันกับผลไพ่ทั้ง 2 ฝั่งให้เสมอกันได้อีกด้วย\n", + "เข้าเล่นเกม บาคาร่าออนไลน์ ต่างประเทศ วางเงินเดิมพันได้ตามความเหมาะสม\n", + "การหาเงินรายได้เข้าบัญชีในยุคปัจจุบันนี้ทำได้ง่ายยิ่งขึ้น โดยเกมไพ่ออนไลน์ในปัจจุบันได้รับความนิยมเป็นอย่างมาก และเกมที่เล่นง่ายที่สุดเล่นได้อย่างรวดเร็วต้องยกให้กับ บาคาร่าออนไลน์ ที่เล่นได้สะดวกในทุกสถานที่ที่มีสัญญาณอินเตอร์เน็ตให้เชื่อมต่อ และทำผลกำไรได้อย่างต่อเนื่องด้วย โดยเราสามารถวางเงินเดิมพันได้ตามความเหมาะสมจากยอดเงินในบัญชีที่เรามี เพื่อนำมาเดิมพันและทำผลกำไรได้แบบไม่จำกัดจำนวน โดยปัจจุบันนี้มี โต๊ะเสือมังกร ให้เราเลือกวางเดิมพันได้ทั้ง 2 ฝั่ง โดยจะให้อัตราตอบแทนเงินเมื่อแทงชนะอยู่ที่ 1 เท่าจากเดิมพันที่เราวางไป\n", + "สำหรับใครที่ต้องการเล่นเกมไพ่เสือมังกรนั้น สามารถศึกษากฎและกติกาให้เข้าใจ เพื่อเลือกวางเดิมพันในรูปแบบอื่นๆ ทั้งการทายผลไพ่ว่าเป็นเลขคี่หรือคู่ ซึ่งจะให้อัตราเงินตอบแทนเช่นเดียวกับการแทงเสือหรือมังกรชนะ ส่วนใครที่วางเดิมพันให้ทั้งสองฝั่งเสมอกัน จะได้รับอัตราตอบแทนเงินอยู่ที่ 8 เท่าโดยประมาณ แต่หากเราแทงผลเสมอและผลไม่ออกมาเป็นเสมอ ก็จะเสียเงินวางเดิมพันไปครึ่งนึงนั่นคือ 50% โดยสำหรับใครที่มีการวางแผนเป็นอย่างดี ก็มีโอกาสที่จะประสบความสำเร็จในการเล่นเกมส์คาสิโนยอดนิยม เสือมังกรทุกครั้งได้อย่างแน่นอน\n", + "รับผลกำไรอย่างต่อเนื่องกับ บาคาร่าออนไลน์ ต่างประเทศ ที่เข้าเล่นได้อย่างสะดวกและรวดเร็วผ่านมือถือ\n", + "การเล่นเกมพนันออนไลน์ในปัจจุบันทำได้อย่างสะดวกและรวดเร็ว เพราะทุกคนต่างเล่นเกมคาสิโนต่างๆผ่านโทรศัพท์มือถือสมาร์ทโฟนของตนเองได้อย่างรวดเร็ว โดยที่นักพนันสามารถรับผลกำไรอย่างต่อเนื่องกับ บาคาร่าออนไลน์ ต่างประเทศ ที่ให้ทั้งความสนุกสนานเพลิดเพลินในการเล่นเกมไพ่ยอดฮิตชนิดนี้ และทำเงินเข้าบัญชีได้อย่างเร็วรวดเมื่อวางเดิมพันชนะ นักพนันทุกท่านสามารถกำหนดให้มีการเงินในการเล่นแต่ละวัน รวมทั้งวางเป้าหมายให้แก่ตนเอง เมื่อทำผลกำไรได้ตามต้องการก็ถอนเงินเข้าบัญชีไปใช้จ่ายใช้สอยได้โดยทันที\n", + "โดยการใช้ เทคนิค บาคาร่าเบื้องต้น สามารถเริ่มต้นโดยการใช้เครดิตเงินฟรีเพื่อวางเงินเดิมพันดูก่อนได้เป็นอย่างดี\n", + "สำหรับนักพนันคนใดที่ยังไม่กล้าเริ่มต้นในการเล่นเกมไพ่บาคาร่าออนไลน์ สามารถทำการสมัครสมาชิกกับเว็บพนันที่ไว้ใจได้เพื่อรับเครดิตฟรีไปทดลองเล่นดูก่อนได้เป็นอย่างดี โดยการใช้ เทคนิค บาคาร่าเบื้องต้น นี้ จะทำให้นักพนันทุกท่านประสบความสำเร็จและกลายเป็นนักพนันมืออาชีพได้ รวมทั้งการใช้โปรโมชั่นเครดิตฟรีที่ได้รับ ทดลองเล่นบาคาร่า ได้เป็นอย่างดีด้วย\n", + "สำหรับนักพนันคนใดที่มีความมั่นใจก็ค่อยเติมเงินตนเองเข้าใช้บริการในภายหลัง และทดลองวางเดิมพันกับบาคาร่าแบบขั้นต่ำด้วยเงินหลักสิบ ก่อนที่จะเพิ่มเงินเดิมพันอย่างมั่นใจเป็นหลักร้อยหลักพัน และเมื่อทำผลกำไรหลักหมื่นได้ก็ถอนเงินเข้าบัญชีได้เลย\n", + "วางแผนการใช้ เทคนิค บาคาร่าเบื้องต้น เพื่อกลายเป็นนักพนันมืออาชีพคนต่อไป\n", + "สำหรับใครที่ไม่รู้ว่าจะเล่นเกมพนันออนไลน์ชนิดใดที่ส่งผลให้ตนเองประสบความสำเร็จในการเล่นได้พร้อมกับทำเงินเข้าบัญชีได้อย่างต่อเนื่องนั้น สามารถวางแผนการใช้ เทคนิค บาคาร่าเบื้องต้น จากการทดลองวางเดิมพันแบบขั้นต่ำหรือการใช้สูตรในการอ่านเค้าไพ่บาคาร่าอย่างแม่นยำก่อนที่จะทำผลกำไรได้อย่างต่อเนื่อง โดยทุกคนสามารถ เล่นบาคาร่าออนไลน์ฟรีได้เงินจริง เมื่อเล่นชนะได้ในทุกๆครั้ง โดยการฝึกฝนตนเองในการเล่นอยู่เป็นประจำจนเกิดความชำนาญจะกลายเป็นนักพนันมืออาชีพคนต่อไปได้เป็นอย่างดี\n", + "และการเลือกเว็บไซต์ที่ดีจะทำให้เรามีชัยชนะในการเล่นไพ่บาคาร่าไปมากกว่าครึ่ง ซึ่งเว็บบาคาร่าออนไลน์ที่มีโปรโมชั่นให้อย่างมากมายทั้งเครดิตเงินฟรีหรือโบนัสเงินคืน จะเป็นที่ต้องการของนักพนันทุกท่านเป็นอย่างมาก และใช้ทำผลกำไรเป็นเงินเข้าบัญชีได้อย่างต่อเนื่องจากการเดิมพันไพ่บาคาร่าทั้งฝั่งผู้เล่นและฝั่งเจ้ามือ รวมทั้งการแทงผลไพ่คู่หรือผลไพ่เสมอที่ให้อัตราเงินตอบแทนถึง 11 เท่าและ 8 เท่าตามลำดับ โดยถือเป็นรอบโบนัสหรือรอบแจ็คพอตของเกมไพ่บาคาร่าก็ว่าได้ ทั้งนี้ทั้งนั้นณัฐนันท์แต่ละคนจะต้องมีการวางแผนการเล่นที่ดีด้วย\n", + "การเลือกใช้ เทคนิค บาคาร่าเบื้องต้น เพื่อเพิ่มความมั่นใจให้แก่ตนเองในการวางเงินเดิมพันทุกครั้ง\n", + "เทคนิคและวิธีการต่างๆที่ใช้ในการเล่นเกมไพ่บาคาร่า จะพัฒนาฝีมือของนักพนันมือใหม่ให้กลายเป็นนักพนันมืออาชีพได้ โดยการใช้ บาคาร่าออนไลน์ ไม่ต้องฝาก นอกจากจะเพิ่มโอกาสในการประสบความสำเร็จในการเล่นเกมพนันออนไลน์ทุกครั้งแล้ว ยังเพิ่มความมั่นใจให้แก่ตนเองในการวางเงินเดิมพันเพื่อทำผลกำไรให้มากขึ้นด้วย โดยนักพนันคนใดที่ทำความฝันของตนเองให้เป็นจริงในการวางเป้าหมายในการเล่นแต่ละวัน เมื่อได้ยอดเงินตามต้องการก็ถอนเงินเข้าบัญชีได้เลย โดยการอ่านเค้าไพ่และดูสถิติของไพ่ที่ผ่านมา จะเป็นเทคนิคง่ายๆในเกมไพ่บาคาร่าที่ทำให้นักพนันทุกท่านคว้าชัยชนะได้อย่างแน่นอน\n", + "สนใจสมัครสมาชิก สอบถามรายละเอียดเพิ่มเติมได้ที่ : @Call356v4\n", + "UFABET356 เว็บไซต์พนันออนไลน์ แทงบอล คาสิโน บาคาร่า ป๊อกเด้ง ไพ่แคง ไฮโล สล็อต หวย มวย ไก่ชน ครบจบในเว็บเดียว ที่คนเล่นเยอะที่สุดในตอนนี้ ฝาก-ถอนไม่มีขั้นต่ำ ด้วยระบบออโต้ที่เร็วและทันสมัยที่สุด\n", + "Twitter Facebook-f Dribbble Youtube Pinterest Medium\n", + "เกมคาสิโนออนไลน์ เล่นสนุก\n", + "บาคาร่า (Baccarat)\n", + "ป็อกเด้งออนไลน์\n", + "สล็อต (Slot)\n", + "ไฮโล (Sicbo)\n", + "เกมยิงปลา\n", + "รูเล็ต (Rolette)\n", + "เสือ-มังกร (Dragon Tiger)\n", + "แทงบอลออนไลน์\n", + "แทงบอลเดี่ยว\n", + "แทงบอลสเต็ป\n", + "แทงบอลสูง-ต่ำ\n", + "หวยออนไลน์\n", + "หวยรัฐบาล\n", + "หวยยี่กี\n", + "หวยใต้ดิน บาทละ 900\n", + "หมายเหตุ : เหมาะกับอายุ 18+ เท่านั้น หากทางบริษัทตรวจสอบพบ user ของท่านมีการเล่นที่ผิดปกติหรือทุจริตในการเล่น Abnormal ทางบริษัทจะสามารถ ทำการ VOID หรือ CANCELL บิลนั้นทิ้งได้ทันที โดยไม่ต้องแจ้งล่วงซึ่งการตัดสินใจของทางบริษัทถือเป็นที่สิ้นสุด\n", + "\n", + "doc\n", + "ชีวิตของเราขึ้นอยู่กับความโชคดี ดังนั้นเราต้องรู้เทคนิคที่สําคัญที่จําเป็นผลักดันให้ผู้หญิงโชคดีไปด้านข้างของคุณ น้อยกว่ามากที่เก้าสิบเปอร์เซ็นต์ขึ้นอยู่กับโชคและ 10 เปอร์เซ็นต์ในกลยุทธ์คือเกมคาสิโนซึ่งตอนนี้สามารถเล่นความสะดวกสบายของคุณของบ้านหนึ่ง ความต้องการทั้งหมดคือคอมพิวเตอร์ส่วนบุคคลและการเชื่อมต่อเว็บความเร็วสูง\n", + "เมื่อเกิดขึ้นต้องสนุกกับการขับขี่คุณสามารถช่วยประหยัดก๊าซประโยชน์จํานวนมากและการสึกหรอบนรถของคุณด้วยการเดินทางคาสิโนทุกวัน นี่ถือว่าอนุญาตให้คุณมีเงินในกระเป๋าเงินของคุณสําหรับการใช้จ่ายที่คาสิโนซึ่งอาจมีความสําคัญมาก แม้ว่าจะมีเงินออมไม่กี่ดอลลาร์ แต่ก็มีเงินพิเศษไม่กี่ดอลลาร์ที่สร้างความโชคดีให้คุณที่อุปกรณ์สล็อต\n", + "ดังนั้นสิ่งที่เกี่ยวข้องกับการพนันฟุตบอล? การพนันกีฬาทั้งวิทยาลัยและฟุตบอลอาชีพทํางานตามการแพร่กระจายชี้ให้เห็น การหารจุดคืออะไร? นี่เป็นคําที่จะอธิบายจุดคู่รักรักร่วมเพศซึ่งโดยทีมที่แข็งแกร่งควรได้รับการคาดหวังว่าจะเอาชนะทีมที่อ่อนแอกว่า การพนันฟุตบอลขึ้นอยู่กับการแพร่กระจายของจุดที่มีทีมหนึ่งเล่นที่ชื่นชอบพร้อมกับอีกทีมหนึ่งเล่นด้อยกว่า\n", + "บทเรียนคือการจ้างโบนัสคาสิโนเงินฝากอย่างแน่นอนไม่มีเงินฝากรางวัลเงินสดสําหรับการปฏิบัติต้องมีประสบการณ์และอํานาจมากขึ้นสําหรับเกมเงินจริงของคุณดังต่อไปนี้\n", + "เชื่อเช่นนั้นการชนะที่คาสิโนอึคือการเรียนรู้วิธีการควบคุมลูกเต๋า? มืออาชีพที่ได้รับค่าตอบแทนสูงสุดในการเล่นกีฬาเบสบอล ไม่มีตัวเลือกใดถูกต้อง 100% คุณคิดว่าคาสิโนเฉลี่ แทงบอลโลก ผู้เล่นสามารถควบคุมลูกเต๋า? ดูเว้นแต่คุณอาจจะอยู่ในหายาก.0005% ของผู้เล่นอึที่สามารถควบคุมลูกเต๋าพอที่จะชนะบ่อยกว่าไม่หานักกีฬาจะเป็นและเดิมพันกับเขาหรือเธอ\n", + "ฐานได้ทําคาสิโนเครื่องยนต์ตกด้วยระบบสล็อต มันมีม้าที่คุณอาจเช่าเมื่อสนามกอล์ฟที่ดีซึ่งมีลิงป่าที่จะขึ้นต้นไม้ดาวเคราะห์พวกเขามักจะโยนสิ่งที่คุณในกรณีที่คุณมาเพื่อปิดผนึกให้กับพวกเขา\n", + "เมื่อพูดถึงการเดิมพันสด ณ จุดนี้ยังหมายถึงในเกมการเดิมพันในการเล่นหรือการเดิมพันที่กําลังดําเนินอยู่ทุกอัตราต่อรองบอกเล่าเรื่องราวและคุณต้องจําไว้ว่าเคล็ดลับการพนันฟุตบอล หากคุณต้องการเรียนรู้ความลับในการเดิมพันเงินสดต้องเรียนรู้วิธีถอดรหัสอัตราต่อรองเหล่านั้นเพื่อระบุโอกาสในการเดิมพันที่สูงขึ้น แต่นี่ไม่ใช่งานง่าย นอกจากนี้ยังอาจใช้เวลาขยายเพื่อทําความเข้าใจรูปแบบแปลก ๆ ต่างๆและต้องพิจารณาเพื่อทําความเข้าใจสิ่งเหล่านี้เป็นระยะเวลานาน เมื่อคุณจะได้เรียนรู้เคล็ดลับการพนันฟุตบอลนี้แล้วคนจะพร้อมที่จะไปและชนะการเดิมพันของคุณ จําปัจจัยที่คุณต้องใส่ใจอีกครั้งเพื่อรู้อย่างรวดเร็ว\n", + "\n", + "doc\n", + "การซื้อลอตเตอรีออนไลน์ถือเป็นโอกาสที่ดีสำหรับคนบางกลุ่มในปัจจุบัน โดยไม่คำนึงถึงผู้คนต่าง ๆ ลังเลในขณะที่พยายามซื้อหวยบนเว็บ มีเกร็ดความรู้ที่เป็นที่ชื่นชอบซึ่งคุณจำเป็นต้องซื้อลอตเตอรีเพื่อให้ได้ลอตเตอรีชุดหนึ่ง ประสบการณ์ที่เป็นที่ชื่นชอบเหล่านี้จะช่วยให้คุณซื้อตั๋วได้อย่างรวดเร็วเนื่องจากช่วยคุณจากการโกงเงินสดที่คุณได้รับบนเว็บ การดำเนินการสำคัญเมื่อคุณออนไลน์คือการนึกถึงประธานปลอมทั้งหมดที่สามารถเข้าถึงได้บนเว็บ คุณควรไปที่ผู้จัดการที่ได้รับการยืนยันซึ่งขายสลากบนเว็บอย่างน่าเชื่อถือ ในทำนองเดียวกันให้ไปที่หน้าเว็บที่เกี่ยวข้องกับเกมลอตเตอรีที่สำคัญทั้งหมดบนเว็บ วิธีนี้จะช่วยให้คุณสามารถตัดสินใจได้อย่างกว้างขวางในขณะที่เล่นเกมลอตเตอรี่\n", + "คุณจะไม่ถูกปฏิเสธในการเล่นเกมลอตเตอรีที่คุณชื่นชอบ ไซต์ที่คุณอยู่ควรให้ความเป็นไปได้ในการเล่นเกมลอตเตอรีที่มีชื่อเสียงเช่น Mega Millions นอกจากนี้คุณควรมีทางเลือกในการเข้าร่วมในเกมลอตเตอรีทั้งหมดที่ถูก จำกัด โดยพันธมิตรลอตเตอรีของรัฐ หากคุณต้องการชนะเงินเดิมพันก้อนใหญ่ให้เลือกเกมลอตเตอรีที่มีความโดดเด่นซึ่งจะช่วยเพิ่มจำนวนเงินเดิมพันล็อตเตอรี่ให้สูงขึ้น Powerball เป็นหนึ่งในเกมลอตเตอรีที่ให้เงินเดิมพันจำนวนมากที่น่าสนใจอย่างไม่น่าเชื่อ ผู้ขายตั๋วออนไลน์จำนวนมากเสนอโอกาสให้คุณเป็นองค์กรออนไลน์เล็กน้อย องค์กรเหล่านี้มีผู้เล่นจำนวนมหาศาล ในกรณีที่คุณกลายเป็นองค์กรประเภทนี้คุณจะเพิ่มโอกาสในการครองลอตเตอรีการจับคู่ทุกอย่างที่ถือว่าองค์กรพยายามที่จะได้รับตั๋วที่มีส่วนผสมของการชนะที่ไม่ผิดพลาดจำนวนมากซึ่งอาจเป็นเรื่องปกติในสถานการณ์ปัจจุบัน\n", + "ในขณะที่เลือกหมายเลขลอตเตอรีบนตั๋วของคุณจงใช้ความคิดสร้างสรรค์ในระดับหนึ่ง พยายามอย่ายึดติดกับการเลือกวันเกิดของสมาชิกในครอบครัวของคุณ สิ่งนี้จะผูกแผนตัวเลขของคุณในการจับสลากเป็น 31 หมายเลข พยายามแสวงหาตามกรอบที่กำหนดในพื้นที่ลอตเตอรีบางส่วน คุณสามารถใช้ตัวเลขร้อนและตัวเลขเย็นตัดสินใจ บุคคลสองสามคนเลือกหมายเลขที่ได้รับเลือกในช่วงหนึ่งปีล่าสุด ตัวเลขเหล่านี้เรียกได้ว่าเป็นตัวเลขที่ร้อนแรง ในขณะที่คนอื่น jokergaming ชอบเลือกหมายเลขที่ไม่ได้เลือกในช่วงหนึ่งปีล่าสุด แต่พวกเขารู้สึกว่าโอกาสที่จะถูกหยิบหมายเลขนั้นสูงกว่า – ตัวเลขดังกล่าวเรียกว่าหมายเลขการติดเชื้อ ในที่สุดก็ขึ้นอยู่กับคุณว่าคุณต้องเลือกอะไรสำหรับตั๋วลอตเตอรี่togel Singapore ของคุณ ตรวจสอบบรรทัดฐานและกฎทั้งหมดของเกมลอตเตอรีที่คุณต้องเข้าร่วมอย่างต่อเนื่อง\n", + "Next Post\n", + "Betting\n", + "เคล็ดลับการเล่นเกมก่อนเล่นคาสิโนออนไลน์ยอดนิยม\n", + "Mon Dec 28 , 2020\n", + "ด้วยการปรับปรุงเว็บความก้าวหน้าของพีซีและความก้าวหน้าในการเล่นเกมจึงไม่มีอะไรน่าประหลาดใจที่การพนันแพร่กระจายไปยังเว็บ ในขณะนี้การออกแบบที่โดดเด่นในการใช้ประโยชน์จากเกมคาสิโนหลักของคน ๆ หนึ่งโดยไม่ต้องกังวลกับการไปเที่ยวชมคาสิโนที่ใกล้ที่สุดค้นหาสถานที่ทำงานและสิ่งจำเป็น การพนันออนไลน์นำประสบการณ์คาสิโนมาสู่บ้านของคุณเอง ในขณะที่หลายคนเปลี่ยนการเดิมพันไปที่เว็บเพื่อความสะดวกสบาย แต่คุณก็ไม่อยากจะข้ามเว็บและเก็บเงินสดไว้ที่คาสิโนออนไลน์ จำเป็นอย่างยิ่งที่จะต้องค้นคว้าข้อมูลเกี่ยวกับประตูที่เปิดอยู่สำหรับส่วนประกอบสองหรือสามชิ้นก่อนที่จะจ่ายเงินให้กับคุณ สิ่งที่คุณต้องพิจารณาคาสิโนออนไลน์ในกรณีที่มีการอำนวยความสะดวก การได้รับการอำนวยความสะดวกทำให้เกิดการปฏิบัติทางธุรกิจของพวกเขาในบรรทัดฐานที่ชัดเจน หากแนวทางเหล่านั้นถูกนำไปใช้ในทางที่ผิดและลูกค้าไม่พอใจหรือถูกโกงประเทศที่ควบคุมจะดึงรางวัลของคาสิโนไป การรู้ว่าคาสิโนที่มีศักยภาพของคุณได้รับการดูแลหรือไม่สามารถช่วยคุณในการเลือกตำแหน่งที่จะเล่นได้โดยการกำจัดสิ่งที่ไม่ได้รับการควบคุม นอกจากนี้โปรดดูที่การเชื่อมโยงความช่วยเหลือลูกค้า ค้นหาสิ่งที่กระตุ้นให้คุณต้องติดต่อกับพวกเขา คุณสามารถสำรวจการทดสอบเล็กน้อยได้ ติดต่อเจ้าหน้าที่ดูแลลูกค้าด้วยคำเชิญชวนขั้นพื้นฐานอย่างแท้จริงคุณสามารถแสดงท่าทีว่าพวกเขามีหน้าที่อย่างไรและรับรู้ว่าพวกเขาจัดการกับการชักชวนของคุณอย่างไรและพวกเขาตอบสนองอย่างรวดเร็วเพียงใด นี่เป็นการทดสอบที่ดีหากคุณมีการชักชวนอย่างแท้จริงเกี่ยวกับบันทึกของคุณและเงินสดที่คุณดูแลที่นั่น ปฏิกิริยาของพวกเขาน่าจะยอดเยี่ยมอย่างแท้จริงและทำได้อย่างไม่น่าเชื่อ พนักงานในองค์กรของลูกค้าบางคนมีตัวเลือกการพูดคุยสดที่พันธมิตรชื่นชอบอย่างแท้จริง นอกจากนี้การตรวจสอบร้านค้าตรวจสอบว่าคาสิโนออนไลน์รับรู้เงินสดของผู้เล่นอย่างไร คุณต้องเลือกหนึ่งที่เสนอขั้นตอนที่คุณยึดถือในการสร้างร้านค้า ตัวอย่างเช่นในกรณีที่คุณควรสร้างร้านค้าในบันทึกของคุณโดยใช้ Mastercard ของคุณตรวจสอบให้แน่ใจว่าแบรนด์บัตรชาร์จของคุณเป็นที่รู้จักที่นั่น มันจะทำลายโอกาสในการทำให้งงงวยในภายหลังหากคุณพบว่าการ์ดของคุณจะไม่ถูกรับรู้ ตรวจสอบหน้าตารางเวลาอย่างต่อเนื่องก่อนที่คุณจะพร้อมเล่น สำหรับตำแหน่งที่ยอดเยี่ยมของคุณมาตรฐานอีกอย่างหนึ่งที่ดึงดูดให้เว็บไซต์คาสิโนคือโบนัสต้อนรับที่พวกเขาเสนอให้กับผู้เล่นใหม่ ดูสิ่งที่เสนอให้คุณในฐานะผู้เล่นคนอื่น โดยและไม่เพียงแค่มองไปที่รางวัลสมบูรณ์ที่เสนอ; พยายามตรวจสอบว่าอะไรคือปัจจัยพื้นฐานของข้อเสนอเพื่อพักฟื้นของรางวัลทั้งหมด ข้อเสนอที่แตกต่างกันไปพร้อมกับพื้นฐานการเล่นที่ควรปฏิบัติก่อนที่คุณจะดึงรางวัลใด sagame ขั้นต่ํา ๆ กลับคืนมาได้ทั้งหมด โชคดีที่มีวิธีจัดการค้นหาข้อมูลทั้งหมดนี้ด้วยวิธีที่จำเป็นอย่างแท้จริง วิธีนั้นคือการวิเคราะห์การตรวจสอบคาสิโนออนไลน์ ต้องบอกว่าบาคาร่ามีประวัติอันยาวนานของผู้เล่นที่ค้นหารูปแบบต่างๆมากมายผ่านการประชุมของเกมและในคาสิโนบนบกจะมีสกอร์การ์ดและดินสอที่แน่นอนจำนวนมากที่สามารถเข้าถึงได้เพื่อติดตามเกมซึ่งเป็นสิ่งที่ผู้เล่นจำนวนมากใช้ อย่างเคร่งครัด\n", + "You May Like\n", + "2 years ago\n", + "เคล็ดลับและแนวทางสำหรับเกมสล็อต sank088\n", + "1 year ago\n", + "ความสุขของเว็บไซต์คาสิโนทั่วโลก\n", + "2 years ago\n", + "คำแนะนำการพนันที่สามารถเพิ่มจำนวนการแสดงของคุณได้\n", + "2 years ago\n", + "วิธีหาเงินจาก Sanook69s?\n", + "2 years ago\n", + "ร่วมทุนจากตลอดทั้งเว็บองค์กรคาสิโนออนไลน์แบบลงรายการ\n", + "1 year ago\n", + "วิธีการที่มีประสิทธิผลในการรับเกมสล็อตออนไลน์\n", + "About Jacob\n", + "Jacob is an IT expert. But when he wants to earn more on the side, he takes his phone and plays his favorite casino game. Every game is a learning process for him and he shares that through his articles.\n", + "\n", + "doc\n", + "'ร้อยพลัง' ไม่มุ่งหวังให้ทุกความคิด ความรู้ หรือความเห็น จำเป็นต้องเหมือนหรือไปในทิศทางเดียวกันเสมอ หากแต่เรามุ่งหวังว่า แต่ละพื้นที่ความคิดจะสามารถมองเห็นกันและกันจากบริบทที่แตกต่าง เพื่อนำไปสู่การแลกเปลี่ยนที่เป็นไปอย่างสร้างสรรค์บนพื้นฐานของข้อมูลที่รอบด้านและมองหาข้อเท็จจริงร่วมกันได้\n", + "\n", + "doc\n", + "มีความเข้าใจผิดหลายประการเกี่ยวกับสนามหญ้าเทียม ย้อนกลับไปในวันนี้แทนที่สนามหญ้าตามธรรมชาติของคุณด้วยสนามหญ้าสังเคราะห์ซึ่งหมายถึงการยอมแพ้ไม่ว่าจะเป็นความสะดวกสบายรูปลักษณ์สถานะและเงิน สิ่งต่าง ๆ ได้เปลี่ยนไปอย่างแน่นอน สนามหญ้าเทียมทุกวันนี้เกือบจะมาพร้อมกับทุกสิ่งที่สนามหญ้าธรรมชาติให้และอื่น ๆ อีกมากมาย\n", + "ฉันต้องการที่จะล้มล้างความเข้าใจผิดทั่วไปบางประการเกี่ยวกับสนามหญ้าสังเคราะห์โดยการทำให้ข้อเท็จจริงมีอยู่:\n", + "ความเข้าใจผิด #1: สนามหญ้าเทียมไม่ปลอดภัย\n", + "สนามหญ้าเทียมโรงเรียนเก่าเคยเกี่ยวข้องกับสารเคมีอันตรายเช่นโลหะหนักและตะกั่ว วัสดุสังเคราะห์ในปัจจุบันเช่นใบมีด PE นั้นเฉื่อยอย่างสมบูรณ์และสร้างขึ้นเพื่อให้ใกล้ชิดกับคนที่คุณรัก ผลิตภัณฑ์ ARTURF ทั้งหมดทำด้วยวัสดุที่ดีที่สุดและปลอดภัยสำหรับเด็กสัตว์เลี้ยงและสิ่งแวดล้อม\n", + "ความเข้าใจผิด #2: สนามหญ้าเทียมเป็นสิ่งประดิษฐ์\n", + "นั่นเป็นความจริง แต่ทุกวันนี้หญ้าเทียมไม่เคยดูและสัมผัสเป็นธรรมชาติมากขึ้น! พวกเขามีสีเขียวเป็นมิตรกับสิ่งแวดล้อมและคำนึงถึงสิ่งแวดล้อม ในความเป็นจริงสนามหญ้าเทียมเป็นส่วนหนึ่งของขบวนการสีเขียวที่กำลังก่อตัวทั่วโลกเพราะเราตระหนักว่าการอนุรักษ์ทรัพยากรธรรมชาติมีความสำคัญเพียงใด พวกเขาประหยัดน้ำได้หลายตันทุกวันและป้องกันการใช้ยาฆ่าแมลงที่เป็นอันตราย\n", + "ความเข้าใจผิด #3: สนามหญ้าเทียมไม่ใช่สัตว์เลี้ยง\n", + "สนามหญ้าเทียมใหม่ถูกสร้างขึ้นสำหรับสัตว์เลี้ยง ไม่เพียง แต่พื้นผิวเป็นพื้นที่ที่เขียวชอุ่มสำหรับสุนัขของคุณที่จะวิ่งเล่นรอบ ๆ แต่เทคโนโลยีที่ทันสมัยทำให้มั่นใจได้ว่าพื้นผิวที่ปราศจากกลิ่นและสะอาด สนามหญ้าเทียมจะป้องกันความเสียหายของสัตว์เลี้ยงทั่วไปเช่นหลุมที่ขุดขึ้นมาและการสึกหรอตามมาตรฐานและยังระบายน้ำได้ดีกว่าสนามหญ้าสด\n", + "ความเข้าใจผิด #4: สนามหญ้าเทียมเป็นการซื้อที่หรูหรา\n", + "เมื่อสนามหญ้าเทียมมาถึงครั้งแรกพวกเขาอาจมีค่าใช้จ่ายในการสร้างและติดตั้ง วันนี้มันตรงกันข้าม การติดตั้งสนามหญ้าเทียมช่วยให้คุณประหยัดเงินได้ในระยะเวลาอันสั้น ในเวลาน้อยกว่าสี่ปีสนามหญ้าเทียมจะจ่ายคืนเองในค่าใช้จ่ายในการรดน้ำตัดหญ้าและดูแลสนามหญ้าสด\n", + "ความเข้าใจผิด #5: สนามหญ้าเทียมยากต่อการติดตั้ง\n", + "ดูเหมือนว่ามันจะเป็นกระบวนการที่ยากที่จะแทนที่สนามหญ้าสดของคุณด้วยสนามหญ้าเทียม หลายคนหลงทางจากกระบวนการเพื่อหลีกเลี่ยง 'ปวดหัว' ของการตั้งค่า อย่างไรก็ตามผู้ติดตั้งสนามหญ้ามืออาชีพในปัจจุบันสามารถช่วยให้คุณติดตั้งได้ง่ายโดยมีความยุ่งยากน้อยที่สุด\n", + "ความเข้าใจผิด #6: คุณไม่มีต้นไม้และดอกไม้\n", + "ต้นไม้และดอกไม้สามารถปลูกในพื้นที่หญ้าเทียม แหวนต้นไม้จะต้องขุดด้วยความสามารถในการชลประทาน แต่ต้นไม้และดอกไม้มักจะปลูกในและรอบ ๆ หญ้าเทียมเช่นเดียวกับที่พวกเขาอยู่ในหญ้าแบบดั้งเดิม\n", + "ความเข้าใจผิด #7: มันหายไปตามกาลเวลา\n", + "ผลิตภัณฑ์หญ้าเทียมคุณภาพรวมสารยับยั้ง UV เข้ากับเส้นใย / เส้นด้ายเรซิน ARTURF ให้การรับประกัน UV ที่มั่นคง\n", + "ความเข้าใจผิด #8: ไม่ระบาย\n", + "หญ้าเทียมทำด้วยรูพรุน น้ำจะไหลผ่านรู ในเวลาเดียวกันเมื่อคุณวางหญ้าเทียมลงบนฐานการหนุนของหญ้า bacomes หนึ่งในชั้นของฐาน ในช่วงที่มีฝนตกหนักน้ำบางส่วนจะไหลผ่านรูที่มีรูพรุนและบางชนิดก็จะไหลไปตามหนุนของหญ้าเทียม อย่างไรก็ตามก่อนที่จะติดตั้งหญ้าเทียมคุณควรตรวจสอบให้แน่ใจว่ามีการระบายน้ำที่ดี\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "for i,text in enumerate(result_df[result_df[\"log_score\"]>40].sample(20)[\"text\"].tolist()):\n", + " print(\"doc\")\n", + " print(text)\n", + " print()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "w7uuYT3cqTkA", + "outputId": "7026b4ad-3b05-43eb-e7d4-b4326b4702a8" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "doc\n", + "ข่าวเว็ปไซต์ todayszaman.com – ในปีการศึกษา 2554-2555 นี้ มหาวิทยาลัยหลายแห่งในตุรกียังคงมีการห้ามนักศึกษาหญิงคลุมฮิญาบ ถึงแม้คณะกรรมการการอุดมศึกษา Higher Education Board (YOK) จะยกเลิกกฎระเบียบนี้แล้วก็ตาม\n", + "ถึงแม้สถาบันส่วนมาจะแสดงการยอมรับกฎใหม่ที่ประกาศเมื่อปี 2553 และนักศึกษาสามารถคลุมฮิญาบเข้ามาเรียนได้ แต่กฏระเบียบในคู่มือการรับนักศึกษาภาคฤดูร้อนของศูนย์ Student Selection and Placment (OSYM) ยังคงระบุให้นักศึกษาต้องถอดฮิญาบ เมื่อมาลงทะเบียน เป็นเหตุให้นักศึกษาในมหาวิทยาลัยออกมาประท้วงในเรื่องนี้\n", + "ปัจจุบันบางมหาวิทยาลัยในกรุงแองการ่า อาทิ มหาวิทยาลัยเทคนิคตะวันออกกลาง ม.แองการ่า (ODTU) ม.Hacettepe ม.กาซี, ม.แองการ่า, ม.Baskent and Atilim ยังให้สิทธิ์อาจารย์ผู้สอนเป็นผู้พิจารณาว่า จะอนุญาตให้นักศึกษาที่แต่งกายแบบฮิญาบเข้าห้องเรียนได้หรือไม่ โดยนักศึกษาที่คลุมฮิญาบสามารถเข้าในบริเวณมหาวิทยาลัยได้ แต่อาจไม่ได้รับอนุญาตให้เข้าในบางคณะ หรือในห้องเรียนบางวิชา\n", + "ประธานคณะกรรมการการอุดมศึกษา ออกแถลงการณ์เมื่อเดือนมีนาคม พ.ศ. 2553 เตือนมหาวิทยาลัยที่ยังคงมีพฤติกรรมห้ามนักศึกษาคลุมฮิญาบเข้าห้องเรียน ว่า จะตั้งคณะกรรมการสอบสวนกรณีดังกล่าว และย้ำว่า นักศึกษาจะต้องไม่ถูกไล่ออกนอกห้องเรียนเพราะการคลุมฮิญาบ และหากมีกรณีเช่นนี้เกิดขึ้น ทางมหาวิทยาลัยต้องทำรายงานเข้ามายังกระทรวงทันที\n", + "ผศ.หญิง Yesim Yalcin Mendi อาจารย์คณะเกษตรในมหาวิทยาลัย Cukurova ในเขตอะดาน่า กล่าวกับสื่อเมื่อวันที่ 28 กันยายนว่า ในเมื่อมหาวิทยาลัยยังให้สิทธิ์แก่อาจารย์ในการพิจารณา เธอก็จะใช้สิทธิ์นั้นและไม่ยอมให้นักศึกษาที่คลุมศีรษะเข้ามาในห้องเรียน\n", + "อาจารย์ Yesim Yalcin Mendi มีพฤติกรรมแปลกๆ กล่าวคือ เธอจะเข้าไปซักถามประวัตินักศึกษาที่คลุมฮิญาบว่า บ้านอยู่ที่ไหน หรืออยู่กับใคร ทั้งนี้เธอให้เหตุผลว่า เธอต้องการทราบเบื้องหลังของนักศึกษาที่คลุมฮิญาบว่า ได้รับการสนับสนุนด้านเงินค่าใช้จ่ายจากองค์กรศาสนาใดหรือไม่\n", + "https://news.muslimthaipost.com\n", + "บริการเวลาละหมาดติดเว็บ ทั่วไทย (คลิก)\n", + "มาแรงรอบสัปดาห์\n", + "อัพเดทล่าสุด\n", + "ชารุค ข่าน ดาราดังทำอุมเราะฮ์ แต่เจอวิจารณ์กระหึ่ม?\n", + "ดาราบอลลีวู้ดคนดัง ชารุค ข่าน เดินทางทำอุมเราะฮ์ แต่เจอเสียงวิจารณ์กระหึ่ม เพราะอะไร?...\n", + "สุดชั่ว! ทำลายอัลกุรอาน-ล่ามโซ่แขวนหน้ามัสยิด\n", + "เกิดเหตุผู้ไม่หวังดีทำลายอัลกุรอานและนำล่ามโซ่ แขวนหน้ามัสยิดในสต็อกโฮล์ม...\n", + "ซาอุฯฮึด! ยื่นเสนอตัวเป็นเจ้าภาพ แข่งฟุตบอลหญิงเอเซียนคัพ (AFC)\n", + "สหพันธ์ฟุตบอลแห่งซาอุดีอาระเบีย (SAFF) ได้ยื่นข้อเสนออย่างเป็นทางการเพื่อขอเป็นเจ้าภาพในการแข่งขันฟุตบอลหญิงเอเซียน คัพ 2026...\n", + "อินโดนีเซียเล็งจำคุกคู่รักมีเซ็กก่อนแต่ง\n", + "ส.ส.อินโดนีเซีย คาดว่า จะผ่านกฎหมายอาญามาตราใหม่ ที่จะลงโทษจำคุกคู่รักที่มีเพศสัมพันธ์โดยไม่ผ่านการแต่งงาน รวมทั้งกฎหมาย...\n", + "ระทึก! กลุ่มติดอาวุธโจมตีสถานทูตปากีสถานในอัฟกานิสถาน\n", + "เกิดเหตุ กลุ่มติดอาวุธโจมตีสถานทูตปากีสถานในอัฟกานิสถาน อุปทูตปากีสถานประจำอัฟกานิสถาน ปลอดภัยจากเหตุการณ์สถานทูตในกรุงคาบูล...\n", + "กลุ่มรณรงค์เพื่อสันติอิสราเอล ถูกต้านหลังเยือนเขตเวสต์แบงก์\n", + "กลุ่มรณรงค์เพื่อสันติชาวอิสราเอล ถูกกลุ่มขวาจัดต่อต้าน หลังเดินทางเยี่ยมชาวปาเลสไตน์ในเฮบรอน เมืองที่ใหญ่ที่สุดในเขตเวสต์แบงก์...\n", + "ซาอุฯ พบแหล่งก๊าซธรรมชาติใหม่ 2 แห่ง\n", + "บริษัทซาอุฯ ของซาอุดิอาระเบียได้ค้นพบแหล่งก๊าซธรรมชาติใหม่ 2 แห่ง ที่...\n", + "ทนายปาเลสไตน์ ถูกอิสราเอลสั่งเนรเทศไปฝรั่งเศส\n", + "ทนายปาเลสไตน์ ถูกอิสราเอลสั่งเนรเทศไปฝรั่งเศส หลังเพิกถอนถิ่นที่อยู่ ข่าวที่เขาจะถูกเนรเทศเป็นเรื่องที่น่าสะพรึงกลัวมาก...\n", + "ทำไม \"ร้านขายผ้าคานธี\" บนถนนพาหุรัดถึงเหมาะกับมุสลิมะห์\n", + "ทำไมร้านขายผ้าคานธีของเราถึงเหมาะที่จะเป็นเป้าหมายหนึ่งสำหรับมุสลิมะห์ที่กำลังมองหาผ้าพรีเมียมและหรูหราท่ามกลางร้านขายผ้ามากมายบนถนนเส้นนี้...\n", + "ครั้งแรก สถิติมุสลิมเพิ่มขึ้นในอังกฤษ-เวลส์\n", + "ครั้งแรก ประชากรในอังกฤษและเวลส์ ที่ระบุว่าเป็นคริสเตียน ลดต่ำลงเกินครึ่ง...\n", + "สหรัฐฯ อนุมัติขายอาวุธมูลค่า 1 พันล้านดอลล่าร์ให้กาตาร์\n", + "หลังจากล่าช้ามาเป็นเวลานาน รัฐบาลโจ ไบเดน ของสหรัฐอเมริกาอนุมัติข้อตกลงการขายอาวุธให้กับกาตาร์ โดยอาวุธดังกล่าวจะเป็นอากาศยานไร้คนขับ หรือโดรน มูลค่า 1 พันล้านดอลล่าร์...\n", + "ซาอุฯ เล็งขยายสนามบินริยาดขนาดใหญ่\n", + "เจ้าชายโมฮัมเหม็ด บิน ซัลมาน มกุฎราชกุมารแห่งซาอุดิอาระเบีย ประกาศถึงแผนการเปลี่ยนสนามบินริยาดให้เป็นศูนย์กลางการบินขนาดใหญ่...\n", + "งานแต่งมุสลิม อุละมะอฺอินเดียสั่งห้าม 3 อย่างนี้ ละเมิดปรับหนัก!\n", + "อุละมะอฺอินเดียสั่งห้ามการเต้นรำ เปิดเพลง และเล่นพลุไฟในงานแต่งงานมุสลิม ละเมิดปรับหนัก!...\n", + "เรื่องถึงศาลแล้ว! เหตุตร.อินเดียไม่คืนกุญแจมัรกัสให้อิหม่าม\n", + "เรื่องถึงศาลแล้ว หลังตำรวจอินเดียไม่ยอมคืนกุญแจมัรกัสให้อิหม่าม โดยอ้างว่า....\n", + "อิหร่านชื่นชมกาตาร์ เชิดชูคุณค่าอิสลามในฟุตบอลโลก 2022\n", + "ประธานาธิบดีอิหร่านชื่นชมกาตาร์ กล่าวยกย่องกาตาร์ สำหรับความพยายามในการให้เกียรติต่อคุณค่าของอิสลาม เนื่องจากกาตาร์เป็นประเทศอาหรับประเทศแรก...\n", + "นักดับเพลิง มุสลิม-ยิว ฟ้องศาลสั่งห้ามไว้เครา\n", + "พนักงานดับเพลิงชาวมุสลิมและชาวยิวในวอชิงตัน ฟ้องขอให้ผู้พิพากษาตัดสินกรณีฝ่ายบริหารเมืองออกนโยบายห้ามพวกเขาไว้หนวด-เครา โดยว่า...\n", + "ฟุตบอลโลก 2022 ฟัตวาผู้นำซาลาฟีย์ในอียิปต์ ถกเดือด!\n", + "คำฟัตวาเกี่ยวกับฟุตบอลที่ออกโดยผู้นำแนวคิดซาลาฟีในอียิปต์เมื่อเร็ว ๆ นี้ ทำให้เกิดการถกเถียงอย่างร้อนแรง ในช่วงเวลาที่ชาวอียิปต์หลายแสนคนกำลังติดตามการแข่งขันฟุตบอลโลกอย่างจริงจัง...\n", + "อ้างเหมือนมัสยิด ส.ส.อินเดียสั่งทุบโดมบนป้ายรถเมล์\n", + "ส.ส.พรรครัฐบาลอินเดียสั่งทุบโดมที่สร้างบนป้ายรถเมล์สร้างใหม่ อ้างว่าทำให้เหมือนมัสยิด...\n", + "ซาอุฯ หนุน AMF ให้เยเมนกู้ 1 พันล้านดอลล่าร์\n", + "ซาอุดิอาระเบีย สนับสนุน AMF ให้เยเมนกู้ 1 พันล้านดอลล่าร์ พัฒนาเศรษฐกิจ...\n", + "ดราม่า! ทวิตทีมฟุตบอลสหรัฐฯ แสดงธงชาติอิหร่าน มีแค่แถบสีไม่มีตรา\n", + "บัญชีทวิตเตอร์ทีมฟุตบอลสหรัฐอเมริกา แสดงภาพธงชาติอิหร่าน ที่มีแค่แถบสีแต่ไม่มีตราสัญลักษณ์ตรงกลาง...\n", + "มัสยิดยอร์กได้รับรางวัลระดับชาติครั้งแรก ด้านบริการมุอัลลัฟ\n", + "มัสยิดเมืองยอร์ก และศูนย์อิสลามใน Tang Hall ได้รับรางวัล ‘Best convert Support’ โดยพิธีมอบรางวัลมีขึ้นที่งานประจำปี...\n", + "เหตุจลาจล หลังทีมโมร็อกโกชนะเบลเยียม 2:0\n", + "เกิดการจลาจลในเบลเยียมและเนเธอร์แลนด์ หลังทีมโมร็อกโกชนะเบลเยียม 2:0...\n", + "ความขัดแย้งในอิหร่าน แผ่เข้าแข่งฟุตบอลโลกที่กาตาร์\n", + "ความวุ่นวายทางการเมืองในอิหร่านแผ่เงาเข้ามาครอบคลุมการแข่งขันฟุตบอลโลกนัดที่ 2 ที่ทีมชาติอิหร่านพบกับทีมชาติเวลส์....\n", + "ปธน.เอมิเรตส์-กษัตริย์จอร์แดน หารือขยายความร่วมมือในอาบูดาบี\n", + "ประธานาธิบดีสหอารับเอมิเรตส์ กับ กษัตริย์อับดุลเลาะฮ์ ที่ 2 แห่งจอร์แดน หารือเพิ่มความแข็งแกร่งในความสัมพันธ์ระหว่าง 2 ประเทศ ...\n", + "ตอลิบันลงโทษเฆี่ยนครั้งแรก หลังว่างเว้นมา 32 ปี\n", + "ตอลิบันใช้ชาริอะฮ์ลงโทษเฆี่ยนผู้กระทำผิด นับเป็นครั้งแรกในอัฟกานิสถานหลังว่างเว้นมา 32 ปี...\n", + "รู้กันหรือไม่? ลูกฟุตบอลโลก 2022 ผลิตในอินโดนีเซีย\n", + "รู้กันหรือไม่ ลูกฟุตบอลที่ใช้อย่างเป็นทางการในฟุตบอลโลก 2022 ผลิตในอินโดนีเซีย...\n", + "FIFA ห้ามแฟนบอลอังกฤษ สวมพร็อพชุดครูเสด \"อาจดูหมิ่นมุสลิม\"\n", + "ฟีฟ่าแจ้งให้แฟนบอลชาวอังกฤษทราบว่า พวกเขาไม่ควรสวมชุดพร็อพเลียนแบบครูเสด มาชมฟุตบอลโลกนัดที่จะแข่งในวันที่ 25 พฤศจิกายน ซึ่งเป็นคู่ระหว่างสหรัฐกับอังกฤษ...\n", + "มาเลเซีย ประชุมปลดล็อกเลือกนายกรัฐมนตรี\n", + "ประมุขแห่งรัฐทั้ง 8 ของมาเลเซีย ประชุมนัดพิเศษร่วมกับสมเด็จพระราชาธิบดี ที่พระราชวังอิสตานา เนการา เพื่อหารือในการแต่งตั้งนายกรัฐมนตรี...\n", + "อันวาร์ อิบรอฮีม ขึ้นเป็นนายกฯมาเลเซีย รอคอยกว่า 20 ปี!\n", + "รอคอยกว่า 20 ปี ที่ประชุมสุลต่านผู้นำแห่งรัฐดัน อันวาร์ อิบรอฮีม ขึ้นตำแหน่งนายกมาเลเซีย คนที่ 10...\n", + "ทีมเยอรมนีปิดปากถ่ายรูป ประท้วงฟีฟ่าห้ามหนุนรักร่วมเพศ\n", + "ทีมเยอรมนีปิดปากถ่ายรูปหมู่ ประท้วงฟีฟ่าห้ามสวมปลอกแขนที่สนับสนุนรักร่วมเพศ...\n", + "ฟุตบอลโลก 2022 ชาวปาเลสไตน์ใช้โอกาส เรียกร้องให้สนใจปัญหา\n", + "ชุมชนชาวปาเลสไตน์ขนาดใหญ่ในโดฮารู้ดีว่า ทั่วโลกกำลังให้ความสนใจในการแข่งขันฟุตบอลโลก 2022 ที่กาต้าร์ และนี่เป็นโอกาสสำคัญที่พวกเขาไม่ได้รับบ่อยนัก ...\n", + "เปิดฉากงาน “ฮาลาลมหานคร” ซีคอนสแควร์ ศรีนครินทร์\n", + "เปิดฉากงาน “ฮาลาลมหานคร” ซีคอนสแควร์ ศรีนครินทร์ มหกรรมอาหารฮาลาลยิ่งใหญ่แห่งปี จัดเต็ม 11 วัน...\n", + "by Mnet\n", + "Copyright © 2018 Muslimthaipost. All rights reserved.\n", + "https://www.apscuf.org/slot-gacor/slot gacorslot onlineslot gacorslot gacorslot gacorslot gacorslot gacorhttps://bxartsfactory.org/slot-gacor-maxwin/https://www.splayce.eu/slot-pulsa/https://esign.bogorkab.go.id/vendor/bin/https://snip.eng.unila.ac.id/wp-content/uploads/slot-gacor/http://desa-bolali.klatenkab.go.id/files/slot-gacor/https://www.jurnal.stimsurakarta.ac.id/public/journals/https://kobar.umkm.kalteng.go.id/files/slot-gacor/https://www.uniqhba.ac.id/assets/slot-gacor/https://www.staipibdg.ac.id/-/slot-online-gacor/https://disdagperin.bekasikota.go.id/slot-gacor/https://journal.widyatama.ac.id/slot-gacor/https://stis.ac.id/slot-gacor/https://gradosyposgrados.ucjc.edu/https://ejurnal.iainlhokseumawe.ac.id/public/slot-deposit-pulsa/ https://sshj.in/public/slot-deposit-dana/https://mbmscience.com/public/slot88/situs slot gacorhttps://peshawarhighcourt.gov.pk/slot-gacor/https://www.doutoresdoexcel.com.br/-/slot-gacor/https://mccm.ptcer.pl/slot-demo/https://academconsult.ru/slot-gacor/https://nje.org.na/slot-deposit-dana/https://journals.tma.uz/slot-gacor/https://muru.com.co/slot-deposit-pulsa/https://coresdaterra.com.br/slot-gacor/https://sasurie.com/slot-gacor/https://thejrns.org/slot-gacor/http://a0729171.xsph.ru/https://zombiigrice.com/slot-gacor/https://ijohmn.com/public/slot-gacor/https://www.kuhoo.com/wp-content/uploads/slot-deposit-dana/http://clc.cet.edu/judi-bola/https://www.ijmaberjournal.org/slot-gacor/https://ijorces.org/slot-gacor/https://virtusclean.com/slot-online/https://modernacademy-journal.synceg.net/slot-gacor/https://artescienza.org/wp-content/uploads/slot-gacor/https://journal.icter.org/public/slot-gacor/https://rumosdainformacao.ivc.br/5unsur3/https://dailyexpresstop.com/https://livepublicnews.com/https://cosy.univrab.ac.id/slot-online/https://www.unaki.ac.id/togel88/https://staialakbarsurabaya.ac.id/slot-online/https://iat.alfithrah.ac.id/slot-gacor/https://krti.unesa.ac.id/slot-deposit-pulsa/https://scuto.co.id/slot-online/http://jurnal.umsu.ac.id/public/\n", + "\n", + "doc\n", + "เพื่อสร้างประสบการณ์นำเสนอคอนเทนต์ที่ดีให้กับท่าน รวมถึงเพื่อจัดการข้อมูลส่วนบุคคลเพื่อให้ท่านได้รับประสบการณ์ที่ดีบนบริการของเว็บไซต์เรา หากท่านใช้บริการเว็บไซต์นี้ต่อไปโดยไม่มีการปรับตั้งค่าใดๆ นั่นเป็นการแสดงว่าท่านอนุญาตยินยอมที่จะรับคุกกี้บนเว็บไซต์และนโยบายสิทธิส่วนบุคคลของเรา\n", + "\n", + "doc\n", + "หากคุณเป็นธุรกิจในปากช่องหรือนักท่องเที่ยวที่เดินทางผ่านปากช่อง – สยาม.ทีวี อนุญาตให้คุณอัปโหลดวิดีโอของคุณ\n", + "สำหรับนักเดินทาง: ปกป้องความทรงจำในชีวิตของคุณจากการเดินทางสู่ปากช่องของคุณด้วยการอัปโหลดวิดีโอของคุณไปยัง Siam.TV และแบ่งปันความทรงจำการเดินทางของคุณกับเพื่อน ๆ สร้างผู้ชมการเดินทางของคุณผ่านประเทศไทย\n", + "สำหรับธุรกิจ: โปรโมตธุรกิจของคุณในปากช่องไปยังผู้ชมทั่วโลกของคนที่รักประเทศไทยโดยอัปโหลดไปที่ Siam.TV การอัปโหลดฟรีและวิดีโอของคุณจะถูกบันทึกไว้ตลอดชีวิต ดังนั้นทุกวัน วิดีโอของคุณสามารถเปิดเผยต่อผู้ที่เรียนรู้และค้นคว้าเกี่ยวกับประเทศไทย\n", + "\n", + "doc\n", + "คลิปสวิงกิ้ง VIP ความสุขทางเพศสัมพันธ์คนเราไม่เหมือนกัน ผัวโทรจ้างทีม SWG มารุมเย็ดเมียตัวเอง ดูเธอมีความสุขมากๆ\n", + "19 Views0 Comments0 Likes\n", + "การ์ตูนโป๊ล้อเลียน (สคูบี้ดู Scooby doo porn) เพื่อนสนิทสุดซี้สาวแว่น จับชักควยแล้วโม๊คก่อนจะเย็ดกันจนน้ำแตก E Hentai เสียงครางอย่างเสียว\n", + "13 Views0 Comments0 Likes\n", + "คลิปเสี่ยเย็ดสาวรับงานN มาแล้วสาวสวยรับงานเอ็นโดนเสี่ยพาไปต่อในโรงแรมเอาสุดมันส์หีโหนกสวยซะด้วย\n", + "26 Views0 Comments0 Likes\n", + "คลิปหลุดทางบ้าน คู่รักแต่งงานใหม่จัดในอ่างอาบน้ำเย็ดท่าหมา หน้าอกใหญ่ยาน\n", + "33 Views0 Comments0 Likes\n", + "หนังโป๊ออนไลน์ เธอเป็นคนเซ็กจัด ชอบให้เลียหี หีสวยแบบนี้ใครก็อยากเลียให้ค่ะ\n", + "27 Views0 Comments0 Likes\n", + "อมควยมิดด้ามเย็ดทีหีกระจายร้องลั่นบ้านเลย\n", + "45 Views0 Comments0 Likes\n", + "คำค้นหา\n", + "คลิปหลุดหนังavหนังโป๊ญี่ปุ่นหนังโป๊ไทยช่วยตัวเองหนังxหนังโป๊คลิปโป๊เย็ดคลิปนักศึกษาหีชักว่าวคลิปสวิงกิ้งxxxน้องแนทเลสเบี้ยนคลิป18นมใหญ่pornเลียหีสาวใหญ่xvideoyoujizzดูหนังโป๊เย็ดหีเกย์ควยหีสวยหนังโป๊ออนไลน์คลิปเกย์หนังxxxpornhubหนังyoupornหนังxญี่ปุ่นthaipornxvideosเงี่ยนดูหนังโป๊ออนไลน์หีใหญ่pornxxxเอากันro89xxxญี่ปุ่นporntubexhamsterthaixxxxxxxดูหนังxxxเย็ดกันสาวไทยredtubejapanxxxwww.heedum.compornhdx99bbแตกในbeegไทยsexนักศึกษาxnxxเย็ดกับแฟนหีนักศึกษาน่าเย็ดขย่มควย18+อมควยjizznuvidตัวเล็กหีไร้ขนนมน่ารักxxtube8โชว์xxx18avvideoดูดควยขายหีxvdoหนังโป้ใหม่rโม๊กควยdetubetubthaiเกvideosหนังเกย์agayxxxhardsextubethreesome\n", + "\n", + "doc\n", + "ดาวน์โหลดไม่จํากัดจํานวน PSP เกมและภาพยนตร์ คุณเป็นหนึ่งในล้านของชาวอเมริกันที่เพิ่งตัดสินใจที่จะเปลี่ยนจากสมาชิก 211 ราคาแพงเป็นเพียงหนึ่งที่ช่วยให้ผู้ใช้เพื่อดาวน์โหลด Precision drives PSP Movies และเนื้อหาเพิ่มเติมของ PSP สมาชิกเว็บไซต์ ถ้าคุณได้ใช้มันเชื่อผมเพราะมันเป็นประสบการณ์ที่มีความหมายมากที่สุดที่คุณเคยมี โปรดมั่นใจได้ว่าคุณจะไม่ผิดหวังหรือแม้แต่น้อยผิดหวังถ้าคุณตัดสินใจที่จะจ่ายค่าใช้จ่ายเพียงครั้งเดียวกับหนึ่งในผู้ให้บริ พวกเขาจะไม่ใช้คุณหรือหลอกคุณในทางที่เป็นไปได้ สล็อตแตกง่าย pg พวกเขาจะยังช่วยให้คุณและสนับสนุนการแก้ไขปัญหาใดๆที่คุณอาจพบหรือปัญหาที่คุณอาจพบในการดาวน์โหลดเกม PSP และภาพยนตร์ แม้ดิบ 19-design ทนทานและมีแนวโน้มที่จะสุดท้ายเป็นเวลานาน ดังนั้นเรามาทบทวนสิ่งที่เราได้กล่าวถึงข้างต้น\n", + "เว็บตรงสล็อต แตกง่าย\n", + "เงินสำรองการออกแบบเพียงอย่างเดียวจะเพียงพอที่จะดึงดูดทุกคนที่สามารถใช้พวกเขาใน PSP ฉันแน่ใจว่าทุกคนที่ได้รับพวกเขาจะพูดว่าเพื่อนฉันมักจะเพลิดเพลินกับดิสก์เหล่านั้นมันไม่ได้ทำให้รู้สึกใดๆที่พวกเขามีเครื่องมือมากมาย สล็อตทุนน้อย แตกง่าย มันเป็นจริงขนาดเล็กมากและพกพาสำหรับ PSP จริงเงินสำรอง บ่อยครั้งที่คุณอาจจะมีปัญหาเพราะคุณอาจเป็นสมาชิกใหม่และไม่รู้จะทำยังไง ผู้ที่เป็นประโยชน์จะแนะนำคุณผ่านกระบวนการต่างๆเช่นการสร้างบัญชีผู้ใช้ของคุณเองเข้าร่วมเว็บไซต์สร้างโปรไฟล์สมาชิกของคุณและเชื่อมต่อกับอินเทอร์เน็ตราคาประหยัด ราคาสมเหตุสมผลมาก หลังจากที่คุณจ่ายค่าสมาชิกที่เหมาะสมมากคุณจะสามารถดาวน์โหลดฟรีใดๆ PSP เกมหรือภาพยนตร์ ไม่มีค่าใช้จ่ายเพิ่มเติมสำหรับสิ่งที่คุณทำหรือซื้อ นี้เป็นหนึ่งในแง่มุมที่น่าสนใจที่สุดของเว็บไซต์ คุณจะพบว่าเว็บไซต์อื่นๆมีการเปลี่ยนแปลงราคา ที่นี่คุณจะพบว่าราคาสมเหตุสมผลมาก\n", + "สล็อตpg แตกง่าย\n", + "สำรองทางเทคนิค สล็อตแตกง่ายวอเลท คุณมีแนวโน้มที่จะได้รับการสนับสนุนทางเทคนิคจากเว็บไซต์นี้มากกว่าเว็บไซต์อื่นๆ เมื่อใดก็ตามที่คุณมีความกังวลใดๆคุณจะพบใครบางคนที่มักจะช่วยให้คุณบริษัท เป็นหนึ่งในเว็บไซต์ที่ได้รับความนิยมมากที่สุดและนั่นคือเหตุผลที่ดี พวกเขามีการบริการลูกค้าที่ดีที่สุดในธุรกิจอื่นๆ คุณมีแนวโน้มที่จะได้รับในการติดต่อกับใครบางคนที่จะถามคำถามและยืนยันว่าพวกเขามีความสนใจในการช่วยให้คุณ พนักงานขายของพวกเขาเป็นประโยชน์อย่างมากดังนั้นไม่ต้องเสียเวลาและเงินของคุณ ฉันได้เห็นเกือบทุกเว็บไซต์ดาวน์โหลด PSP และฉันแน่ใจว่ามันจะดีที่สุด พวกเขายังมีเทคโนโลยีที่ช่วยให้คุณได้อย่างรวดเร็วและง่ายดายโอนดาวน์โหลดเกม PSP มันเป็นมากกว่าแค่เกม มีเกมมากขึ้นในเว็บไซต์นี้เพื่อดาวน์โหลด นอกจากนี้คุณยังสามารถค้นหารายการโทรทัศน์ที่สมบูรณ์และซอฟต์แวร์ PSP ใหม่ล่าสุดและเพลงบนเว็บไซต์ของพวกเขา เว็บตรง แตกง่าย 2022 เมื่อเร็วๆนี้พวกเขายังให้คุณเข้าถึงเพลงของพวกเขาใน PSP คุณต้องปรึกษารหัสสมาชิกของคุณเพื่อดาวน์โหลดเพลงแต่เพียงไม่กี่คลิกไม่ใช่แค่ PSP ภาพยนตร์พวกเขายังช่วยให้คุณสามารถดาวน์โหลดภาพยนตร์และรายการโทรทัศน์อื่นๆเช่นเว็บไซต์ดาวน์โหลดอื่นๆแต่พวกเขามีตัวเลือกที่ดีกว่า คุณจะพบโปรแกรม PS3 และคุณยังสามารถดาวน์โหลดรายการโทรทัศน์ที่คุณชื่นชอบกับ PSP อะแดปเตอร์ฉันขอแนะนำตัวเลือกนี้ ไม่เพียงแต่คุณสามารถบันทึกเงินแต่ยังประหยัดเวลาในการค้นหา UMD สำหรับภาพยนตร์\n", + "\n", + "doc\n", + "นี้โลกที่มนุษย์และมอนส์เตอร์อยู่ด้วยกันโดยที่ไม่ค่อยลงรอยกันเท่าใหล(แต่ก็ไม่ใช่ทั้งหมด) แต่มีมหาวิทยาลัยสองแห่งติดกันที่เป็นของมนุษย์ และมอนส์เตอรติดกัน การเจอกันของมนุษย์และมอนส์เตอรคู่นี้จะเป็นไง\n", + "\n", + "doc\n", + "ไหมขัดฟัน ถือเป็นหนึ่งตัวช่วย หนึ่งตัวเลือกสำคัญในการดูแลเอาใจใส่สุขภาพฟันและช่องปากได้ เพราะไหมขัดฟันช่วยในเรื่องของการทำความสะอาด -ขจัดเศษอาหารติดค้างที่ติดตามร่องฟัน ซอกฟัน ที่ขนของแปรงฟันซอกซอนเข้าไปไม่ถึง หรือการแปรงฟันที่ไม่ถูกวิธี แต่เชื่อว่ามีหลายคนที่ไม่เคยใช้ไหมขัดฟัน อาจเพราะคิดว่าไม่จำเป็น หรือเคยได้ยินว่า หากใช้ไหมขัดฟันบ่อยๆ จะทำให้ฟันห่าง...เพื่อคลายความกังวลใจในการใช้ไหมขัดฟัน สุขภาพดีจึงหาคำตอบข้อสงสัยที่ว่า ใช้ไหมขัดฟัน ขัดฟันบ่อยๆ ทำให้ฟันห่างจริงหรือไม่ พร้อมวิธีในการดูแลสุขภาพช่องปากมาฝากค่ะ\n", + "ใช้ไหมขัดฟันบ่อยๆ ฟันห่างจริงหรือเปล่า?\n", + "ไหมขัดฟันทำมาจากด้ายเส้นเล็กๆ ที่มีความอ่อนนุ่ม และมีการเคลือบขี้ผึ้งบางๆ ไว้ด้วย ทั้งนี้ก็เพื่อให้ไหมขัดฟันสามารถรอดผ่านซอกฟันได้ง่ายขึ้น การขัดถูไปมาตามร่องฟันมีความลื่นไหลได้ดียิ่งขึ้น ซึ่งไหมขัดฟันถูกออกแบบให้มีลักษณะเป็นแผ่นบางๆ และแบนๆ เหมาะแก่การทำความสะอาดร่องฟันของคนเราอยู่แล้ว จึงไม่ต้องกลัวว่า...หากใช้ไหมขัดฟันแล้วจะทำให้ฟันห่าง หรือร่องฟันขยายกว้างมากกว่าเดิม โดยปกติแล้วฟันของคนเราแต่ละซี่ จะไม่ชิด ติด แนบสนิทกัน แต่จะมีร่องระหว่างฟันแต่ละซี่อยู่แล้ว บางซี่อาจมีระยะกว้างมากกว้างน้อยแตกต่างกัน บางคนมีปัญหาฟันเก ฟันล้ม ทำให้ร่องฟันติดกันมากกว่าปกติ การใช้แปรงฟันทำความสะอาดอย่างเดียวจึงไม่สามารถขจัดเศษอาหาร คราบต่างๆ ออกจากร่องฟันได้ ดังนั้นการใช้ไหมขัดฟันก่อน หรือหลังการแปรงฟันช่วยให้มั่นใจว่าฟันสะอาดอย่างแน่นอน โดยเฉพาะคนที่มีปัญหาฟันซ้อน ฟันเก คนที่ยังไม่ได้ถอนฟันคุด หรือคนที่จัดฟัน จำเป็นต้องใช้ไหมขัดฟันมากกว่าคนที่มีฟันเรียงตัวตามปกติ\n", + "ทำไม คนจึงไม่ชอบใช้ไหมขัดฟัน?\n", + "สาเหตุหนึ่งที่ทำให้หลายๆ คนไม่ชอบใช้ไหมขัดฟันคือ แม้จะเลือกใช้ไหมขัดฟันที่มีลักษณะอ่อนนุ่มมาก แต่บางครั้งในขณะขัดฟันด้วยไหมขัดฟัน จะมีเลือดออกมาด้วย จึงอยากทำความเข้าใจเบื้องต้นว่า หากใช้ไหมขัดฟันหรือแปรงฟันแล้วมีเลือดออกนั้น นั่นเป็นสัญญาณว่าเหงือกของคุณอาจอักเสบ หรือมีคราบหินปูนที่แข็งติดอยู่ตามร่องฟันเป็นจำนวนมาก ทำให้ไหมขัดฟันต้องเข้าไปกะเทาะเอาคราบนั้นออก เป็นเหตุทำให้เลือดออกได้\n", + "หากเป็นเช่นนั้นคุณควรเข้าพบทันตแพทย์เพื่อตรวจสุขภาพเหงือก และหินปูนเพื่อหาทางแก้ไขด้วยการขูดหินปูน หรือรักษาเหงือกที่อักเสบ แล้วค่อยใช้ไหมขัดฟันเป็นตัวช่วยในการดูแลทำความสะอาดฟัน ป้องกันการเกาะตัวของหินปูน...รับรองว่าหากคุณมีสุขภาพเหงือกดี ไม่มีหินปูนแข็งเกาะมากมายในร่องฟัน คอฟัน คุณจะไม่เจอกับปัญหาเลือดออกขณะแปรงฟัน หรือใช้ไหมขัดฟันอย่างแน่นอน\n", + "ประโยชน์ของการใช้ไหมขัดฟัน\n", + "หลายคนมองข้ามประโยชน์ของไหมขัดฟันและเห็นว่าการแปรงฟันอย่างเดียวก็เพียงพอแล้ว แต่ก่อนที่จะตัดสินใจว่า ควรใช้ไหมขัดฟันหรือไม่ อยากให้ทราบถึงประโยชน์ของไหมขัดฟันกันก่อนว่าดีต่อสุขภาพช่องปากอย่างไรบ้าง\n", + "ช่วยกำจัดเศษอาหารที่ติดตามซอกฟันออกได้อย่างหมดจด โดยเฉพาะอย่างยิ่งฟันซ้อน ฟันเก ฟันคุด หรือฟันที่ถูกจัด การแปรงฟันอย่างเดียวอาจซอกซอนได้ไม่ทั่วถึง\n", + "ช่วยป้องกันการเกิดหินปูนได้ เพราะการใช้ไหมขัดฟันเป็นประจำจะเป็นการขจัดเศษอาหาร หรือคราบจุลินทรีย์ไม่ให้เกาะตัวแข็ง จนกลายเป็นหินปูน\n", + "ช่วยป้องกันฟันผุ เหงือกอักเสบ และกลิ่นปากที่เกิดจากการหมักหมม เน่าเสีย ของเศษอาหารที่ติดตามซอกฟัน จนกลายเป็นปัญหาอื่นๆ ตามมาได้\n", + "วิธีใช้ไหมขัดฟัน\n", + "วิธีใช้ไหมขัดฟัน เริ่มจากการตัดไหมขัดฟันออกให้มีความยาวประมาณ 20 ซม. นำมาพันที่นิ้วกลางของทั้ง 2 ข้าง ทำการพันให้ตรงกลางตึง จากนั้นใช้นิ้วหัวแม่มือ และนิ้วชี้กด เพื่อบังคับทิศทางให้ไหมขัดฟัน ผ่านตามร่องฟันที่ติดกัน และผ่านลงไปจนถึงก้นร่องของเหงือก จากนั้นโอบรอบฟันไปด้านใดด้านหนึ่งแล้วทำการดึงขึ้นลง 4 ถึง 5 ครั้ง พลิกไหมขัดฟันมาอีกด้านหนึ่ง ที่เป็นฟันซี่ติดกันนั้นแล้วดึงขึ้นลงอีก4 ถึง 5 ครั้ง เมื่อครบแล้วทำการดึงไหมขัดฟันออก แล้วพันนิ้วใหม่ ทำเช่นนี้ไปเรื่อยๆ จนถึงฟันซี่ในสุดจนรอบทุกซี่และทุกซอกจนครบรอบ\n", + "จากที่ได้ทราบถึงประโยชน์และวิธีใช้ไหมขัดฟัน พร้อมคำยืนยันว่าไม่ทำให้ฟันห่างกันไปแล้ว คงทำให้หลายๆ คนเปลี่ยนใจ และมั่นใจในการใช้ไหมขัดฟันมากยิ่งขึ้น อย่าลืมว่าไหมขัดฟันเป็นตัวช่วยดูแลสุขภาพของช่องปาก ทั้งเหงือกและฟันได้เป็นอย่างดี เมื่อรู้อย่างนี้แล้ว อย่าลืมหาซื้อมาใช้กันนะคะ\n", + "\n", + "doc\n", + "คอนติเนนทอล (CONTINENTAL) คือนาฬิกาที่ไม่ใช่แค่เครื่องบอกเวลาธรรมดา ตั้งแต่ปี 1924 เป็นต้นมาที่พวกเขายืนหยัดเพื่อคุณภาพของสวิสและประเพณีของการบอกเวลารวมกับความสง่างามเหนือกาลเวลาที่เหมาะสมกับเทรนด์ในปัจจุบัน แบรนด์นี้มีชื่อเสียงยอดเยี่ยมในฐานะนาฬิกาสวิสเมด คุณภาพสูงในราคาไม่แพง เนื่องจากการเลือกใช้วัสดุที่มีคุณภาพสูง และการทดสอบเพื่อควบคุมคุณภาพอย่างระมัดระวังในกระบวนการผลิตนาฬิกาข้อมือ CONTINENTAL ทุกเรือนมาพร้อมกับมาตรฐานที่เชื่อถือได้และใช้ได้ยาวนานกับทุกโอกาส กลุ่มผลิตภัณฑ์ CONTINENTAL มีตั้งแต่นาฬิกาประดับอัญมณีสำหรับสุภาพสตรีไปจนถึงนาฬิกาสายข้อมือหนังแบบคลาสสิกและกำไลข้อมือโลหะไปจนถึงนาฬิกามัลติฟังก์ชั่นและโครโนกราฟสำหรับสุภาพสตรีและสุภาพบุรุษ ตัวเรือนทำจากสแตนเลสสตีล กระจกคริสตัลแซฟไฟร์ป้องกันรอยขีดข่วนและการกลไกที่มีความแม่นยำมาตรฐานสวิสซึ่งรับประกันความแม่นยำสูง\n", + "\n", + "doc\n", + "เรื่องราวขององค์กรมาเฟียหญิงล้วน บัตเตอร์ฟลาย เเฟมิลี่ ที่มีมาเนิ่นนานตั้งเเต่วองโกเล่รุ่นที่6 เเละจนมาถึงตอนนี้ยังอยู่ดีโดยเป็นที่ยอมรับของวองโกเล่รุ่นที่10\n", + "\n", + "doc\n", + "SUPERSLOT จัดแจงเจอกับเกมส์พนันออนไลน์แบบไหน สมัครเป็นสมาชิก สะสมเกมสล็อตออนไลน์มากมายก่ายกอง อัพเดทใหม่ 2021 น่าพิศวงเกมพนันออนไลน์สร้างรายได้ ดินแดนที่ความสนุกสนานร่าเริงเพลิดเพลินเจริญใจ ที่ทุกคนไม่สมควรละเลย บันเทิงใจกับพวกเราได้อย่างเต็มเปี่ยม เนื่องจากเว็บไซต์ของพวกเราได้ทำสะสมเกมคาสิโนออนไลน์ทุกหมวดหมู่ เกมสล็อต เกมยิงปลา จัดเตรียมไว้ให้กับทุกคนระเบิดความมันส์ ด้านในตรงนี้ที่เดียว มีครบทุกบริการ มาเว็บไซต์แห่งนี้เว็บไซต์เดียวโคตรคุ้ม!!\n", + "เกมสล็อตออนไลน์ มีวิธีการที่เล่นง่าย ฝาก-ถอนด้วยความรวดเร็วทันใจ แล้วก็ไม่มีอันตราย รองรับผ่านแบงค์ชั้นแนวหน้าของประเทศ หรือจะเลือกใช้บริการผ่านระบบ True wallet สร้างความสบายสบายสำหรับการทำธุรกรรมการคลังอีกหนทาง ที่หมดปัญหาความชักช้า ไม่ต้องรอนานอีกถัดไป ลงทะเบียนสมัครสมาชิกเล่นเกมสล็อตฟรี ตื่นตาตื่นใจไปกับเอฟเฟค ที่มีความสวยสดงดงามเป็นที่สุด เด่นเหนือจินตนาการในทุกๆเกมส์ โดยเว็บของพวกเรา ก็จะประกอบไปด้วยแบบเกมพนันจำนวนมาก ซึ่งแต่ละเกม แต่ละค่าย ก็จะมีเอกลักษณ์ที่เด่นต่างกันออกไป ขึ้นกับว่า ใครกันแน่พอใจต้นแบบไหน ก็เลือกเล่นได้เลย ลงทะเบียนสมัครสมาชิกเข้าระบบออโต้ เข้ามากรอกเนื้อหาตามแบบฟอร์มที่พวกเรากำหนดไว้ เสียเวล่ำเวลาไม่กี่นาทีเพียงแค่นั้น!\n", + "SUPER SLOT รวมแจ็คพอตแตกง่าย\n", + "SUPER SLOT เว็บไซต์เกมส์พนันออนไลน์ \\บริการเกมสล็อต ที่มีมากมายแนวมากมายๆไม่ว่าจะเป็นแถวโจร แนวการ์ตูนสวยๆแนวผลไม้นานัปการสายพันธุ์ และก็มีสีหลากหลายและยังสวยงาม แนวการสู้รบ อาหารหวานรวมมิตร พวกเราก็มีพร้อมเสิร์ฟความเพลิดเพลินให้ทุกคนได้ครบทุกชนิด เกมสล็อตแต่ละต้นแบบเกมส์ ถูกคัดสรรมาอย่างดีเยี่ยม เนื่องจากเว็บของพวกเรามีคณะทำงานผู้ที่มีความเชี่ยวชาญ และก็มากมายประสบการณ์ ชำนาญอยู่ในเว็บไซต์คาสิโนออนไลน์มาอย่างนาน ได้คัดสรรเกมส์พนันบันเทิงใจๆแล้วก็มีคุณภาพ ตระเตรียมเอาไว้ให้กับทุกคนเปิดประสบการณ์กับพวกเราโดยตรง เพลินใจไปกับตัวเกมส์ที่มีกราฟิกงดงามมากมายๆและก็มีการอัปเดตใหม่อยู่เป็นประจำทุกเมื่อเชื่อวัน เล่นเกมสล็อตออนไลน์จนกระทั่งลืมความเคร่งเครียดไปกันอย่างยิ่งจริงๆ\n", + "เตรียมความพร้อมตะลึงงันไปกับเงินรางวัลโบนัสแจ็คพอตก้อนโต รวมเกมที่จะขอดแตกง่าย แตกหนัก อัพเดทใหม่ 2021 อัตราสำหรับเพื่อการชำระเงินพนันที่มีมูลค่าสูง แล้วก็เปอร์เซ็นต์สำหรับการชนะการวางเดิมพันสูงมากมายๆให้บริการด้วยระบบอัตโนมัติ 1 วัน บันเทิงใจกับพวกเราได้ไม่มีทางหยุด บนโทรศัพท์เคลื่อนที่สมาร์ทโฟนทุกรุ่น หรือจะเล่นผ่านหน้าเว็บโดยใช้คอมพิวเตอร์แล้วก็แท็บเล็ต รองรับระบบ iOS และก็ระบบ android มีทุนเพียงแค่ 1 บาทก็เล่นได้นะ ฝากไม่มีอย่างต่ำ สำหรับมือใหม่ สบายมากมายๆสำหรับเพื่อการเข้าเล่นเกมส์สล็อตกับพวกเรา\n", + "สมัครฟรี แจ็คพอตแตกหลายครั้ง\n", + "สนุกเพลิน รับโปรโมชั่นจุใจ เครดิตฟรี บริการตรงไม่ผ่านเอเย่นต์ แล้วก็ร่วมเกมที่แจ็คพอตแตกหลายครั้งที่สุด จำต้องเว็บไซต์นี้เว็บไซต์เดียวแค่นั้น อยากได้ผลกำไรจากการวางเดิมพันไม่ใช่เรื่องยาก สมัครเป็นสมาชิกขา ไม่ต้องโลเล รายได้ดีๆมีให้ท่านตลอดทุกๆชั่วโมง ตื่นเต้นตื่นเต้นไปกับการเล่น ที่พร้อมจะพาทุกท่านไปสู่รายได้ที่มีมูลค่ามากมาย ถ้าหากคุณยอดเยี่ยมที่พึงพอใจ ต้องการเล่นเกมสล็อตออนไลน์ ลงทะเบียนเป็นสมาชิกเลย ทุกอย่างที่คุณอยากได้ ถูกใส่เอาไว้ภายในตรงนี้ที่เดียว\n", + "ลงทะเบียนสมัครสมาชิกฟรี พร้อมรับโบนัสในทันที 50% โปรโมชั่นฝากหนแรกรับโบนัสเพิ่ม โปรฝากตามขณะต่างๆรับโบนัสเพิ่ม10% โดยทันทีทุกรายการ Cash Back คืนโบนัสสูงสุด 10% ร่วมสนุกสนานกับกิจกรรมพิเศษเพื่อรับเครดิตฟรี แล้วก็สิทธิพิเศษดีๆเป็นจำนวนมาก ที่ดินพวกเราได้ตระเตรียมไว้ให้กับนักพนันทุกคน ได้เลือกรับตามความอยากเลย ด้านในเว็บไซต์ของพวกเรา มีจำนวนเงินขยาย เล่นได้เท่าใดพวกเราจ่ายทั้งหมด ยอดเป็นแสน ถอนได้เป็นแสน ยอดหลักล้าน ถอนได้หลักล้าน โปร่ใสไม่ต้องกลัว เที่ยงธรรมที่สุด\n", + "สรุป พวกเรามีเกมพนันให้ท่านได้เลือกเล่นมาก! เล่นแบบไหนให้ได้กำไร พวกเรามีแนวทางดีๆจัดเตรียมไว้ให้กับคุณได้เข้ามาพินิจพิจารณาและก็ศึกษาเล่าเรียน คนไหนกันแน่ถูกใจแบบอย่างเกมไหนเลือกเล่นได้ตามความพอใจได้เลย มีคณะทำงานรอบริการตลอด 1 วัน บริการตรงไม่ผ่านเอเย่นต์ คุณจะได้รับความปลอดภัย 100%\n", + "\n", + "doc\n", + "จะเปิดให้ร่วมทดสอบช่วงยกเว้นพื้นที่เก็บเลเวลและดันเจี้ยนที่จะทำออกมาเล็กๆนั้นจะต้องมีเนื้อเรื่องเกริ่นนำก่อนว่ามีที่มายังไงpg ทาง เข้าและของรางวัลโดยไม่ต้องแจ้งให้ทราบล่วงหน้ามาบอกเล่าให้ได้ทราบกัน\n", + "สมัครskysportเว็บตรงเราจะไม่เจอห้องกับดักอีกแล้ว\n", + "แต่สำหรับเกมตัวใหม่นี้จะเป็นเกมที่สนุกจนหยุดเล่นไม่ได้กันเลยทีเดียวห้ามพลาดด้วยประการทั้งปวง!!lavaslot888XLGAMES,ตั้งแต่เริ่มได้มีเกมอะไรเปิดมาบ้าง\n", + "เค ร เครดิต ฟรี ไม่ ต้อง ฝาก ไม่ ต้อง แชร์megavip66เกม 981kisspg30 รับ 100ฝาก 99สล็อต 777 ฟรี เครดิต 2022ที่ได้รับลิขสัทธิ์จากซึ่งเป้นตัวใหม่ฝุดๆใหม่ล่าสุดจากเน็ตมาร์เบิ้ลเกมส์คอร์ปเปิดลงทะเบียนล่วงหน้าแล้ววันนี้บนรับทรัพยากรที่มากขึ้นเมื่อเราตะลุยไปด่านที่ไกลขึ้นเกมสไตล์จีนที่กำลังได้รับความนิยมมากขึ้นกลับมาที่เรื่องเกมกัน\n", + "ทาง เข้า pg slot walletฝาก 19 รับ 100 2022autowin888xe88 สมัครเว็บ สล็อต 89pg ฝาก ถอน ไม่มี ขั้น ต่ําซึ่งเราสามารถอัพเกรดฮีโร่ได้โดยตอนนี้ที่เห็นก็มีมาแล้วสองตัวหลักๆและเกมพีซีอย่าง\n", + "ก็จะมีขวัญกำลังใจในการสู้รบและไล่บี้อีกฝ่ายได้มากขึ้นlavaslot888\n", + "ดังนั้นจัดได้ตามใจชอบเลย!pg ทาง เข้าและเมื่อมีการประกาศวันเปิดให้บริการเกมทั่วโลกออกไปรีบไปโหลดเล่นกันให้ไวเลยlavaslot888เพียงติดและเสียงพากย์ที่หายไปหลายจุด\n", + "lavaslot888แชทกระจาย!แต่เกมยังมีระบบปลีกแยกย่อยออกไปให้เหมือนกับไปทางสายสำหรับสัตว์เลี้ยงตัวนี้คงไม่มีสายอาชีพไหนเหมาะสมเป็นพิเศษระบบพลังกายประเภทป้องกัน)\n", + "ซึ่งครึ่งหนึ่งของเกมในนี้เพราะว่าตัวเกมนั้นมีการเปิดบริการมาพร้อมกับแอนดรอยด์หากไม่นับหน้าตาตัวประกอบก็ไม่มีหลุดนรกแห่งกาลเวลา,นี้ให้แข็งแกร่งขึ้นเพื่อเพิ่มพลังเซียนให้สูงขึ้นนั่นเอง\n", + "แน่นอนว่าคนเล่นจะกดกาชาเพื่อเอาขุนพลคนโปรดมาอยู่ในทีมเราได้ฝาก50รับ200ไม่ต้องทําเทริน\n", + "ซึ่งด่านนี้ดรอบของเพิ่มพลังโจมตีธาตุไฟซึ่งเป็นธาตุหลักของและสามารถสู้กันเองกับคนในต้องใช้เวลาเรียนรู้ซักหน่อยบัตรเครื่องแต่งกายแบบสุ่มระดับเรื่องราวซวยๆเอ้ยสไตล์กึ่งมุโซพร้อมเดินทางไปบนเรื่องราวสุดโรแมนติก\n", + "ไม่แปลกใจเลยว่าทำไมเกมนี้ถึงมีหลายคนให้ความสนใจกันเป็นจำนวนมากpg ทาง เข้าใครที่สนใจอย่าลืมเข้าไปติดตามความเคลื่อนไหวและร่วมกิจกรรมต่างๆได้ที่กับคนเล่นก็ทำได้ที่ปล่อยเกมส์มือถือใหม่น่าเล่นมาให้เกมเมอร์ชาวจีนได้สัมผัสกันตั้งแต่ต้นปีกับเกมส์การันตีด้วยยอดผู้เล่นกว่า\n", + "เมื่อเหล่าเริ่มตะลุยหอคอยที่ชั้นlavaslot888ก็จะมีหีบสมบัติเปิดขึ้นมาให้เราสุ่ม\n", + "แต่จะเรียกออกมาช่วยต่อสู้ได้ครั้งละกิจกรรมเก็บแต้มและมุกตลกที่สอดแทรกมาให้ได้ฮากันอยู่เรื่อยๆสำหรับช่วงท้ายๆเดือนหรือสายรูบี้แบบฟรีๆคลิกลงทะเบียนล่วงหน้าที่นี่:เด โม pgสล็อต ฟรี โบนัสเกม ตก ปลา ค่า สิ โนpg game 899\n", + "lavaslot888ทำให้คนเล่นที่อยากเห็นสามก๊กในมุมมองแตกต่างจากเกมอื่นๆเปิดหน้าเพจเว็ปไซด์สำหรับเกมส์มือถือใหม่แนวตัวเพื่อนำมาต่อสู้เวลาลงดันเจี้ยนได้แก่ Valor,โดยวิธีการปะทะนั้นก็จะมีทั้งการโจมตีปกติมีทั้งการสะสมแต้มเฉพาะตนเองและการสะสมแต้มรวมทั้งกิลด์เพื่อรับของรางวัล\n", + "ข้อมูลที่เกี่ยวข้อง\n", + "imiวอเลท\n", + "src888kiss\n", + "สมัครเว็บพนันฟรีเครดิต\n", + "แจกเครดิตฟรี300ไม่ต้องฝาก2022ฟรี\n", + "เครดิตฟรีไม่ฝากไม่แชร์\n", + "pussy888แจกฟรี100\n", + "jokergamingroma\n", + "123maxx\n", + "kiss918th\n", + "ก่อนหน้า 1 2 3 4 ต่อไป\n", + "Collect from pg ทาง เข้าkiss918 สมัคร\n", + "Copyright © 2022 sagame88เครดิตฟรี100\n", + "เครดิต ฟรี แบบ ไม่ ต้อง แชร์slot เว็บ ตรง ไม่ ผ่าน เอ เย่ นpg ทดลอง เล่น ฟรีpg slot game 999918kiss ฝาก 10 บาท รับ 100เครดิต ฟรี 100 บาท\n", + "\n", + "doc\n", + "พนัน ออนไลน์ เว็บคาสิโนแทงทุก ๆ ปีได้ผู้ใช้ใหม่เพิ่มขึ้นเรื่อย ๆ ได้อย่างไร และยังคงเป็นสีดำโดยไม่คำนึงถึงคุณภาพ และ จำนวนของการพนัน ออนไลน์ที่เกิดขึ้นกับผลของการแข่งขันกีฬา? อันที่จริงแล้ว ทุกอย่างไม่ยุติธรรมและโปร่งใสอย่างที่ผู้เล่นมือใหม่เชื่อ เราจะบอกข้อเท็จจริงที่น่าสนใจเกี่ยวกับ คาสิโนออนไลน์ ซึ่งคุณยังไม่เคยได้ยินอย่างแน่นอน ติดตามอ่านบทความมากมายได้ที่นี่ ufakickball\n", + "ผู้เล่นส่วนใหญ่แพ้อย่างแน่นอน โดยเฉพาะผู้ที่ไม่เคยเดิมพันกีฬามาก่อนเท่านั้นที่สามารถเชื่อในผลลัพธ์ที่ตรงกันข้าม และได้รับคำแนะนำใน การพนันออนไลน์ ตามโฆษณาที่เห็นในเครือข่ายเท่านั้น ไม่มีสำนักงานแห่งเดียวที่ไม่ได้ใช้งานเพื่อรอผู้เล่นมารับรางวัลสูงสุดในทุกอัตรา เพื่อประสบความสำเร็จในการพนัน\n", + "เลือกหัวข้อที่ต้องการอ่าน\n", + "พนัน ออนไลน์ เคล็ดลับการเดิมพันกีฬาออนไลน์ สำหรับผู้เล่นมือใหม่\n", + "พนันกีฬาออนไลน์ รู้ทันเจ้ามือรับแทงออนไลน์ ทำงานโดยไม่มีนักวิเคราะห์\n", + "พนัน ออนไลน์ เคล็ดลับการเดิมพันกีฬาออนไลน์ สำหรับผู้เล่นมือใหม่\n", + "แม้แต่ เว็บพนันออนไลน์ ที่ไม่มีประสบการณ์ และ อายุน้อยที่สุดก็ยังฉลาดแกมโกงกว่านักพนันรายอื่นหลายเท่า เจ้ามือรับแทงม้าเป็นมาโดยตลอด และ จะเป็นฝ่ายดำเนื่องจากปัจจัยหลายประการ หลักๆ ได้แก่ ระยะขอบ; ผู้เล่นที่ไม่มีประสบการณ์; นักวิเคราะห์มืออาชีพ (เทียบกับผู้ที่พยายามเล่นการพนัน)\n", + "อ้างอิง\n", + "เพื่อให้เข้าใจว่าคุณได้เติมเงินในธนาคารของเจ้ามือรับแทงและล้างข้อมูลของคุณแล้ว+เริ่มเก็บสถิติ จากนั้นคำถามเกี่ยวกับประโยชน์ของเกมในสำนักงานเจ้ามือรับแทงจะหายไปเองการพนัน ออนไลน์สดนั้นไม่ได้กำไรมากที่สุดสำหรับผู้เล่นเดิมพันสด ผู้เล่นหลายคนชอบที่จะเดิมพันแบบเรียลไทม์\n", + "ตัวเลือกนี้อธิบายได้ง่าย เพราะในไลน์สด คุณสามารถจับอัตราต่อรองสูงสุดสำหรับเกมหรือสถิติของการแข่งขัน แม้จะมีข้อดีที่น่าดึงดูด แต่ก็มีผู้เล่นเพียงไม่กี่คนที่คิดเกี่ยวกับระดับความเสี่ยง ท้ายที่สุดแล้วการพนัน ออนไลน์สดผู้เล่นไม่มีเวลา วิเคราะห์และ คิดทบทวนการตัดสินใจ\n", + "บ่อยครั้งที่นักพนันเห็นอัตราต่อรองสูงและเริ่มเดิมพันด้วยการวิ่ง อันเป็นผลมาจากการที่เขามักจะแพ้เสมอมือใหม่มักจะชื่นชมยินดีกับชัยชนะในสำนักงานของเจ้ามือรับแทงและชำระเงินเข้าบัญชีทันที แต่เคล็ดลับดังกล่าวมีให้เท่านั้นเพื่อไม่ให้เสียลูกค้าใหม่ของสำนักงาน และ ให้แรงจูงใจในการพนัน ออนไลน์ในปริมาณที่มากขึ้น\n", + "อ้างอิงแม้แต่ผู้เล่นที่มีประสบการณ์ก็พยายามที่จะไม่เข้าไปยุ่งกับเกมสด เพราะมันยากที่สุดในการควบคุมตนเอง และอารมณ์ของพวกเขาเกี่ยวกับเกม และความเป็นไปได้ในการคว้าชัยชนะครั้งใหญ่ ข้อผิดพลาดที่ใหญ่ที่สุดที่ผู้เล่นทำหลังจากแพ้การพนัน ออนไลน์คือการเดิมพันคืน\n", + "โดยส่วนใหญ่การพนัน ออนไลน์ดังกล่าวสามารถดำเนินต่อไปได้จนกว่าจะรวมเงินกองกลางทั้งหมดสำเร็จ เป็นผลให้สำนักงานมีกำไร และนักพนันไม่เพียงไม่ชนะ แต่ยังสูญเสียทุกอย่างที่อยู่ในบัญชีเกม หากท่ามกลางความล้มเหลวหลายครั้ง ผู้เล่นผ่าน 1-2 ครั้ง เขาได้รับความมั่นใจในความสามารถของเขา\n", + "และทำให้ใช้เงินทั้งหมดจากบัญชีอีกครั้ง คำทำนายของนักวิจารณ์กีฬาหรือนักกีฬายอดนิยมไม่ได้ดีไปกว่าคุณ พยากรณ์ ในการพนัน ออนไลน์ผู้เล่นสามารถใช้ทั้งการทำนายผลกีฬาด้วยตนเองและการทำนายผลการแข่งขันที่เลือกจากนักวิเคราะห์มืออาชีพ นอกจากนักพยากรณ์ อดีตนักกีฬา\n", + "ดาราดังในวงการบันเทิง และ นักต้มตุ๋น ก็เริ่มคาดการณ์และสร้างรายได้จากสิ่งนี้ ในทั้ง 3 กรณี การทำนายจะไม่ช่วยให้ผู้เล่นสูญเสียจำนวนเงินที่วางเดิมพัน การคาดการณ์เกี่ยวกับกีฬาไม่ได้ทำขึ้นโดยนักวิเคราะห์เท่านั้น แต่ด้วยความช่วยเหลือของซอฟต์แวร์ที่พัฒนาขึ้นเพื่อการนี้ ไม่มีโปรแกรมดังกล่าวในโดเมนสาธารณะ\n", + "มิฉะนั้น เหตุใดเราจึงต้องการงานของนักพยากรณ์เกมของนักกีฬาและเจ้ามือรับแทง?ความยากของผู้เล่นเริ่มต้นทันทีหลังจากที่เขาทำ การพนันออนไลน์ แบบสด อัตราต่อรองเปลี่ยนแปลงตลอดเวลาผู้เล่นเริ่มหลงจากเป้าหมายหลักและเดิมพันทุกอย่างไม่มีเวลาคิด มันคุ้มค่าไหม สำคัญ\n", + "เจ้ามือรับแทงสามารถเชิญนักพนันที่ประสบความสำเร็จมากที่สุดให้กับพนักงานในฐานะพนักงาน ตัวเลือกดังกล่าวจะเหมาะเป็นอย่างยิ่ง แต่ไม่มีประสบการณ์การทำงานไม่มีทางไปที่นั่นได้ เคล็ดลับ ของเจ้ามือรับแทง มีความลับใด ๆ ของเจ้ามือรับแทงม้าแน่นอนว่ามี\n", + "และเราจะบอกคุณในวิธีที่ง่าย และ เข้าถึงได้ว่าพวกเขาคืออะไรเจ้ามือรับแทงอยู่ในตำแหน่งที่ได้เปรียบเสมอสำนักงานของเจ้ามือรับแทงยังคงเป็นสีดำเสมอไม่ว่าเดิมพันของนักพนันจะเล่นหรือไม่มีเหตุผล 2 ประการ เจ้ามือรับแทงทุกคนมีอัตรากำไรขั้นต้นที่แน่นอน\n", + "ซึ่งจะถูกหักเป็นเปอร์เซ็นต์จากการพนัน ออนไลน์ของผู้เล่นใดๆ อัตราต่อรองของสำนักงานถูกกำหนดให้เป็นสีดำไม่ใช่ผู้เล่น สำคัญ! เจ้ามือรับแทงไม่ใช่บริการการกุศลที่ช่วยให้นักพนันได้รับเงินจากการเดิมพันกีฬา นี่คือสำนักงานที่ทำเงินให้กับผู้ที่ชื่นชอบการพนัน และ การพนัน\n", + "โปรโมชั่นเกมที่มีมาร์จิ้นสูงสุด เจ้ามือรับแทงไม่เพียงแต่ประเมินค่ามาร์จิ้นสูงเกินไปเพื่อผลประโยชน์ของตนเอง แต่ยังสร้างเงื่อนไขทั้งหมดสำหรับผู้เล่นในการวางเดิมพันในเหตุการณ์ซึ่งมาร์จิ้นนั้นสูงเกินสมควร ง่ายกว่า และ ถูกกว่าสำหรับสำนักงานที่จะจ่ายเงินสำหรับการพัฒนาซอฟต์แวร์\n", + "สำหรับสร้างการคาดการณ์หรือความบันเทิงออนไลน์มากกว่าการจ่ายเงินเดือนให้กับพนักงานของนักวิเคราะห์ และ พนักงานที่มีค่าอื่นๆ อัตราต่อรองที่สูงเกินจริงสำหรับการแข่งขันที่ไม่ค่อยมีใครรู้จัก ผู้เล่นที่มีประสบการณ์รู้ดีอยู่แล้วว่าสิ่งนี้เกี่ยวกับอะไร เจ้ามือรับแทงมักจะเสนอให้วางเดิมพันที่อัตราต่อรองสูง\n", + "ในเหตุการณ์ที่เป็นการยากที่จะทำนายเนื่องจากขาดข้อมูลเกี่ยวกับเกมปัจจุบัน ข้อมูลเกี่ยวกับการแข่งขันดังกล่าวอยู่ในเว็บไซต์ต่างประเทศหรือถูกฝังอยู่ในหน้าที่ 10 ของผลลัพธ์ของเครื่องมือค้นหาซึ่งแทบไม่มีใครไป อ้างอิง. ในกรณีนี้การพนัน ออนไลน์ของ เว็บคาสิโนออนไลน์ จะเล่นกับความโลภ และ ความตื่นเต้นของผู้เล่น\n", + "ซึ่งจะนำไปสู่อัตราต่อรองที่สูง และ จะไม่รบกวนการค้นหาข้อมูลที่จำเป็นมากเกินไปเพราะโดยหลักการแล้วเป็นไปไม่ได้ งาน สำนักงานทำเงินกับผู้ที่เดิมพันอย่างไร้เหตุผล นักพนันในอุดมคติสำหรับเจ้ามือรับแทงคือผู้เล่นที่ไม่มีประสบการณ์ที่ต้องการทำเงิน แต่ไม่ต้องการใช้เวลาพยายามทำความเข้าใจ\n", + "หลักการทำงานของเจ้ามือรับแทง และ กีฬาที่เขาเลือกสำหรับการพนัน ออนไลน์ ในกรณีส่วนใหญ่ นักพนันดังกล่าวเพียงแค่วางเดิมพันกับทีมโปรดของพวกเขา โดยไม่คำนึงถึงอัตราต่อรอง และ ข้อมูลสำคัญอื่นๆอีกทางเลือก 1 สำหรับนักพนันในอุดมคติที่ทำกำไรให้กับเจ้ามือรับแทงคือแฟนตัวยง\n", + "การเลือกหลายเหตุการณ์และคาดเดาผลลัพธ์ทั้งหมดโดยไม่ทำผิดพลาดแม้แต่ครั้งเดียวเป็นเรื่องยากมากสำหรับมืออาชีพที่มีประสบการณ์ในการพนัน ออนไลน์ที่ยอดเยี่ยม เราจึงนำโดยข้อเสนอโบนัสและโปรโมชั่นเงินคืนและอัตราต่อรองสูง แต่ไม่ได้เปรียบเทียบ ข้อดีทั้งหมดเหล่านี้กับความเสี่ยง เพื่อความสนุกของท่าน เรามีเกมคาสิโนมากมายรวมถึงการพนันที่น่าสนใจให้ท่านได้เลือกเล่น มาร่วมสนุกกับเราได้ที่นี่ @webufa\n", + "พนันกีฬาออนไลน์ รู้ทันเจ้ามือรับแทงออนไลน์ ทำงานโดยไม่มีนักวิเคราะห์\n", + "เวลาที่เจ้ามือรับแทงทุกรายมีพนักงานทั้งหมดของนักวิเคราะห์มืออาชีพเตรียมการคาดการณ์สำหรับกีฬาและ สร้างตัวบ่งชี้อัตราต่อรองหายไปนานแล้ว ตอนนี้สำนักงานไม่สามารถจ่ายเงินสำหรับการทำงานของพนักงานประเภทนี้ได้ เจ้ามือรับแทงใช้กลอุบายโดยใช้การคาดการณ์ที่นำเสนอในแหล่งข้อมูลที่ได้รับการพิสูจน์แล้ว\n", + "ในสาธารณสมบัติ ปรับเปลี่ยนสำหรับตัวเองและ วางไว้บนไซต์ ระบบอัตโนมัติของกระบวนการวิเคราะห์ไม่เพียงแต่ช่วยเจ้ามือรับแทงได้เป็นล้านเท่านั้น แต่ยังช่วยให้คุณกำจัด อาร์เบอร์ และ ตรวจสอบสายงาน และ เหตุการณ์ทั้งหมดได้อย่างใกล้ชิดในเวลาเดียวกันอ้างอิงลูกค้าใหม่\n", + "ผู้เล่นที่มีประสบการณ์จะถูกดึงดูดให้เข้าร่วมกิจกรรมชั้นนำด้วยอัตราต่อรองที่สูง ซึ่งในขั้นต้นจะพิจารณาจากผลกำไรของเจ้ามือรับแทง ผลลัพธ์ดังกล่าวในบางกรณีเกิดขึ้นไม่บ่อยนัก แต่มีค่าใช้จ่ายที่สำนักงานจะได้รับเงินเป็นจำนวนมาก การควบคุมบัญชีเกม ผู้เล่นที่แย่ที่สุดที่สามารถ\n", + "สร้างความเสียหายอย่างมากให้กับกระเป๋าของเจ้ามือรับแทงคือนักพนันที่มีประสบการณ์ซึ่งเชี่ยวชาญด้านกีฬาการพนัน ออนไลน์และหลักการของ คาสิโน ออนไลน์ เพื่อป้องกันไม่ให้นักพนันดังกล่าวทำลายเจ้ามือรับแทงพนัน ฝ่ายหลังมักจะหันไปใช้การจำกัดขอบเขตโดยไม่ต้องอธิบายเหตุผล\n", + "ขีดจำกัดการตัดในกีฬาเฉพาะข้อจำกัดในการพนัน ออนไลน์สามารถตัดได้สำหรับผู้เล่นคนเดียวไม่ใช่ครั้งเดียวแต่หลายครั้งติดต่อกัน จนกว่าผู้เล่นจะหยุด ฉีก สำนักงานของเจ้ามือรับแทง และ ชนะการพนัน ออนไลน์ส่วนใหญ่ที่ทำ โดยส่วนใหญ่ เจ้ามือรับแทงจะตัดข้อจำกัดในกีฬาชนิดใดชนิด 1\n", + "ซึ่งผู้เล่นสามารถหาเงินได้มากที่สุดในเวลาเดียวกันขีดจำกัดสูงยังคงอยู่ในกีฬาอื่น ๆ(ซึ่งผู้เล่นไม่เชี่ยวชาญนัก)บล็อกผู้เล่นที่ประสบความสำเร็จ เบตเตอร์ส ที่ลงทะเบียนกับเจ้ามือรับแทงควรจำสิ่งง่ายๆ เจ้ามือรับแทงไม่สนใจที่จะทำกำไรความสนใจของพวกเขาคือการทำกำไรจากคุณ\n", + "ผู้เล่นที่ชนะอย่างต่อเนื่องสามารถบล็อกได้โดยไม่ต้องอธิบายจากเจ้ามือรับแทง แม้ว่าจะมี / ไม่มีเงินในบัญชีเกมก็ตาม ทันทีที่พนักงานหรือซอฟต์แวร์ของเจ้ามือรับแทงสังเกตเห็นลูกค้าที่ “ไม่ทำกำไร” ด้วยตนเอง พวกเขาก็บอกลาเขา สำนักงานจะค้นหาเหตุผล และ วิธีต่างๆ อยู่เสมอ\n", + "วิธีเพิ่มโอกาสในการชนะที่สำนักงานคาสิโน\n", + "แม้จะรู้ความลับทั้งหมดของการพนันกีฬาออนไลน์ นักพนันก็ไม่สามารถประกันตัวเองจากการกระทำของสำนักงานเจ้ามือรับแทง และ รับประกันว่าจะได้รับรายได้ที่มั่นคงโดยการพนัน ออนไลน์ผลของการแข่งขันกีฬา แต่นักพนันสามารถทำสิ่งที่ขึ้นอยู่กับเขาเพื่อไม่ให้เกิดข้อผิดพลาดเบื้องต้นขณะเยี่ยมชม เว็บไซต์ พนันออนไลน์\n", + "ตัดสินใจเกี่ยวกับความเชี่ยวชาญของคุณกีฬาชนิดเดียวก็เพียงพอสำหรับผู้เริ่มต้น คุณไม่ควรเลือกกีฬาหลายรายการพร้อมกัน และ เหตุการณ์ทั้งหมดในสายที่เจ้ามือรับแทงเสนออัตราต่อรองสูง เป็นครั้งแรก กีฬา 1 ประเภท และ 2 ทีมโปรดก็เพียงพอสำหรับผู้เริ่มต้น หากคุณฉีดพ่นทุกอย่างพร้อมกัน\n", + "โอกาสในการชนะเจ้ามือรับแทงแทบจะเป็นศูนย์ หมดความรับผิดชอบทางการเงิน คุณไม่สามารถเดิมพันด้วยเงินทั้งหมดที่อยู่ในงบประมาณของคุณโดยหวังว่าคุณจะสามารถเพิ่มทุนของคุณได้ ภายใต้ภาระความรับผิดชอบสำหรับแบ๊งค์ของเขาด้วยจำนวนเงินที่น่าประทับใจ\n", + "ผู้เล่นจะไม่สามารถประเมินจุดแข็งของเขา หรือการโต้ตอบของอัตราต่อรองกับสถานะที่แท้จริงของเกมได้อย่างถูกต้อง หรือทำการวิเคราะห์ข้อมูลที่จำเป็นเกี่ยวกับ การแข่งขันที่จะเกิดขึ้น สำคัญ! คุณไม่สามารถจริงจังกับการเดิมพันกีฬาได้ ยิ่งคนคิดเกี่ยวกับมันมากเท่าไหร่\n", + "ขาก็ยิ่งกังวลมากขึ้นและในความบ้าคลั่งสามารถเดิมพันในสิ่งที่ผิดได้เลย การพนัน ออนไลน์ของเจ้ามือรับแทงไม่มีอะไรมากไปกว่าความบันเทิงที่สามารถสร้างกำไรและขาดทุนได้ไม่มีการค้ำประกันที่นี่ ระวังมิจฉาชีพก่อนลงทะเบียนกับเว็บเจ้ามือรับแทง ใช้เวลาศึกษารีวิวจริง\n", + "จากผู้เล่นก่อน มีประเด็นสำคัญหลายประการที่ควรคำนึงถึง เจ้ามือรับแทงไม่มีผลตอบรับเชิงบวก 100% บทวิจารณ์ที่ไม่ดีจะถูกลบออกหรือเผยแพร่บทวิจารณ์ในเชิงบวก รีวิวยาวมากจากผู้เล่น นอกจากนี้ ในกรณีส่วนใหญ่ เขาพูดเกี่ยวกับการฉ้อโกง และ จ้างคนให้เขียน แผ่นงานวรรณกรรม”\n", + "เป็นเรื่องยากสำหรับผู้เล่นที่จะจัดสรรเวลา 1 ชั่วโมงเพื่อเขียนว่าเขาพอใจกับงานขององค์กรเพียงใด เมื่อพูดถึงเว็บไซต์ของเจ้ามือรับแทง เว็บไซต์ควรมีข้อเสนอแนะในกรณีที่มีคำถามหรือสถานการณ์ที่ไม่คาดฝันเรียนรู้การจัดการธนาคารของคุณการจัดการแบ๊งค์ที่มีความสามารถเป็น 1\n", + "สรุป\n", + "ในพื้นฐานที่สำคัญที่สุดสำหรับนักพนันเมื่อเล่นในสำนักงาน มีกลยุทธ์ทางการเงินมากมายที่เป็นสาธารณสมบัติที่จะช่วยให้ผู้เล่นจัดการธนาคารได้อย่างมีประสิทธิภาพ และค้นหาตัวเลือกที่ดีที่สุดสำหรับตัวเขาเอง สำคัญ! กฎหลักเกี่ยวกับธนาคารเกมคือคุณไม่สามารถเดิมพันจำนวนมากหรือทั้งธนาคารได้ วงเงินสูงสุดของการพนัน ออนไลน์ 1 รายการต้องไม่เกินขีดจำกัด 5% ของจำนวนเงินเดิมพันทั้งหมด\n", + "Published by TheBox, in พนันออนไลน์. Tagged with พนัน ออนไลน์.\n", + "Post navigation\n", + "← การพนันออนไลน์888 เทคนิคการเดิมพัน ใครคือเจ้ามือรับแทงและพวกเขาทำอะไร เว็บไซต์พนัน วิธีเดิมพันกีฬาสำหรับผู้เล่นมือใหม่เคล็ดลับการเดิมพัน →\n", + "\n", + "doc\n", + "ฝ่ายพระยาปลัดไปด้วยเจ้าพระยานครราชสีมา แจ้งว่าอนุลงมากวาดครอบครัวก็ปรึกษาเจ้าพระยานครราชสีมาว่า จะทิ้งครอบครัวเสียไม่ไประวังรักษาเห็นจะไม่ได้ อ้ายลาวจะทำยับเยินเสียหมด เจ้าพระยานครราชสีมาก็เห็นด้วย จึ่งให้พระยาปลัดรีบมา พระยาปลัดมาถึงเมืองนครราชสีมาก็เข้าหาอนุแจ้งว่าเจ้าพระยานครราชสีมาหนีไปเมืองเขมรเสียแล้ว พระยาปลัดทิ้งครอบครัวไม่ได้จะขอตามเสด็จไปอยู่เวียงจันท์ด้วย อนุก็เชื่อก็ให้พระยาปลัดพระยาพรหมยกกระบัตรคุมครอบครัวไป พวกครัวเมืองนครราชสีมาออกเดินทางไปได้แต่วันละเล็กละน้อย ทางวันหนึ่งก็เดินถึง ๓ วัน ๔ วัน อนุให้แยกออกไปเสียเป็นกอง ๆ ตัดกำลังให้น้อยลง พระยาปลัดพระยาพรหมยกกระบัตรกรมการจึงคิดอ่านอุบายจัดหญิงสาว ๆ ให้นายทัพนายกองที่ควบคุมครัวนั้นทุกคน ไ จนชั้นแต่ไพร่จะชอบใจใครก็ไม่ว่า เห็นว่าพวกลาวกับพวกครัวสนิทเป็นอันหนึ่งอันเดียวกันเข้าแล้ว พระยาปลัดพระยาพรหมยกกระบัตรขึ้นม้ามาหาอนุที่ค่ายใหญ่ แจ้งว่าอพยพครอบครัวไปได้ความอดอยากนัก ขอมีด ขวาน ปืนสัก ๙ บอก ๑๐ บอก พอจะได้ยิงเนื้อมากินเป็นสะเบียงเลี้ยงครัวไปตามทาง อนุก็ยอมให้ ครั้นได้มีดขวานปืนไปแล้ว เดินครัวไปถึงทุ่งสัมฤทธิ์\n", + "\n", + "doc\n", + "รัชสมัยพระบาทสมเด็จพระจอมเกล้าเจ้าอยู่หัวท่ามกลางการปรับเปลี่ยนประเทศไปสู่ความเจริญในด้านต่างๆ เพื่อหลีกเลี่ยงจากการถูกล่าอาณานิคม\n", + "โชติ หญิงสาวชาวสยามผู้มีความทันสมัยเพราะเติบโตและได้รับการเลี้ยงดูให้มีความคิดของตนเองได้พบกับ มิเชล นักเขียนหนุ่มชาวฝรั่งเศสผู้ติดตามกงสุลโอบาเรต์มาดินแดนตะวันออกอันงดงามแห่งนี้\n", + "จากความไม่ชอบหน้าเริ่มแปรเปลี่ยนเป็นความเข้าใจกระทั่งความรัก\n", + "แม้เมฆหมอกแห่งความแคลงใจในตัวชายหนุ่มยังคงพาดผ่านแต่โชติก็เลือกจะซื่อสัตย์ต่อความรู้สึกในใจตนเองเสมอมา\n", + "โชติได้มีโอกาสติดตามคุณหญิงป้าผู้เป็นภริยาเอกของพระยาสุรวงษไวยวัฒน์ไปฝรั่งเศส\n", + "หญิงสาวได้ไปร่วมงานเอ็กซ์โป ณ กรุงปารีส\n", + "ณ ที่นั้นมิเชลได้เดินทางไปสมทบด้วย\n", + "ดินแดนอันสวยงามแตกต่างจากสยามแห่งนั้นช่างเป็นความทรงจำทั้งดีและร้ายที่เธอได้พบ\n", + "กระทั่งกระจ่างแจ้งในความจริงบางประการเกี่ยวกับมุมมองของผู้คนจากอารยประเทศที่มีต่อบ้านเกิดเมืองนอนของเธอ\n", + "\n", + "doc\n", + "มีการเสพติดที่หลากหลาย แต่หนึ่งในการทำลายล้างที่เป็นที่นิยมคือการเดิมพัน ผู้ติดการพนันได้หันไปใช้การขโมย การโกหก และก่อหนี้ทางการเงินและหนี้สินจำนวนมหาศาลเพื่อเลี้ยงดูการเสพติด ที่น่าตกใจที่สุดคือ การพนันถูกกฎหมายในหลายพื้นที่ของโลก\n", + "ที่นี่ยังเป็นธนาคารของเล่นสล็อตแมชชีนที่ต้องตีสำหรับผู้เล่นสล็อตที่คุณต้องการ วงล้อหมุนจริง ๆ และหากคุณโชคดีพอที่จะตีบาร์/เจ็ดชุดค่าผสม เตรียมตัวสำหรับการซื้อจากคุณ pgslot นี่อาจเป็นของขวัญที่สนุกสำหรับเด็กและผู้ใหญ่ จะไม่ต้องใช้แบตเตอรี่จึงไม่ต้องกังวลว่าจะต้องเสียเงินกับมันตลอดเวลา\n", + "ไม่ต้องสงสัยเลยว่าผู้คนสามารถปล่อยให้การพนันเข้ามาควบคุมพวกเขาโดยนำพวกเขาไปสู่เส้นทางที่เลวร้าย ผู้ติดการพนันทำให้การเลือกที่ไม่ดีและประสบผลสำเร็จ อย่างไรก็ตาม เห็นได้ชัดว่าไม่ใช่ทุกคนที่ติดการพนัน และบางคนเล่นการพนันเพื่อความตื่นเต้น คนอื่นถึงกับเล่นการพนันเพื่อทำกำไร การพนันรูปแบบเหล่านี้ผิดในสายพระเนตรของพระเจ้าหรือไม่?\n", + "การเจาะสล็อตแบบใช้มือถือนั้นมีค่าใช้จ่ายน้อยที่สุดและเว็บไซต์อินเทอร์เน็ตเหล่านี้ก็น่าใช้ หากความต้องการใช้หมัดของคุณเป็นบางครั้ง หมัดแบบใช้มือถืออาจเป็นสิ่งที่คุณควรทำ นี่ไม่ใช่ตัวเลือกที่ดีหากรายการเหล่านี้ต้องทำงานหนักมาก และมักจะไม่ใช่ข้อมูลเกี่ยวกับการเลือกหัวข้อสำหรับสำนักงาน อย่างไรก็ตามสิ่งเหล่านี้ถูกที่สุดด้วยเทคนิคสล็อตแฮนด์ที่หลากหลาย\n", + "Li-Nezha อาจเป็นเทพเจ้าแห่งการพนันของจีน เขาเป็นหนึ่งในเทพเจ้าจีนเพียงองค์เดียวที่สามารถเปิดเผยหมายเลขที่ชนะในการชิงโชค Li-Nezha อาจเป็นที่รู้จักมากกว่าในชื่อ Nataku หรือ Nata จากอะนิเมะญี่ปุ่นซึ่งเป็นเทพสงครามครึ่งมนุษย์ ในสมัยโบราณมนุษย์บูชาพระองค์เป็นเทพเจ้าแห่งการจับสลากและการพนัน\n", + "เราทุกคนชอบความรู้สึกนั้น บวกกับการพนัน เปอร์เซ็นต์ของคุณถึงขีดจำกัดนั้นสูงกว่าเกมประเภทอื่น นักพนันที่มีปัญหาไม่รู้วิธีง่าย ๆ ในการหยุดการพนันและมีส่วนร่วมอย่างเต็มที่ในภาชนะ เมื่อคุณข้ามเส้นไปแล้ว ส่วนใหญ่จะไม่มีการหันหลังกลับ นี่คือสถิติสูงสุด 5% ของนักพนันในโซเชียล คือนักพนันที่มีปัญหาหรือติดเกม กล่าวอีกนัยหนึ่ง ผ่าน 20 คน คนหนึ่งติดการพนัน เป็นข้อกังวลที่คุณไม่สามารถคลิกเมาส์ได้อย่างง่ายดาย\n", + "อีกสิ่งหนึ่งที่เพิ่งเริ่มเล่นการพนันควรจะเรียนรู้แนวทางที่คาสิโนออนไลน์ได้ทำขึ้นสำหรับการเล่นการพนันในคาสิโนของตน เว็บไซต์เกมที่ดีจะบอกคุณว่ากฎเหล่านี้มีอะไรบ้าง\n", + "\n", + "doc\n", + "คุณต้องการที่จะจับปลามากขึ้น? ฉันหมายถึงจับพวกมันจริงๆ ฟุตบอลโลก ไม่ใช่แค่ตัดมันหรือจับพวกมันเหมือนของชิ้นเล็กๆ แสนอร่อย หากคุณต้องการจับปลาตัวใหญ่ วิธีเดียวที่จะทำได้คือทำอย่างถูกวิธี\n", + "ฉันจะถือว่าคุณกำลังอ่านบทความนี้เพราะคุณกำลังคิดที่จะจับปลา หนึ่งสายพันธุ์หรือทั้งหมด ดังนั้นเรามาพูดถึงวิธีการทำกัน\n", + "มีหลายวิธีในการจับปลา ฟุตบอลโลก แต่สิ่งที่ผมจะอธิบายให้คุณฟังก่อนคือ วิธีการจับปลาแบบง่ายๆ มันจะทำงานได้ดีขึ้น เร็วขึ้น และสม่ำเสมอกว่าคนอื่นๆ\n", + "สิ่งแรกที่ต้องจำคือ: จะใช้เวลามากกว่าหนึ่งหรือสองสิ่ง คุณต้องจำไว้ว่าการจับปลามีหลายปัจจัย คุณไม่สามารถแค่โยนเหยื่อลงในน้ำแล้วเรียกว่าดีได้ ที่นั่นคุณรู้ว่าคุณต้องการเหยื่อและเหยื่อล่อ สองสิ่งนี้เป็นสิ่งเดียวที่คุณต้องการหรือไม่?\n", + "พวกเขาเป็น แต่มันไม่ใช่สิ่งเดียวที่คุณต้องการ ในการจับปลาด้วยวิธีง่ายๆ คุณต้องรู้ว่าคุณใช้เหยื่อหรือเหยื่อประเภทใด รายการใดในช่วงเวลาของปี วันใดในเดือน พื้นผิวหรือความลึกของน้ำประเภทใดที่ควรทำงานได้ดีที่สุด ซึ่งเหยื่อสดหรือเหยื่อล่อสัมพันธ์กับชนิดของปลาที่ท่านต้องการจับ เป็นต้น\n", + "ฉันเคยจับปลามาก่อนด้วยเศษของที่ใช้เป็นเหยื่อล่อ เยี่ยมมาก ฟุตบอลโลก แต่เนื่องจากพวกมันเป็นเหยื่อล่อ หรือเหยื่อล่อ พวกมันไม่ได้ดีขนาดนั้นสำหรับฉัน เพราะมันเกือบจะแน่ใจว่าพวกมันจะมีผลกระทบต่อปลาที่คุณพยายามจับ จะต้องมีความสมดุล\n", + "เมื่อเวลาผ่านไป ด้วยการลองผิดลองถูก ฉันได้พัฒนารายการของสิ่งที่ฉันต้องใช้และไม่ใช้เมื่อฉันพยายามจับปลา ฉันไม่สมบูรณ์แบบและต้องใช้เวลามากในการตัดสินใจว่าสิ่งใดใช้ได้ผลและไม่ได้ผล บางครั้งก็เป็นการลองผิดลองถูก บางครั้งฉันก็ขุดลึกลงไป และบางครั้งก็ใช้ความคิดและการวางแผนอย่างรอบคอบเพื่อให้ได้ผลลัพธ์ที่ถูกต้องในเวลาที่เหมาะสม\n", + "เก็บรายการนี้ไว้ใกล้มือและคุณจะไม่มีวันลืมมัน ฟุตบอลโลก และคุณจะมีโอกาสมากขึ้นที่จะได้ผลลัพธ์ที่คุณต้องการ นี่คือสิ่งที่สำคัญที่สุดที่คุณสามารถทำได้หากต้องการจับปลาด้วยวิธีง่ายๆ\n", + "ปลาใหญ่กินปลาเล็ก ปลาตัวเล็กกินปลาตัวเล็ก นั่นเป็นเพียงวิธีที่มันเป็นและมันจะเป็นอย่างนั้น\n", + "คุณไม่สามารถจับปลาทั้งตัวใหญ่และตัวเล็กได้พร้อมกัน\n", + "คุณไม่สามารถจับปลาได้อย่างสม่ำเสมอโดยการโยนของที่พวกมันกินทุกครั้งที่ออกไปตกปลา\n", + "หากคุณกำลังหาปลาตัวเล็กด้วยเหยื่อสด ฟุตบอลโลก แสดงว่าคุณกำลังตกปลาที่ปลายคลื่นผิด คุณไม่สามารถจับอะไรที่กินเหยื่อสดได้ ถ้าคุณตกปลาด้วยเหยื่อสด ปลาตัวเล็กที่กินเหยื่อสดเป็นปลาที่คุณต้องการกำหนดเป้าหมาย ปลาที่ดีที่จะจับด้วยเหยื่อสดคือนกกระจิบ\n", + "การตกปลาเพื่อสัตว์อื่นๆ จะเปลี่ยนวิธีการจับปลาตัวเล็กของคุณ แต่ไม่ใช่ปลา สิ่งเหล่านี้คือ: ฟุตบอลโลก เหยื่อหรือเหยื่อล่อที่เหมาะสมกับชนิดของปลาที่คุณพยายามจะจับ ตำแหน่งที่ถูกต้อง ฯลฯ\n", + "หากคุณไม่สามารถจับปลาได้อย่างสม่ำเสมอด้วยสิ่งที่กล่าวมาข้างต้น คุณจะไม่ประสบความสำเร็จในการจับปลา ถ้าคุณอยู่ในหมวดนี้ ก็ถึงเวลาไปช้อปปิ้ง เรียนรู้เพิ่มเติมเกี่ยวกับการจับปลาด้วยวิธีง่ายๆ โดยใช้เคล็ดลับเหล่านี้ และคุณจะเข้าใกล้การเป็นผู้เชี่ยวชาญในการจับปลาอย่างสม่ำเสมอมากขึ้น\n", + "\n", + "doc\n", + "เมื่อพูดถึงการแทงบอลสูงต่ำ นักพนันบอลใหม่ อาจจะไม่รู้จักเท่าไหร่ คิดว่าการแทงบอลมีแค่การแทงบอลสเต็ป หรือไม่ก็แทงบอลเต็งเพียงอย่างเดียว จะว่าไปแล้วการแทงบอลสูงต่ำ ก็ไม่ได้มีความแตกต่างจากการแทงบอลเต็งเท่าไหร่นัก เพียงแค่การไม่ได้สนใจว่าใครจะเป็นฝ่ายชนะเท่านั้น หากสกอร์รวมตรงกับเรทราคาที่เราเลือกไว้ ก็จะได้เงินแล้ว สำหรับใครที่อยากจะลองเล่นบ้าง แต่ยังไม่รู้วิธีดู ราคาบอลสูงต่ำ ดูยังไง บทความนี้จะพาคุณไปทำความรู้จักเกี่ยวกับเรื่องนี้ให้กระจ่างยิ่งขึ้น\n", + "บอลสูงหรือต่ำ มีข้อกำหนดยังไง\n", + "การทายบอลสูงต่ำ คือการทายผลสกอร์รวมของเกมในนัดนั้น ว่าจะออกมาเป็นสกอร์สูงหรือต่ำ แล้วก็เลือกวางเดิมพัน สำหรับข้อกำหนดของการแทงบอลสูงต่ำ ราคาส่วนใหญ่จะถูกกำหนดเอาไว้ที่ 2-2.5 ลูก\n", + "O หรือ Over คือการเลือกแทงสูง สกอร์รวมจะต้องมากกว่า 3 ลูกขึ้นไปจึงจะชนะเดิมพัน\n", + "U หรือ Under คือการเลือกแทงสกอร์ต่ำ สกอร์รวมกันจะต้องน้อยกว่าเรทราคาที่กำหนดเอาไว้ คือไม่เกิน 3 ลูกจึงจะชนะเดิมพัน\n", + "อันนี้เป็นข้อสังเกตง่ายๆ ในเบื้องต้น แต่ปัญหาหลักก็คือว่านัพนันบางท่านไม่รู้ว่าจะเลือกแทงแบบไหนดี หรือจะเลือกสกอร์สูงหรือต่ำดี หากคุณกังวลเกี่ยวกับเรื่องนี้ เราก็มีไอเดียในการเลือกแทงมาฝาก\n", + "อยากแทงบอลสูงต่ำให้ได้เงิน มีเคล็ดลับอะไรบ้าง\n", + "1.เลือกจากราคาต่อรอง\n", + "แน่นอนว่าการแทงบอลสูงต่ำมีเรทราคาเลือกหลายอย่าง แต่เรทราคาที่คนนิยมเล่นและชนะง่ายที่สุด ก็คือเรทราคาที่อยู่ระหว่าง 2-2.5 หากคุณเพราะว่าเกมในแต่ละเกมส่วนใหญ่ มักจะยิงกันไม่เกิน 3-4 ลูกอยู่แล้ว\n", + "2.ดูฟอร์มการเล่น\n", + "การดูฟอร์มเพื่อวิเคราะห์เกมนั้น ไม่เพียงแต่วิเคราะห์ก่อนเริ่มเกม แต่ขณะที่เกมกำลังแข่งขันก็ต้องวิเคราะห์ด้วย เช่น กองหลังแต่ละทีมมีประสิทธิภาพแค่ไหน เหนียวหรือไม่ ซึ่งจะส่งผลต่อการทำประตูและการเลือกแทงของคุณนั่นเอง\n", + "3.เลือกแทงให้ถูกจังหวะ\n", + "เมื่อคุณสังเกตเกมไปสัก 30 นาทีแล้ว แต่ยังไม่รู้ว่าจะเลือกแทง ราคาบอลสูงต่ำดูยังไง หรือราคาไหนดี เคล็ดลับง่ายๆ หากครึ่งแรกไม่มีการทำประตูเกิดขึ้นเลย ให้คุณแทงต่ำในครึ่งหลังทันที จะมีโอกาสได้กำไรเต็มๆ แต่ถ้าหากก่อนจบครึ่งแรก มีการทำประตูกันเกิดขึ้น ก็ให้เลือกแทงที่ต่ำเหมือนเดิม เพียงแต่ราคาบอลอาจจะเปลี่ยน\n", + "4.สังเกตความได้เปรียบ\n", + "หากคุณเลือกแทงบอลสูงต่ำขณะที่เกมกำลังแข่งขันอยู่ ราคาบอลจะมีการไหลอยู่ตลอดเวลา เมื่อคุณเห็นว่าราคาบอลสูงไหลลงมาเรื่อยๆ และเกมขณะนั้นไม่มีทีท่าว่าจะยิงกันอีก ก็ให้คุณเลือกแทงสูงไปเลย\n", + "ทำไมถึงต้องเล่นแทงบอลสูงต่ำ มีข้อดีอย่างไร\n", + "เห็นไหมว่าการเลือกแทงบอลสูงต่ำนั้น ไม่ได้ยากอย่างที่คิด เพียงแค่มีเคล็ดลับสังเกตเล็กน้อยคุณก็แทงได้แล้ว สำหรับใครที่ไม่อยากแทงบอลสูงต่ำ ลองมาดูว่าการแทงบอลสูงต่ำดียังไง\n", + "1.เลือกแทงได้ตามใจชอบ\n", + "จุดเด่นของการแทงบอลสูงต่ำ คือคุณสารารถเลือกแทงได้ตามต้องการ จะเลือกแทงก่อนเกมเริ่ม แทงตอนครึ่งแรก หรือว่าเลือกแทงเฉพาะครึ่งหลังก็ได้\n", + "2.โอกาสชนะง่ายกว่า\n", + "จากข้อแรกที่เราเลือกแทงตอนไหนก็ได้ ทำให้คุณมีโอกาสที่จะอ่านเกมให้ดีก่อนเลือกแทง เช่น ก่อนเริ่มคุณคิดว่าทั้งสองทีมจะมีการยิงกันเยอะแน่ๆ แต่พอเกมเริ่มกลับไม่เป็นอย่างที่คิด คือไม่มีการยิงกันเลย แบบนี้คุณก็เปลี่ยนรูปแบบการวางเดิมพันที่เหมาะสมกับเกมในขณะนั้นได้\n", + "3.วิเคราะห์บอลง่าย\n", + "เมื่อเปรียบเทียบกับการแทงบอลรูปแบบอื่นๆ การแทงบอลสูงต่ำ ถือว่าง่ายที่สุด ไม่จำเป็นที่จะต้องชำนาญอะไรมาก เพียงแค่คุณใช้เคล็ดลับอย่างที่ได้บอกไปข้างต้น โอกาสชนะของคุณก็มีสูงทีเดียว\n", + "ทีนี้ก็เชื่อว่าคนที่สงสัยในเรื่องของการดู ราคาบอลสูงต่ำดูยังไง คงจะดูกันเป็นแล้ว ใครที่อยากจะได้กำไรจากการแทงบอลง่ายกว่าเดิม หรือเบื่อกับการแทงบอลแบบเดิม เช่น การแทงบอลสเต็ปที่ไม่ค่อยจะถูกสักที ลองเปลี่ยนมาเล่นแทงบอลสูงต่ำดู ผลลัพธ์กำไรของคุณน่าจะแตกต่างจากเดิมเป็นแน่\n", + "\n", + "doc\n", + "ก่อนที่จะคลั่งไคล้กลยุทธ์บาคาร่ามันยอดเยี่ยมมากที่จะแจ้งให้ผู้อ่านทราบว่านี่เป็นเกมที่มีต้นกําเนิดที่เป็นเอกลักษณ์ในอิตาลีซึ่งเป็นที่รู้จักกันในชื่อ ‘baccara’ ภายในศตวรรษที่ 15 คํานี้เรียกว่า ‘ศูนย์’ ในบาคาร่าอเมริกันผู้เล่นต้องการสร้างการตัดสินใจค่อนข้างน้อยก่อนที่จะจัดการกับพวกเขา – สิ่งเหล่านี้เกี่ยวข้องกับการตัดสินใจตําแหน่งสําหรับการชนะในมือต่อไปนี้และประเมินคาสิโนออนไลน์ของการเดิมพัน ท้ายที่สุดวิดีโอเกมตั้งใจที่จะเดิมพันในมือที่ชนะด้วยคะแนนธรรมดาประมาณ 9 คะแนนหรือมีค่าพิเศษใกล้เคียงกัน\n", + "โต๊ะมินิเหล่านี้มีช่วงการเดิมพันที่คล้ายกัน สมัครบาคาร่าเว็บตรง (ขั้นต่ําต่ํา) กับโต๊ะแบล็คแจ็คของคุณขึ้นอยู่กับคาสิโนวันของสัปดาห์จํานวนเงินของวัน\n", + "การพนันออนไลน์มีโบนัสจํานวนมาก เพราะเว้นแต่จะอยู่คนเดียวผู้คนจากทั่วโลกเยี่ยมชมเว็บไซต์การพนันออนไลน์และตรวจสอบโชคของพวกเขา ที่นี่คุณสามารถเจอความแตกต่างเกี่ยวกับการพนัน มันเล่นเกมคาสิโนทั้งหมดสําหรับแจ็คสีดําโป๊กเกอร์รุ่นต่าง ๆ บาคาร่าหรือบางทีสล็อตแมชชีนและรูเล็ตสด ไม่ว่าเกมใดที่หลายคนพบในคาสิโนอาจมั่นใจได้ว่าคุณเพื่อให้สามารถติดตามได้สําหรับเว็บไซต์การพนันออนไลน์ที่ใหญ่ที่สุดในปัจจุบัน\n", + "สิ่งเหล่านี้จบลงด้วยเหมือนกันเพราะพวกเขามาจากการหลีกเลี่ยงการเดินหากแมวดําผ่านไปอย่างง่ายดาย มันเป็นเพียงแค่ความเชื่อโชคลางอย่างที่ทุกคนรู้ว่ารองเท้าใช้กับ 8 สํารับแบบสุ่มสับ!\n", + "ฟอรัมการพนันออนไลน์ยังสามารถช่วยให้คุณเข้าใจวิธีการทํางานของคาสิโนได้ดีขึ้น หากคุณไม่เคยไปที่คาสิโนมาก่อนคุณต้องการทราบว่ามันทําอะไรก่อนที่จะออกมา จากนั้นคุณจะไม่สับสนเมื่อคุณลองเล่นเกม คุณสามารถออนไลน์เพื่อค้นหาเกี่ยวกับพนักงานที่เกี่ยวข้องกับคาสิโน (คนชั้นผู้จัดการหลุมและอื่น ๆ อีกมากมาย) และหน้าที่ของผู้หญิง / ผู้ชายแต่ละคน นอกจากนี้เรียนรู้ว่าคาสิโนทํางานอย่างไรตั้งแต่เปิดจนถึงเวลาปิด\n", + "ที่แย่ไปกว่านั้นคือที่ที่อัตราต่อรองมักจะทํางานกับตัวละคร ฉันหวังว่าฉันจะบอกคุณได้ว่าอัตราต่อรองทํางานอย่างไรในความโปรดปรานของคุณ แต่นั่นไม่ใช่ความจริงที่ถูกผ่า คาสิโนสวย ๆ ทั้งหมดในเวกัสและเว็บไซต์การพนันขั้นสูงบนเว็บไม่ได้สร้างขึ้นโดยการให้เงินฟรี\n", + "โดยสรุปในขณะที่ใช้วิธีการเล่นการพนันที่ไม่ดีและบาปอย่างแน่นอนนอกจากนี้ยังมีวิธีที่ไม่เป็นอันตรายอย่างสมบูรณ์ ทั้งหมดนี้ขึ้นอยู่กับวิธีการจัดการกับการกระทําของการพนันสําหรับคุณและครอบครัวของคุณ เช่นเดียวกับสิ่งอื่นใดเมื่อถ่ายเกินขอบเขตมันจะกลายเป็นบาปอย่างยิ่ง แต่การทําเครื่องหมายการพนันทั้งหมดเป็นบาปกลายเป็นไม่สอดคล้องกันมากในมุมมองของคุณของโลกเป็นแน่นอนได้พบสั้น ๆ\n", + "\n", + "doc\n", + "คดีแรก มีการอุทธรณ์ ฎีกา ศาลฎีกาพิพากษายกคำพิพากษาศาลล่างทั้งสอง ให้ศาลชั้นต้นดำเนินกระบวนพิจารณาใหม่\n", + "คดีหลัง หลังจากศาลยกฟ้องเพราะดำเนินกระบวนพิจารณาซ้ำแล้ว ก็มีการอุทธรณ์ ฎีกา เช่นกัน ศาลฎีกาคดีหลังวินิจฉัยว่า เมื่อคดีแรกศาลฎีกายกคำพิพากษาศาลล่าง เท่ากับว่าคำพิพากษาของทั้งสองศาลสิ้นผลไป เท่ากับว่าศาลชั้นต้นคดีแรกยังไม่มีคำวินิจฉัยในประเด็นข้อพิพาท คดีหลังจึงไม่เป็นการดำเนินกระบวนพิจารณาซ้ำ ให้ยกคำพิพากษาศาลล่างทั้งสอง ให้ศาลชั้นต้นดำเนินกระบวนพิจารณาและพิพากษาต่อไป\n", + "สรุปหลัก\n", + "คดีแรกศาลชั้นต้นวินิจฉัยในประเด็นแห่งคดีเดียวกัน คดีหลังเป็นดำเนินกระบวนพิจารณาซ้ำ ไม่มีอำนาจฟ้อง\n", + "แต่คดีหลังก็อาจกลับมาเป็นฟ้องที่ไม่เป็นการดำเนินกระบวนพิจารณาซ้ำได้ หากคดีแรกถูกพิพากษายกย้อนสำนวนให้กลับมาพิจารณาคดีใหม่ที่ศาลชั้นต้น\n", + "\n", + "doc\n", + "มีพระบรมราชโองการในพระบาทสมเด็จฯ พระจอมเกล้าเจ้าอยู่หัว ประกาศปฏิญาณไว้เปนความสัจความจริง แก่เจ้าจอมอยู่งานชั้นใน ชั้นกลางชั้นนอกทั้งปวง เว้นแต่เจ้าจอมมารดาในพระเจ้าลูกเธอ แลหม่อมพนักงานทุกตำแหน่ง แลจอมเจ้าเถ้าแก่ แลท่านเถ้าแก่ แลนางรำบำเรอทั้งปวงทุกคน\n", + "ด้วยบัดนี้ไม่ทรงหวงแหนท่านผู้ใดผู้หนึ่งไว้ในราชการด้วยการข่มเหงกักขังดอก ทรงพระมหากรุณาชุบเลี้ยงตามสมัค แลเห็นแก่ตระกูลแลความชอบของท่านทั้งปวงจึงทรงพระกรุณาชุบเลี้ยง พระราชทานเบี้ยหวัดผ้าปีแลเครื่องยศบันดาศักดิ์โดยสมควร บัดนี้ท่านทั้งปวงก็ทำราชการมานานแล้ว ใครๆ ไม่สบายจะใคร่กราบถวายบังคมลาออกนอกราชการ ไปอยู่วังเจ้า บ้านขุนนาง บ้านบิดามารดา จะมีลูกมีผัวให้สบายประการใด ก็อย่าให้กลัวความผิดเลย ให้กราบทูลถวายบังคมลาโดยตรง แล้วถวายเครื่องยศคืนเสียแล้วก็จะโปรดให้ไปตามปราถนาโดยสะดวกไม่กักขังไว้ แลไม่ให้มีความผิดแก่ตัวผู้นั้นแลผู้ที่จะเปนผัวนั้นเลย ห้ามแต่อย่าให้สนสื่อหาชู้หาผัวแต่ตัวยังอยู่ในราชการด้วยอุบายทางใดทางหนึ่งก่อนกราบบังคมทูลพระกรุณาเปนอันขาดทีเดียว เปนดังนั้นจะเสียพระราชกำหนดสำหรับแผ่นดินไป เมื่อไปอยู่นอกพระราชวังแล้ว ถ้าเปนคนมีตระกูลอยู่ ไปอยู่กับบิดามารดาญาติพี่น้อง ฤๅเปนนางห้ามเจ้านายที่ทรงพระกรุณาให้มีบันดาศักดิ์ใหญ่ๆ ฤๅเปนภรรยาข้าราชการที่มีศักดินามาก ก็จะพระราชทานเบี้ยหวัดอยู่บ้างโดยสมควร\n", + "อนึ่งถ้าเจ้าจอมอยู่งานชั้นในเห็นว่าพระราชบัญญัติบังคับๆ แคบใจนัก จะถวายบังคมลาออกนอกราชการก็อายอดสู อยู่ชั้นในไม่สบาย จะขอรับพระราชทานโอกาศเลื่อนออกมาเปนชั้นกลางชั้นนอก แลพนักงานทำราชการสนองพระเดชพระคุณตามอย่างแลบังคับเจ้าจอมอยู่งานชั้นกลางชั้นนอก แลพนักงานแลนางรำบำเรอ ก็ตามแต่จะชอบใจ แต่ให้กราบทูลก่อน อย่าเพ่อทำการประพฤติแชเชือนเกินอย่างเจ้าจอมอยู่งานชั้นในก่อนกราบทูลจะขอออกตัว จะทรงพระกรุณาโปรดให้ลดแต่เครื่องยศแลเบี้ยหวัดอย่างเจ้าจอมชั้นในเสีย ให้คงได้ดังเจ้าจอมอยู่งานชั้นกลางชั้นนอก แลพนักงานแลนางรำบำเรอโดยสมควร.\n", + "แต่เจ้าจอมมารดาในพระเจ้าลูกเธอ จะโปรดให้ออกนอกราชการไปมีผัวไม่ได้ จะเสียพระเกียรติยศพระเจ้าลูกเธอไป เมื่อจะใคร่ออกนอกราชการเพียงจะอยู่กับพระเจ้าลูกเธอ ไม่มีผัวก็จะทรงพระกรุณาโปรด กระแสพระบรมราชโองการดังนี้ก็ได้มีพระราชดำรัสมาหลายครั้งแล้ว แต่ดูทีจะหามีใครเชื่อไม่ ด้วยเข้าใจว่าตัดเล่นก็ดี ประชดก็ดี การอันนี้เปนสุจริตสัจจริง จึงโปรดเกล้าโปรดกระหม่อมให้ตีพิมพ์ประกาศพระราชทานเปนสำคัญสัญญาไว้ให้มั่นคง ให้ท่านทั้งปวงเชื่อว่าไม่ทรงหวงแหนกักขังจริงๆ แลพระราชดำรัสนั้นเปนความจริงความตรง ให้ท่านทั้งปวงรับคำประกาศนี้ไว้เปนสำคัญ ถ้ากาลไปข้างหน้ามิได้เปนจริงดังนี้ ก็ควรที่ท่านทั้งปวงแลเทพยดามนุษย์จะครหาติเตียนอยู่แล้ว.\n", + "อนึ่งเจ้าจอมมารดาพระองค์เจ้าในแผ่นดินล่วงแล้วมา ถ้ายังมีพระองค์เจ้าอยู่ก็อย่าให้มีผัว ถ้าอยากจะมีผัวให้ได้ก็ให้มากราบทูลพระกรุณาว่าตัดรอนพระองค์เจ้าให้ขาดเสียก่อน อย่าให้เรียกว่าเจ้าจอมมารดาเลย ถ้าพระองค์เจ้ายอมตัดไม่นับถือแล้วจะโปรดให้มีผัวตามสบาย ถ้าไม่กราบทูลพระกรุณาขืนมีผัว ถ้าผัวเปนพระองค์เจ้า ก็จะโปรดลดเบี้ยหวัดเสียกึ่งหนึ่ง ถ้าผัวเปนหม่อมเจ้า เปนข้าราชการมีบันดาศักดิ์ก็ดี จะยกเบี้ยหวัดเสีย แล้วจะให้เสียภาษีปีละ ๑๒ ตำลึง ถ้ามีผัวข้าราชการมีบรรดาศักดิ์น้อยแลไพร่จะให้ลงพระราชอาญา แล้วผัวจะให้ริบราชบาทว์แล้วเอาตัวส่งหญ้าช้าง ตัวหญิงจะให้ลงพระราชอาญาจำไว้จนตาย ถ้าพระองค์เจ้าสงสารกราบทูลขอ ก็จะพระราชทานให้ไปอยู่กับพระองค์เจ้า รับพระราชทานเบี้ยหวัดเหมือนอย่างนางนม ให้เรียกแต่ว่ามารดา ไม่ให้ใส่คำนำเรียกว่าเจ้าจอม\n", + "อนึ่งบรรดามารดาหม่อมเจ้าในพระองค์เจ้าที่ตั้งกรมแล้ว แลยังไม่ได้ตั้งกรมทั้งปวงซึ่งสิ้นพระชนม์แล้ว เมื่อหม่อมเจ้ายังมีตัวอยู่ ถ้าไม่มีผัวก็ได้รับพระราชทานเบี้ยหวัด ๖ ตำลึงบ้าง ยิ่งกว่านั้นบ้าง ถ้ามีผัวให้เลิกเบี้ยหวัดเสีย ให้ผัวที่เปนไพร่มิใช่เจ้าเสียภาษีปีละ ๖ ตำลึง เปนเบี้ยเลี้ยงแก่หม่อมเจ้าไปทุกเดือนกว่าหม่อมเจ้าจะไม่มีตัว ภาษีนี้ใครอย่าติว่าแรง เพราะมิได้เรียกเอามาเปนหลวงแต่สักเฟื้อง ๑ พระราชทานให้หม่อมเจ้าผู้บุตรทั้งสิ้น เปนการจะกดขี่คนที่เปนผัวมารดาหม่อมเจ้าให้ปฏิบัติหม่อมเจ้าไป\n", + "อนึ่งมารดาหม่อมเจ้าไม่มีผัวพระราชทานเบี้ยหวัดด้วย ก็เพื่อจะให้เปนกำลังเลี้ยงหม่อมเจ้าไป ก็เมื่อไม่อยู่เลี้ยงหม่อมเจ้าไปมีผัวก็ควรให้คนผู้เปนผัวเสียภาษีให้แก่หม่อมเจ้า เท่าเบี้ยหวัดซึ่งพระราชทานเมื่อไม่มีผัวจึงชอบ ถ้ามารดาหม่อมเจ้าที่มีผัวโกรธกับผัวถึงอย่าร้างขาดจากผัวเมียกัน ถ้าสาบาลได้ทั้งสองข้าง อย่ากันแต่เดือนใดก็ให้ยกภาษีแต่นั้นไป โกรธกันเล็กน้อยถึงว่าไม่ได้อยู่ด้วยกัน ถ้าสาบาลไม่ได้ว่าขาดกันก็ไม่พ้นภาษี ถ้าอยากจะไม่เสียภาษีมาทนสาบาลแล้วกลับไปดีกัน ฤๅสืบได้ความจริงว่ายังดีกันอยู่ จะปรับให้ใช้ภาษีสองต่อจนเดือนที่ชำระความ ถ้ามารดาหม่อมเจ้ามีผัวเปนพระองค์เจ้า ไม่เสียเกียรติยศอันใด เปนแต่โปรดให้ยกเบี้ยหวัดให้ไปให้พระองค์เจ้าผู้ผัวเลี้ยงเถิด ฤๅจะได้เบี้ยหวัดก็จะได้ด้วยอำนาจพระองค์เจ้าที่เปนผัวใหม่ ถ้ามารดาหม่อมเจ้าไปได้ผัวใหม่เปนหม่อมเจ้า ถ้าหม่อมเจ้าผู้บุตรยอมยินดีเอาเปนบิดาเลี้ยงก็แล้วไป ถ้าหม่อมเจ้าผู้บุตรมิยอมยินดีด้วย ก็จะทรงพระกรุณาโปรดชักเอาเบี้ยหวัดของหม่อมเจ้าที่เข้ามาเปนผัวนั้นแบ่ง ๓ ส่วน ยกเอาส่วน ๑ ให้แก่หม่อมเจ้าผู้บุตรเปนภาษีทุกปีไป เพราะทำให้หม่อมเจ้าผู้บุตรได้ความอับอาย ลักษณพระราชกำหนดนี้ โปรดเกล้าโปรดกระหม่อมให้ประกาศมาให้ท่านทั้งปวงทราบด้วยจงทั่วกัน.\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "\n", + "result_df.boxplot(column=[\"log_score\"])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "idD4Z6sFpG-P", + "outputId": "775cc60b-0799-4cc9-dfe9-2b5ad9e025c8" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 38 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Xnutu72iokJ/+tOftGDBAg0ZMkS9evXSihUrtGPHDhUVFV2pcgAAQCtyxVbxTJ48WSNHjlRKSoqee+45d/uePXvkdDqVkpLibktMTFTnzp1VWFioO++886Jj1dbWqra21r3deFdTp9Mpp9N5pd4CABPU19e7/+XzDbQtzflMX5GA8t5772nv3r3atWvXRftKS0sVGBio9u3be7RHRUWptLS0yePNnTtXc+bMuah948aN3KEUaGO+Oi9JASoqKtI3xWZXA8CbqqqqLrmv1wPKV199pUcffVS5ubkKDg72yjFnzZqlrKws97bD4VBcXJyGDx/OhdqANuZvX56W9u/WnXfeqds6R5pdDgAvajwDcim8HlD27Nmj8vJyj1ubu1wubd26VX/84x/1ySefqK6uTmfPnvUYRSkrK1N0dHSTxwwKClJQUNBF7Xa7XXa73dtvAYCJAgIC3P/y+QbaluZ8pr0eUIYOHar9+/d7tP3ud79TYmKinnzyScXFxclut2vTpk3KzMyUJB06dEhffvml+vbt6+1yAABAK+T1gNKuXTv17NnToy0sLEwdOnRwt0+cOFFZWVmKjIxUeHi4pk6dqr59+zY5QRYAAPgeU+7F8+qrr8rf31+ZmZmqra1VamqqlixZYkYpAADAgq5KQMnLy/PYDg4O1uLFi7V48eKr8fIAAKCV4V48AADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcgLMLgCAuY5+V6nK2nqzy3D74ttK978BAdb5igoLClD8dWFmlwH4DOt8+gFcdUe/q9Tg+Xlml9GkGdn7zS7hIlseG0RIAa4SAgrgwxpHTl771e1K6HiNydV8r7K6Vjl5hbp7UF+FhQSZXY4k6Uj5eU37P/ssNdIEtHUEFABK6HiNenaKMLsMSZLT6VTp9dLPb7xWdrvd7HIAmIRJsgAAwHIIKAAAwHIIKAAAwHIIKAAAwHIIKAAAwHIIKAAAwHIIKAAAwHIIKAAAwHIIKAAAwHIIKAAAwHIIKAAAwHIIKAAAwHK4WSDgw2pdNfIP/kZHHYfkH2yNuxnX19frRP0JHTh9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0uR0OiV9HyAeeughPfroo9q3b5+GDRum559//pKPP378eN1www3atWuX9uzZo5kzZ8put0uS9u3bp6FDh+qWW25RYWGhtm3bplGjRsnlckmSnnjiCa1cuVJ//vOftXfvXiUkJCg1NVWnT5/2eI2ZM2fqxRdf1IEDB3Trrbdq7ty5euutt7Rs2TJ9/vnnmj59un79618rPz/fS381AC1iAEATBg4caDz66KPG4cOHDUnG9u3b3fu+++47IyQkxHj//fcNwzCMX/3qV8bIkSM9nj9+/HgjIiLikl6rXbt2xptvvtnkvvvuu8/o169fk/vOnz9v2O124+2333a31dXVGbGxsca8efMMwzCMLVu2GJKM1atXu/vU1NQYoaGhxo4dOzyON3HiROO+++67pJoBXFmMoAD4UQcOHFBAQID69OnjbuvQoYNuvvlmHThwQJJ06NAh3XHHHR7P++H2j8nKytK///u/KyUlRS+++KK++OIL977GEZSmfPHFF3I6nerXr5+7zW6364477nDX1qh3797ux0eOHFFVVZWGDRuma665xv3fW2+95fHaAMwTYHYBADB79mz927/9m9auXav169fr2Wef1XvvvacxY8YoJCTEK68RFhbmfnz+/HlJ0tq1a9WpUyePftwDCLAGRlAA/KgePXqovr5eO3fudLedOnVKhw4d0i233CJJuvnmmz0mpkq6aPundO/eXdOnT9fGjRuVkZGhFStWSJJuvfVWbdq0qcnndO3aVYGBgdq+fbu7zel0ateuXe7amnLLLbcoKChIX375pRISEjz+i4uLa1bdAK4MRlAA/Khu3bpp9OjReuCBB/T666+rXbt2mjlzpjp16qTRo0dLkqZOnark5GQtWLBAo0aN0ubNm7V+/Xr5+fn95PGrq6v1+OOPa+zYsYqPj9fXX3+tXbt2KTMzU5I0a9YsJSUl6eGHH9ZDDz2kwMBAbdmyRffcc4+uu+46TZo0SY8//rgiIyPVuXNnzZs3T1VVVZo4ceL/+prt2rXTY489punTp6uhoUH9+/dXRUWFtm/frvDwcE2YMME7fzwAl8/sSTAArKlxkqxhGMbp06eN3/zmN0ZERIQREhJipKamGocPH/bov3z5cqNTp05GSEiIkZ6ebjz33HNGdHT0T75ObW2tMW7cOCMuLs4IDAw0YmNjjSlTphjV1dXuPnl5ecZdd91lBAUFGe3btzdSU1ONM2fOGIZhGNXV1cbUqVON6667zggKCjL69etnfPbZZ+7nNk6SbezfqKGhwXjttdeMm2++2bDb7cb1119vpKamGvn5+Zf3BwPgVX6GYRhmhyQAbc8DDzyggwcPqqCgwOxSALRCnOIB4BXz58/XsGHDFBYWpvXr1+vPf/6zlixZYnZZAFopRlAAeMW9996rvLw8nTt3TjfddJOmTp2qhx56SJL0s5/9TMePH2/yea+//rrGjx9/NUsF0AoQUABcccePH3dfdfaHoqKi1K5du6tcEQCrI6AAAADL4TooAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcggoAADAcv4fzdgyH9FcRFMAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "result_df.sort_values('score').iloc[-20:]" + ], + "metadata": { + "id": "yyPNe1z79fnS", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 677 + }, + "outputId": "18b7908a-2dfd-4b99-a77e-283ed7a6f0ce" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text score\n", + "19 สร้างรายได้จากการเล่นสล็อต เล่นเกมส์สล็อตslotx... 6.994830e+24\n", + "963 ผู้เล่นทุกคนที่ต้องการเพิ่มประสบการณ์การเล่นที... 1.363968e+25\n", + "918 ร่างกายต้องการอินซูลินเพื่อควบคุมระดับน้ำตาลใน... 2.941681e+25\n", + "741 การเข้าสู่ระบบโซเชียลนั้นไม่สามารถกระทำได้โดยไ... 1.934509e+26\n", + "211 ภาพดอกไม้สวยๆเห็นแล้วสบายใจมีความสุข ตอนถ่ายได... 4.617546e+26\n", + "430 แทงบอล ผลบอลสด UFABET มีมากมายกีฬาให้พวกเราได้... 5.519635e+26\n", + "709 ไฮโลเงินจริง สำหรับนักพนันที่กำลังมองหาเว็บพนั... 1.200325e+28\n", + "131 บาคาร่าออนไลน์ ได้เงินจริง mgm99sa บาคาร่า การ... 1.526711e+28\n", + "263 สล็อตเพนกวิน เกมส์สล็อตเพนกวิ้น เป็นเกมส์สล็อต... 1.428869e+29\n", + "465 สมัครบาคาร่า888 สมัครสมาชิกใหม่วันนี้กับเว็บพน... 1.709577e+30\n", + "800 ค่ายสล็อตเชื่อถือได้ เรามาพร้อมกับดีๆพิเศษและโ... 7.055587e+30\n", + "51 “It's hard to walk away from a winning streak,... 3.065921e+32\n", + "985 ถอดรหัสตั้งชื่อว่าถอดรหัสเซเปียนส์ประวัติย่อมน... 7.361195e+34\n", + "339 `,``];S3=n8(c8,I8);r8=s1(b0b.r5H(m5b)*b0b.h3d,... 8.844142e+37\n", + "445 เกมยิงปลา สวัสดีครับวันนี้ผมจะมาแนะนำให้หลายๆท... 1.151742e+38\n", + "576 อุปกรณ์บานเปิดอลูมิเนียมMinimatSlide lineWing ... 1.263056e+40\n", + "522 ทั้งหมด(หลัก)พูดคุยผู้ใช้คุยกับผู้ใช้วิกิพจนาน... 1.988009e+48\n", + "306 สำหรับเกมบาคาร่าเป็นเกมไพ่ประเภทหนึ่งที่เล่นง่... 7.441169e+52\n", + "418 ดอกชบาลั่นทมอาเซียนกัมพูชาดอกลีลาวดีดอกกล้วยไม... 1.767100e+109\n", + "438 ขายหมวก,ขายหมวกแก๊ป,ราคาหมวกแก๊ป,หมวกแฟชั่น,หม... 1.968814e+185" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
textscore
19สร้างรายได้จากการเล่นสล็อต เล่นเกมส์สล็อตslotx...6.994830e+24
963ผู้เล่นทุกคนที่ต้องการเพิ่มประสบการณ์การเล่นที...1.363968e+25
918ร่างกายต้องการอินซูลินเพื่อควบคุมระดับน้ำตาลใน...2.941681e+25
741การเข้าสู่ระบบโซเชียลนั้นไม่สามารถกระทำได้โดยไ...1.934509e+26
211ภาพดอกไม้สวยๆเห็นแล้วสบายใจมีความสุข ตอนถ่ายได...4.617546e+26
430แทงบอล ผลบอลสด UFABET มีมากมายกีฬาให้พวกเราได้...5.519635e+26
709ไฮโลเงินจริง สำหรับนักพนันที่กำลังมองหาเว็บพนั...1.200325e+28
131บาคาร่าออนไลน์ ได้เงินจริง mgm99sa บาคาร่า การ...1.526711e+28
263สล็อตเพนกวิน เกมส์สล็อตเพนกวิ้น เป็นเกมส์สล็อต...1.428869e+29
465สมัครบาคาร่า888 สมัครสมาชิกใหม่วันนี้กับเว็บพน...1.709577e+30
800ค่ายสล็อตเชื่อถือได้ เรามาพร้อมกับดีๆพิเศษและโ...7.055587e+30
51“It's hard to walk away from a winning streak,...3.065921e+32
985ถอดรหัสตั้งชื่อว่าถอดรหัสเซเปียนส์ประวัติย่อมน...7.361195e+34
339`,``];S3=n8(c8,I8);r8=s1(b0b.r5H(m5b)*b0b.h3d,...8.844142e+37
445เกมยิงปลา สวัสดีครับวันนี้ผมจะมาแนะนำให้หลายๆท...1.151742e+38
576อุปกรณ์บานเปิดอลูมิเนียมMinimatSlide lineWing ...1.263056e+40
522ทั้งหมด(หลัก)พูดคุยผู้ใช้คุยกับผู้ใช้วิกิพจนาน...1.988009e+48
306สำหรับเกมบาคาร่าเป็นเกมไพ่ประเภทหนึ่งที่เล่นง่...7.441169e+52
418ดอกชบาลั่นทมอาเซียนกัมพูชาดอกลีลาวดีดอกกล้วยไม...1.767100e+109
438ขายหมวก,ขายหมวกแก๊ป,ราคาหมวกแก๊ป,หมวกแฟชั่น,หม...1.968814e+185
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result_df.sort_values('score').iloc[:20]" + ], + "metadata": { + "id": "NrRHZ2sJ_UE6", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 677 + }, + "outputId": "6c078d51-1276-46e9-8600-d07151bcdfd8" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " text score\n", + "909 โดเมนระดับบนสุด (อังกฤษ: Top-level domain - TL... 1988.4\n", + "535 All Quiet on the Western Front แนวรบด้านตะวันต... 4691.8\n", + "360 ไทย สวิตเซอร์แลนด์ เกาหลี ลาว พม่า สหรัฐอเมริก... 4973.0\n", + "547 ไทย สวิตเซอร์แลนด์ เกาหลี ลาว พม่า สหรัฐอเมริก... 4973.0\n", + "435 รหัสไอเทม: ... ชื่อ: ... ประเภท: ทุกส่วน ฟื้นฟ... 14182.8\n", + "958 Sort by: issue date submit date title In order... 87993.2\n", + "212  ประกาศผู้ชนะการคัดเลือก (รายไตรมาส) 3/ 2563 ... 110606.3\n", + "318 เรียงลำดับ: เริ่มต้น ชื่อ (A - Z) ชื่อ (Z - A)... 116061.5\n", + "824 ครีบหลัง : โค้งเว้า ปลายครีบเรียวแหลม ปาก : จุ... 151906.3\n", + "375 ตารางเรียนนิติศาสตรบัณฑิต (ภาคพิเศษ) ภาคเรียนท... 175666.8\n", + "4 มอบเกียรติบัตรการแข่งขันทักษะทางวิชาการงานศิลป... 196391.3\n", + "665 สถาปัตยกรรมอิหร่าน หรือ สถาปัตยกรรมเปอร์เซีย (... 208250.1\n", + "99 69, 69/1, 69/2, 69/4 อาคารเซ็นทรัลเฟสติวัล อีส... 222958.8\n", + "0 📍 หลังบ้านเป็นช่องแสงอยู่แล้ว เมื่อเวลาเข้าสู่... 237214.4\n", + "804 วัน/เดือน/ปีเกิด : 123456789101112131415161718... 280380.0\n", + "995 Copyright © 2014 ข่าว วงการมวยสากล มวยโลก โปรแ... 306012.4\n", + "857 Copyright © 2020. All rights reserved. ศูนย์กา... 306739.4\n", + "98 Use Default Order Added -- Oldest first Added ... 321591.4\n", + "881 พื้นที่แบ่งปันความรู้เกี่ยวกับการทำ SEO (Searc... 341080.3\n", + "383 วิทยาลัยชุมชนพังงา 69 หมู่ที่ 6 ต.บ่อแสน อ.ทับ... 403000.1" + ], + "text/html": [ + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
textscore
909โดเมนระดับบนสุด (อังกฤษ: Top-level domain - TL...1988.4
535All Quiet on the Western Front แนวรบด้านตะวันต...4691.8
360ไทย สวิตเซอร์แลนด์ เกาหลี ลาว พม่า สหรัฐอเมริก...4973.0
547ไทย สวิตเซอร์แลนด์ เกาหลี ลาว พม่า สหรัฐอเมริก...4973.0
435รหัสไอเทม: ... ชื่อ: ... ประเภท: ทุกส่วน ฟื้นฟ...14182.8
958Sort by: issue date submit date title In order...87993.2
212 ประกาศผู้ชนะการคัดเลือก (รายไตรมาส) 3/ 2563 ...110606.3
318เรียงลำดับ: เริ่มต้น ชื่อ (A - Z) ชื่อ (Z - A)...116061.5
824ครีบหลัง : โค้งเว้า ปลายครีบเรียวแหลม ปาก : จุ...151906.3
375ตารางเรียนนิติศาสตรบัณฑิต (ภาคพิเศษ) ภาคเรียนท...175666.8
4มอบเกียรติบัตรการแข่งขันทักษะทางวิชาการงานศิลป...196391.3
665สถาปัตยกรรมอิหร่าน หรือ สถาปัตยกรรมเปอร์เซีย (...208250.1
9969, 69/1, 69/2, 69/4 อาคารเซ็นทรัลเฟสติวัล อีส...222958.8
0📍 หลังบ้านเป็นช่องแสงอยู่แล้ว เมื่อเวลาเข้าสู่...237214.4
804วัน/เดือน/ปีเกิด : 123456789101112131415161718...280380.0
995Copyright © 2014 ข่าว วงการมวยสากล มวยโลก โปรแ...306012.4
857Copyright © 2020. All rights reserved. ศูนย์กา...306739.4
98Use Default Order Added -- Oldest first Added ...321591.4
881พื้นที่แบ่งปันความรู้เกี่ยวกับการทำ SEO (Searc...341080.3
383วิทยาลัยชุมชนพังงา 69 หมู่ที่ 6 ต.บ่อแสน อ.ทับ...403000.1
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + "
\n", + " " + ] + }, + "metadata": {}, + "execution_count": 28 + } + ] + }, + { + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "result_df=pd.read_csv(\"/content/drive/MyDrive/openthaigpt/oscar_wiki_perplexity_df.csv\")" + ], + "metadata": { + "id": "L1vg1DfPJNaD", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 346 + }, + "outputId": "b90407a7-517e-47c2-8ed8-b511eddb9ea3" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "error", + "ename": "FileNotFoundError", + "evalue": "ignored", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpandas\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mresult_df\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"/content/oscar_wiki_perplexity_df.csv\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_arg_name\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_arg_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 211\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 212\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 329\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfind_stack_level\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 330\u001b[0m )\n\u001b[0;32m--> 331\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 332\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 333\u001b[0m \u001b[0;31m# error: \"Callable[[VarArg(Any), KwArg(Any)], Any]\" has no\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001b[0m\n\u001b[1;32m 948\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwds_defaults\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 949\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 950\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 951\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 952\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 603\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 604\u001b[0m \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 605\u001b[0;31m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 606\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 607\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 1440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1441\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandles\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mIOHandles\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1442\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1443\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1444\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m 1733\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m\"b\"\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1734\u001b[0m \u001b[0mmode\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1735\u001b[0;31m self.handles = get_handle(\n\u001b[0m\u001b[1;32m 1736\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1737\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/pandas/io/common.py\u001b[0m in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 854\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencoding\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m\"b\"\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 855\u001b[0m \u001b[0;31m# Encoding\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 856\u001b[0;31m handle = open(\n\u001b[0m\u001b[1;32m 857\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 858\u001b[0m \u001b[0mioargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/content/oscar_wiki_perplexity_df.csv'" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/data/openthaigpt_pretraining_data/internet/perplexity/perplexity.py b/src/data/openthaigpt_pretraining_data/internet/perplexity/perplexity.py new file mode 100644 index 0000000..0349148 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/internet/perplexity/perplexity.py @@ -0,0 +1,103 @@ +import kenlm +import math +import numpy as np +import pandas as pd +import pickle +import scipy +import sentencepiece # type: ignore +from openthaigpt_pretraining_data.core.text_normalizer import normalize +from typing import List +import warnings + +warnings.simplefilter(action="ignore", category=FutureWarning) + + +class SentencesLM: + """Returns the score of each individual paragraph.""" + + def __init__(self): + lm_config = kenlm.Config() + lm_config.load_method = 2 + + lm_model_filename = ( + "../../openthaigpt_pretraining_data/internet/perplexity/th.arpa.bin" + ) + self.lm = kenlm.Model(str(lm_model_filename), lm_config) + self.sp = sentencepiece.SentencePieceProcessor() + self.sp.load( + "../../openthaigpt_pretraining_data/internet/perplexity/th.sp.model" + ) + + def pp(self, log_score: float, length: int) -> float: + """Compute perplexity score""" + power = min(30, -log_score / length) + + return 10.0**power + + def do(self, document: List[str]) -> float: # type: ignore + """Compute perplexity for each line of document""" + total_pp = 0 + total_length = 0 + for line in document: + line = normalize(line, accent=False) + tokenized_line = " ".join(self.sp.encode_as_pieces(line)) + log_score = self.lm.score(tokenized_line) + length = len(line.split()) + 1 + + total_length += length + total_pp += log_score + return round(self.pp(total_pp, total_length), 1) + + +classifier_filename = ( + "../../openthaigpt_pretraining_data/internet/perplexity/decision_tree.sav" +) +classifier = pickle.load(open(classifier_filename, "rb")) + +lm = SentencesLM() + + +def classify_spam(text: str): + """Classify if text is spam using perplexity and decision tree as thresholder + Input : text -> a text to classify. + Output : prediction -> Prediction whether text is spam. + 1 Represents spam and 0 represent non-spam. + Output : log_pp_score -> log of perplexity score. + """ + + pp_score = lm.do(text.split("\n")) + + log_pp_score = math.log(pp_score) + + prediction = classifier.predict(pd.DataFrame({"log_score": [log_pp_score]})) + + return prediction, log_pp_score + + +def sample_text_back( + probs: np.ndarray, + percentage: float = 0.1, +) -> List[int]: + """Sample some spam text back in the dataset + using log score distribution of language model + + Input : spam_data_points -> data points which its text classified as spam + by perplexity. + Input : probs -> prob of log perplexity. + Input : percentage -> percent of data to sample back. + + Output : sampled_data -> The sampled back data. + """ + + n = len(probs) + if n <= 1: + return [] + + norm_probs = scipy.special.softmax(1 - probs) + np.random.seed(0) + + selected_idx = np.random.choice( + n, p=norm_probs, size=int(percentage * n), replace=False + ) + + return list(selected_idx) diff --git a/src/data/openthaigpt_pretraining_data/merge_pdf/__init__.py b/src/data/openthaigpt_pretraining_data/merge_pdf/__init__.py new file mode 100644 index 0000000..836a61e --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/merge_pdf/__init__.py @@ -0,0 +1,363 @@ +import pandas as pd +import PyPDF2 +import pdf_table2json.converter as converter +from difflib import SequenceMatcher +import re +import copy + + +def convert_correction_rules(filepath): + """ + Description: + Convert pdf_correction_rules.txt to + list of tuples (wrong, right). + This list will be used for correcting pdf-converted text. + Args: + filepath: string of file path. + Returns: + replace_list: List of tuples (incorrect_format , correct_format). + """ + + with open(filepath, encoding="utf-8") as f: + lines = f.readlines() + + replace_list = [ + eval(t.strip().replace("$line = str_replace", "").replace(",$line", "")[:-1]) + for t in lines + ] + return replace_list + + +def read_pdf_all_pages(pdf_file): + """ + Description: + Read all texts in every page of pdf file and return as string + Require PyPDF2 + Args: + pdf_file: string of pdf file path. + Returns: + read_text: string. + """ + + reader = PyPDF2.PdfReader(pdf_file) + page_count = len(reader.pages) + read_text = [reader.pages[i].extract_text() for i in range(page_count)] + read_text = "".join(map(str, read_text)) + return read_text + + +def clean_dup_esc_char(str_text): + """ + Description: + Reduce duplicated escape characters into one + Args: + str_text: string. + Returns: + clean_dup: string. + """ + + clean_dup = re.sub(r"(\W)\1+", r"\1", str_text) + return clean_dup + + +def clean_by_rules(str_text, rules_filepath): + """ + Description: + Clean input text that contain incorrect word structure by replacing with + list of correct word structure which is written in pdf_correction_rules.txt + as php format. + Args: + str_text: input string. + rule_filepath: string of file path + Returns: + str_text: clean string. + """ + + replace_list = convert_correction_rules(rules_filepath) + + for tu in replace_list: + str_text = str_text.replace(tu[0], tu[1]) + + return str_text + + +def whitespace_ratio(text): + """ + Description: + Calculate ratio of whitespace in text + Args: + text: input string. + Returns: + whitespace ratio: float. + """ + + if len(text) == 0: + return 0 + return len(text.split(" ")) / len(text) + + +def clean_whitespace(str_text): + """ + Description: + Clean whitespace in text if whitespace ratio is greater than 0.3 + Args: + str_text: input string. + Returns: + text4: clean string. + """ + # Not reccommend for working with table which requires duplicated + + if whitespace_ratio(str_text) > 0.3: + text1 = re.sub(r"\s{2,}", "", str_text) + text2 = re.sub(r"(?<=[A-z()])\s(?=[A-z()])", "", text1) + text3 = re.sub(" ", "", text2) + text4 = re.sub("", " ", text3) + + else: + text2 = re.sub(r"(?<=[A-z()])\s(?=[A-z()])", "", str_text) + text3 = re.sub(r"\s{2,}", " ", text2) + text4 = re.sub("", " ", text3) + + return text4 + + +def get_clean_json_tables(pdf_file, text_rule_file): + """ + Description: + Get json table from pdf file. + Detectable table must have horizontal border line. + Require pdf_table2json lib. + Args: + pdf_file: string of pdf file path. + text_rule_file: string of file path to pdf_correction_rules.txt. + Returns: + result: list of dict. + """ + + dict_list = converter.main(pdf_file, json_file_out=False, image_file_out=False) + result = eval(clean_by_rules(dict_list, text_rule_file)) + return result + + +def add_blank_fill(ls, max): + """ + Description: + Add blank member to list till length of list + is equal to max + Args: + ls: list. + max: int. + Returns: + ls: list with length of max. + """ + + _ls = copy.copy(ls) + + while len(_ls) < max: + _ls.append("") + return _ls + + +def get_clean_df(dict_ls): + """ + Description: + Create dataframe from list of dict that read from pdf file. + Require Pandas. + Args: + dict_ls: list of dict. + Returns: + clean_df: dataframe. + """ + + max_key_cnt = max([len(dct.keys()) for dct in dict_ls]) + top_column = list(dict_ls[0].keys()) + new_column = add_blank_fill(top_column, max_key_cnt) + + clean_df = [] + + for dct in dict_ls: + if list(dct.keys()) == top_column: + if len(clean_df) == 0: + add_values = add_blank_fill(list(dct.values()), max_key_cnt) + clean_df = pd.DataFrame([add_values], columns=new_column) + else: + clean_df.loc[len(clean_df.index)] = add_blank_fill( + list(dct.values()), max_key_cnt + ) + prev_key = dct.keys() + else: + if len(dct.keys()) == 1: + clean_df.loc[len(clean_df.index)] = add_blank_fill( + list(dct.values()), max_key_cnt + ) + elif dct.keys() != prev_key: + clean_df.loc[len(clean_df.index)] = add_blank_fill( + list(dct.keys()), max_key_cnt + ) + clean_df.loc[len(clean_df.index)] = add_blank_fill( + list(dct.values()), max_key_cnt + ) + prev_key = dct.keys() + + else: + clean_df.loc[len(clean_df.index)] = add_blank_fill( + list(dct.values()), max_key_cnt + ) + + return clean_df + + +def most_similar_fuzzy(search_text, source_text): + """ + Description: + Get the most similar search-text from source-text + Require difflib. + Args: + search_text: string of search word. + source_text: string of source to lookup + Returns: + dict: {match content : match line number}. + """ + + lines = source_text.split("\n") + max_sim = 0 + for i, line in enumerate(lines): + words = line.split() + + for word in words: + similarity = SequenceMatcher(None, word, search_text) + if similarity.ratio() > max_sim: + max_sim = similarity.ratio() + match_line = i + + return {lines[match_line]: match_line} + + +def pdf_2_text_markup(pdf_file, text_rule_file): + """ + Description: + Convert pdf file to text with markup table. + Args: + pdf_file: string of pdf file path. + text_rule_file: string of file path to pdf_correction_rules.txt. + Returns: + full_text_markup: string. + """ + + raw_text = read_pdf_all_pages(pdf_file) + clean_text = clean_dup_esc_char(raw_text) + clean_text = clean_by_rules(clean_text, text_rule_file) + + raw_json_table = get_clean_json_tables(pdf_file, text_rule_file) + if len(raw_json_table) == 0: + return clean_whitespace(clean_text) + + clean_df = get_clean_df(raw_json_table) + + csv_table = clean_df.to_csv(index=False) + result_ls = [] + for csv_line in csv_table.strip().split("\n"): + if len(clean_whitespace(csv_line)) <= 1: + continue + result = most_similar_fuzzy(csv_line, clean_text) + result_ls.append(result) + + match_line_ls = [int(list(dct.values())[0]) for dct in result_ls] + + # Use min / max as start / end line of extraction + clean_text_lines = clean_text.split("\n") + clean_text_lines = [clean_whitespace(line) for line in clean_text_lines] + full_text_markup = ( + "\n".join(clean_text_lines[: min(match_line_ls)]) + + "\n" + + clean_df.to_markdown(index=False) + + "\n" + + "\n".join(clean_text_lines[max(match_line_ls) + 1 :]) + ) + + return clean_by_char_structure(full_text_markup) + + +def clean_by_char_structure(str_text): + """ + Description: + Clean string by vowel and tone mark structure. + Args: + str_text: input string. + Returns: + final_pdf: clean string. + """ + + str_text = str_text.replace(f"{chr(3661)}า", "ำ") + str_text = str_text.replace(f"{chr(3661) + chr(3656)}า", "่ำ") + str_text = str_text.replace(chr(139), chr(3656)) + str_text = str_text.replace(chr(140), chr(3657)) + str_text = str_text.replace(chr(141), chr(3658)) + str_text = str_text.replace(chr(142), chr(3659)) + + split_text = str_text.split("\n") + final_pdf = [] + for text in split_text: + result = "" + index_new = 0 + while index_new < len(text): + current_char = text[index_new] + + if ( + index_new > 0 + and index_new < len(text) - 2 + and not current_char.isascii() + ): + next_char = text[index_new + 1] + next_next_char = text[index_new + 2] + if next_char in [" ", chr(141)] and next_next_char in [ + chr(3655), + chr(3656), + chr(3657), + chr(3658), + chr(3659), + chr(3634), + chr(3635), + chr(3636), + chr(3637), + chr(3638), + chr(3632), + chr(3633), + chr(3640), + chr(3641), + ]: + result += current_char + next_next_char + index_new += 3 + continue + + result += current_char + index_new += 1 + + result_new = "" + index_new = 0 + while index_new < len(result): + current_char = result[index_new] + + if ( + index_new > 0 + and index_new < len(result) - 2 + and not current_char.isascii() + ): + next_char = result[index_new + 1] + if next_char in [" ", chr(141)] and current_char in [ + "แ", + "เ", + "ไ", + "โ", + "ใ", + ]: + result_new += current_char + index_new += 2 + continue + + result_new += current_char + index_new += 1 + + final_pdf.append(result_new) + + return "\n".join(final_pdf) diff --git a/src/data/openthaigpt_pretraining_data/pantip/text_cleaning.py b/src/data/openthaigpt_pretraining_data/pantip/text_cleaning.py new file mode 100644 index 0000000..82ae95d --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/pantip/text_cleaning.py @@ -0,0 +1,16 @@ +from bs4 import BeautifulSoup + + +def clean_html_tags(data: str): + """ + Description: + Remove HTML tags using BeautifulSoup. + Args: + data: Input string. + Returns: + clean_data: Text output without HTML tags. + """ + soup = BeautifulSoup(data, "html.parser") + cleaned_tags = soup.get_text(separator=" ") + + return cleaned_tags diff --git a/src/data/openthaigpt_pretraining_data/utils.py b/src/data/openthaigpt_pretraining_data/utils.py new file mode 100644 index 0000000..249e6e8 --- /dev/null +++ b/src/data/openthaigpt_pretraining_data/utils.py @@ -0,0 +1,9 @@ +import jsonlines + + +def read_jsonl(file_path: str): + data = [] + with jsonlines.open(file_path) as reader: + for line in reader.iter(skip_invalid=True): + data.append(line) + return data diff --git a/src/data/pyproject.toml b/src/data/pyproject.toml new file mode 100644 index 0000000..36d566c --- /dev/null +++ b/src/data/pyproject.toml @@ -0,0 +1,26 @@ +[build-system] +requires = ["setuptools>=40.8.0", "wheel"] + +[project] +name = "openthaigpt_pretraining_data" +version = "0.1.0" +description = "OpenThaiGPT Pretraining Task." +readme = "README.md" +requires-python = ">=3.8" +classifiers = ["Programming Language :: Python :: 3"] +dependencies = [ + "sentencepiece", + "datasets>=2.12.0", + "zstandard>=0.21.0", + "pythainlp>=4.0.0", + "kenlm==0.1", + "scipy==1.10.1", + "jsonlines==3.1.0", + "datasketch<2.0.0", + "nlpo3 >=1.3.0, <2", + "beautifulsoup4==4.12.2, < 5", + "scikit-learn==1.2.2, < 2", + "PyPDF2", + "pdf_table2json", + "gitpython==3.1.37, < 4" +] diff --git a/src/data/scripts/blind_pdpa/blind.py b/src/data/scripts/blind_pdpa/blind.py new file mode 100644 index 0000000..b3a83c4 --- /dev/null +++ b/src/data/scripts/blind_pdpa/blind.py @@ -0,0 +1,14 @@ +from openthaigpt_pretraining_data.blind_pdpa import ( + blind_pdpa, +) + +import hydra + + +@hydra.main(version_base=None, config_path="./config", config_name="blind_pdpa") +def main(cfg): + blind_pdpa(cfg.train_dataset, cfg.blind_config) + + +if __name__ == "__main__": + main() # type: ignore diff --git a/src/data/scripts/blind_pdpa/config/blind_pdpa.yaml b/src/data/scripts/blind_pdpa/config/blind_pdpa.yaml new file mode 100644 index 0000000..fc3c64e --- /dev/null +++ b/src/data/scripts/blind_pdpa/config/blind_pdpa.yaml @@ -0,0 +1,11 @@ +train_dataset: + key: openthaigpt + name: openthaigpt_pretraining_dataset + available_on_hub: False + path_name: /lustrefs/flash/scratch/lt200056-opgpth/HF_V5_555_Dataset_deduplicated_128_09_decontaminated_128_03 + subset: + +blind_config: + engine: openthaigpt + save_path: /lustrefs/flash/scratch/lt200056-opgpth/HF_V5_555_Dataset_deduplicated_128_09_decontaminated_128_03_blinded + num_proc: 128 \ No newline at end of file diff --git a/src/data/scripts/blind_pdpa/submit.sh b/src/data/scripts/blind_pdpa/submit.sh new file mode 100644 index 0000000..a5341a2 --- /dev/null +++ b/src/data/scripts/blind_pdpa/submit.sh @@ -0,0 +1,22 @@ +#!/bin/bash +#SBATCH -p compute +#SBATCH -N 1 -c 128 +#SBATCH --ntasks-per-node=1 +#SBATCH -t 05:00:00 +#SBATCH -A lt200056 +#SBATCH -J test + +module purge +module load Miniconda3/22.11.1-1 + +conda activate /project/lt200056-opgpth/decontamination/.conda/env + +export HF_DATASETS_CACHE="/project/lt200056-opgpth/openthaigpt-refactor/.cache" + +proxy_server=172.23.0.21:9631 +export http_proxy=http://$proxy_server +export HTTP_PROXY=$http_proxy +export https_proxy=http://$proxy_server +export HTTPS_PROXY=$https_proxy + +python ./src/data/scripts/blind_pdpa/blind.py \ No newline at end of file diff --git a/src/data/scripts/crawl_thaigov/.gitignore b/src/data/scripts/crawl_thaigov/.gitignore new file mode 100644 index 0000000..a53f1ad --- /dev/null +++ b/src/data/scripts/crawl_thaigov/.gitignore @@ -0,0 +1 @@ +/Thaigov_crawl_lists.csv diff --git a/src/data/scripts/crawl_thaigov/README.md b/src/data/scripts/crawl_thaigov/README.md new file mode 100644 index 0000000..4558693 --- /dev/null +++ b/src/data/scripts/crawl_thaigov/README.md @@ -0,0 +1,13 @@ +# ThaiGOV Dataset Crawler + +This script access https://www.thaigov.go.th website and crawl all news from it. + +## Instruction +1. Run `pip install ./src/data` and `pip install ./src/core` +2. dvc pull `Thaigov_crawl_lists.csv` +3. edit `Thaigov_crawl_lists.csv` to point to the latest news index +4. Run `python src/data/scripts/crawl_thaigov/nuch_crawl_thaigov_all.py` +5. The result will be in `test_crawl_lists.csv` + +## Characteristic of the data +Thai Government news website will be reset when the new government is formed, so please make sure to run the pipeline before the new government is form. \ No newline at end of file diff --git a/src/data/scripts/crawl_thaigov/Thaigov_crawl_lists.csv.dvc b/src/data/scripts/crawl_thaigov/Thaigov_crawl_lists.csv.dvc new file mode 100644 index 0000000..53c948a --- /dev/null +++ b/src/data/scripts/crawl_thaigov/Thaigov_crawl_lists.csv.dvc @@ -0,0 +1,5 @@ +outs: +- md5: d175f0f9d0d2661680588f9a9f6ee1e0 + size: 4849 + hash: md5 + path: Thaigov_crawl_lists.csv diff --git a/src/data/scripts/crawl_thaigov/nuch_crawl_thaigov_all.py b/src/data/scripts/crawl_thaigov/nuch_crawl_thaigov_all.py new file mode 100644 index 0000000..42ac1e8 --- /dev/null +++ b/src/data/scripts/crawl_thaigov/nuch_crawl_thaigov_all.py @@ -0,0 +1,166 @@ +from bs4 import BeautifulSoup +import requests +import pandas as pd +from tqdm.auto import tqdm + +import re + + +def get_soup_by_url(url, if_verify=True): + """ + Request.get url, for untrustes ssl: if_verify = False + Return set , if succeess request -> (True, soup text), else --> (false, status code) + """ + res = requests.get( + url, verify=if_verify + ) # requested url got untrusted SSL certificate have to ignore by verify = False + res.encoding = "utf-8" + + if res.status_code == 200: + return (True, BeautifulSoup(res.text, "html.parser")) + else: + print(res.status_code) + return (False, res.status_code) + + +def get_soup_dict(soup_in): + """ + get_soup_dict(soup_in) -> dict + get contents in class = "panel-body" and extract as dict + + soup_in is soup in final url that contains detailed target + (aka actual individual news) + """ + # Extract body contents + soup_in_pbody = soup_in.find_all("div", class_="panel-body") + cur_pbody = soup_in_pbody[0] + + # Extract text on desired element + cur_head = cur_pbody.find("div", class_="panel-heading clearfix Circular") + cur_hidden = cur_pbody.find("p", class_="col-xs-8 remove-xs color7") + cur_date = cur_pbody.find( + "div", class_="col-xs-12 col-sm-6 col-md-5 news-2 font_level3 text-right" + ) + if cur_date is not None: + cur_date_clean = cur_date.text.strip()[: cur_date.text.strip().find("\n")] + else: + cur_date_clean = None + + cur_h3 = cur_pbody.h3 + cur_title = cur_pbody.find("p", class_="font_level2 Circular color3") + cur_detail = cur_pbody.find("div", class_="col-xs-12 padding-sm1 news-2 Circular") + + # Create dict + cur_content = { + "panel_heading": cur_head.text.strip(), + "hidden_date": cur_hidden.text.strip(), + "date": cur_date_clean, + "h3": cur_h3.text.strip(), + "title": cur_title.text.strip(), + "detail": cur_detail.text.strip(), + } + + return cur_content + + +requests.packages.urllib3.disable_warnings( + requests.packages.urllib3.exceptions.InsecureRequestWarning +) + +# Get list for crawling, extract only the site with news_format contents +site_map = pd.read_csv("src/data/scripts/crawl_thaigov/Thaigov_crawl_lists.csv") +crawl_list = site_map.loc[site_map["news_format"] == "y", ["href"]] + +# Create df for receiving data +content_news = pd.DataFrame( + { + "panel_heading": [], + "url": [], + "hidden_date": [], + "date": [], + "h3": [], + "title": [], + "detail": [], + } +) +error_urls = pd.DataFrame({"url": [], "error_code": []}) + +for list in crawl_list.href: + url_news_main = list + # get soup (html content) + soup = get_soup_by_url(url_news_main, False) + + # get contents from first page of url_news_main (No ?per_page=) + if soup[0] is True: + # list all 10 url of news content on each per_page + soup_pbody = soup[1].find_all("div", class_="panel-body") + soup_a = soup_pbody[0].find_all("a") + + # get soup_dict of each url in page + for a in soup_a: + soup_in_url = a.get("href") + soup_in = get_soup_by_url(soup_in_url, False) + if soup_in[0] is True: + cur_dict = get_soup_dict(soup_in[1]) + cur_dict["url"] = soup_in_url + # Add to content_news dataframe + content_news.loc[len(content_news)] = cur_dict + else: + error_urls.loc[len(error_urls)] = { + "url": soup_in_url, + "error_code": soup_in[1], + } + + # get number of max page for page looping + soup_page = soup[1].find_all("ul", class_=re.compile("^pagination color")) + soup_page_li = soup_page[0].find_all("li") + soup_page_li = sorted( + soup_page_li, + key=lambda x: int(x.a["data-ci-pagination-page"]) + if "data-ci-pagination-page" in x.a.attrs + else 0, + ) + max_page = int(soup_page_li[-1].a["data-ci-pagination-page"]) + + # Start looping next page + url_get_page = url_news_main + "?per_page=" + + for i in tqdm(range(1, max_page), total=max_page - 1): + url_page = url_get_page + str( + i * 10 + ) # req per_page is to load 10 contents on each page + soup = get_soup_by_url(url_page, False) + print(url_page) + + if soup[0] is True: + soup_pbody = soup[1].find_all("div", class_="panel-body") + soup_a = soup_pbody[0].find_all( + "a" + ) # list all 10 url of news content on each per_page + + # get soup_dict of each url in page + for a in soup_a: + soup_in_url = a.get("href") + soup_in = get_soup_by_url(soup_in_url, False) + if soup_in[0] is True: + cur_dict = get_soup_dict(soup_in[1]) + cur_dict["url"] = soup_in_url + content_news.loc[len(content_news)] = cur_dict + else: + error_urls.loc[len(error_urls)] = { + "url": soup_in_url, + "error_code": soup_in[1], + } + else: + error_urls.loc[len(error_urls)] = { + "url": url_page, + "error_code": soup[1], + } + + else: + # print("URL error: "+url) + error_urls.loc[len(error_urls)] = {"url": url_news_main, "error_code": soup[1]} + + +content_news.to_csv("test_crawl_lists.csv", index=False) +# error_urls diff --git a/src/data/scripts/decontamination/README.md b/src/data/scripts/decontamination/README.md new file mode 100644 index 0000000..b78eca8 --- /dev/null +++ b/src/data/scripts/decontamination/README.md @@ -0,0 +1,158 @@ +# OpenThaiGPT Decontamination Pipeline + +## Description + +The OpenThaiGPT Decontamination Pieline is designed to combat leaking of training dataset into evaluation process. The goal of this pipeline is to identify and remove potentially duplicated documents used in evlaution process from pretraining dataset. +This contamination check is based on N-Gram MinHash and LSH (Locality-Sensitive Hashing) techniques inspired by the methods presented in this . + +![deduplication_diagram](decontaminate_diagram.png) + +## Workflow + +1. Evaluation Dataset Processing: + +- Load all evaluation datasets. +- Tokenize the content of the text column using the newmm tokenizer from the nlpo3 library. +- Compute N-Gram MinHash for each tokenized text. +- Save each dataset (content and minhash) separately in a pickle format. + +2. Pretraining Dataset Processing: + +- Load the Huggingface pretraining dataset from the specified path. +- Compute the MinHash for the pretraining dataset. +- Store the computed MinHash results on disk in a Huggingface dataset format. + +3. LSH Indexing: + +- For each evaluation dataset, load its MinHash values into an LSH index. + +4. Query & Neighbor Identification: + +- Compare the entire pretraining dataset against the LSH index of each evaluation dataset. +- Save indices of documents with a similarity score exceeding the defined threshold, marking them as potential contamination. + +5. Contamination Check: + +- For each document in the pretraining dataset, compute the approximate Jaccard distance with its potential contaminated documents. +- Compute approximate jaccard of score surpasses the threshold, mark the document as contaminated. + +6. Document Removal: + +- Remove all identified contaminated documents from the pretraining dataset. + +7. Saving the Dataset: + +- Store the decontaminated documents in a new Huggingface dataset on disk. +- Store the index and data of contaminated document pair into `contaminated_results_{num_perm}.csv` file. + +## Usage + +**Prerequisites:** Install openthai-gpt-data depedencies because running this code [link](/src/data/README.md) + +Conda + +``` +python ./src/data/scripts/decontamination/decontaminate.py +``` + +Apptainer + +``` +apptainer run -B /lustrefs/flash/scratch --home /project/lt200056-opgpth/openthaigpt-refactor image_sandbox python ./src/data/scripts/decontamination/decontaminate.py +``` + +Note: + +- We run it on ThaiSC Lanta's scratch disk to improve the I/O performance +- We tested it with Apptainer, but conda python should also work +- We run it on Memory node of Lanta but Compute node should also work without OOM +- Command `export HF_DATASETS_CACHE="/project/lt200056-opgpth/openthaigpt-refactor/.cache"` is needed to prevent Huggingface storing cache in home directory and empty disk storage quota. + +## I/O + +`Huggingface input dataset format` + +```json +{ + "train": ["text", ...], // column names + "validate": ["text", ...] // column names + ... +} +``` + +`config/deduplicaiton.yaml` + +```yaml + +defaults: + - datasets: + - Name of the files inside `condig/datasets` directory + ... + +train_dataset: + key: openthaigpt + name: openthaigpt_pretraining_dataset + available_on_hub: False + path_name: Path of the pretraining datset + split: Choose Split to use from Huggingface Dataset ex. 'train' + col_name: Column name to process # text + +minhash: + newmm_dict: Path to store NewMM Dict + save_path: Path to store minhash + +decontaminate: + thresold: jaccard similarity and LSH thresold 0.3 + minhash_path: Path to store minhash + save_path: Path to save deduplicated dataset (For further training usage) + +global_config: + num_process: Process need to use (128 on Lanta) + num_perm: Permutation number to use with MinHash (default 128) + +train_dataset: + split: Choose Split to use from Huggingface Dataset ex. 'train' + +minhash: + save_path: Path to store minhash + +deduplication: + thresold: jaccard similarity and LSH thresold 0.9 + minhash_path: Path to store minhash + save_path: Path to save deduplicated dataset (For further training usage) + save_path_duplicated: path to save duplicated dataset (for EDA) + batch_size: batch size for huggingface map function + +global_config: + num_process: Process need to use (128 on Lanta) + num_perm: Permutation number to use with MinHash (default 128) +``` + +`config/datasets/dataset_name.yaml` + +Load from Huggingface hub case + +```yaml +xquad: + name: xquad # For reference + available_on_hub: True + path_name: xquad # Must be available name on Huggingface hub + split: validation + subset: xquad.th # Some dataset has subset, if not can leave blank +``` + +Load from disk case. + +```yaml +lst20: + name: LST20 # For reference + available_on_hub: True + path_name: lst20 + path: /scratch/lt200056-opgpth/LST20_Corpus + split: validation + subset: +``` + +## Default Parameters + +- `N_GRAM` = 5 diff --git a/src/data/scripts/decontamination/config/datasets/copa_thai.yaml b/src/data/scripts/decontamination/config/datasets/copa_thai.yaml new file mode 100644 index 0000000..85ffc7c --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/copa_thai.yaml @@ -0,0 +1,6 @@ +copa_thai: + name: copa_th + available_on_hub: True + path_name: Patt/copa_th + split: validation + subset: diff --git a/src/data/scripts/decontamination/config/datasets/hellaswag_thai.yaml b/src/data/scripts/decontamination/config/datasets/hellaswag_thai.yaml new file mode 100644 index 0000000..1aab758 --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/hellaswag_thai.yaml @@ -0,0 +1,6 @@ +hellaswag_thai: + name: HellaSwag_thai + available_on_hub: True + path_name: Patt/HellaSwag_thai + split: validation + subset: \ No newline at end of file diff --git a/src/data/scripts/decontamination/config/datasets/lst20.yaml b/src/data/scripts/decontamination/config/datasets/lst20.yaml new file mode 100644 index 0000000..7f2b015 --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/lst20.yaml @@ -0,0 +1,7 @@ +lst20: + name: LST20 + available_on_hub: True + path_name: lst20 + path: /scratch/lt200056-opgpth/LST20_Corpus + split: validation + subset: diff --git a/src/data/scripts/decontamination/config/datasets/lst20_test.yaml b/src/data/scripts/decontamination/config/datasets/lst20_test.yaml new file mode 100644 index 0000000..a4c1bba --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/lst20_test.yaml @@ -0,0 +1,7 @@ +lst20_test: + name: LST20_Test + available_on_hub: True + path_name: lst20 + path: /scratch/lt200056-opgpth/LST20_Corpus + split: test + subset: diff --git a/src/data/scripts/decontamination/config/datasets/multirc_thai.yaml b/src/data/scripts/decontamination/config/datasets/multirc_thai.yaml new file mode 100644 index 0000000..ee5a4c5 --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/multirc_thai.yaml @@ -0,0 +1,6 @@ +multirc_thai: + name: MultiRC_TH + available_on_hub: True + path_name: Patt/MultiRC_TH + split: validation + subset: diff --git a/src/data/scripts/decontamination/config/datasets/record_thai.yaml b/src/data/scripts/decontamination/config/datasets/record_thai.yaml new file mode 100644 index 0000000..38c4871 --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/record_thai.yaml @@ -0,0 +1,6 @@ +record_thai: + name: Record + available_on_hub: True + path_name: Patt/ReCoRD_TH + split: validation + subset: \ No newline at end of file diff --git a/src/data/scripts/decontamination/config/datasets/rte_thai.yaml b/src/data/scripts/decontamination/config/datasets/rte_thai.yaml new file mode 100644 index 0000000..a7132d6 --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/rte_thai.yaml @@ -0,0 +1,6 @@ +rte_thai: + name: RTE_TH + available_on_hub: True + path_name: Patt/RTE_TH + split: validation + subset: \ No newline at end of file diff --git a/src/data/scripts/decontamination/config/datasets/ted_talks_iwslt_th_en.yaml b/src/data/scripts/decontamination/config/datasets/ted_talks_iwslt_th_en.yaml new file mode 100644 index 0000000..c3b227c --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/ted_talks_iwslt_th_en.yaml @@ -0,0 +1,6 @@ +ted_talks_iwslt_th_en: + name: ted_talks_iwslt_th_en + available_on_hub: False + path_name: /project/lt200056-opgpth/lm-evaluation-harness/ted_talks_iwslt_th_en + split: test + subset: diff --git a/src/data/scripts/decontamination/config/datasets/thaisum.yaml b/src/data/scripts/decontamination/config/datasets/thaisum.yaml new file mode 100644 index 0000000..f03ca9a --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/thaisum.yaml @@ -0,0 +1,6 @@ +thaisum: + name: thaisum + available_on_hub: True + path_name: thaisum + split: validation + subset: diff --git a/src/data/scripts/decontamination/config/datasets/thaisum_test.yaml b/src/data/scripts/decontamination/config/datasets/thaisum_test.yaml new file mode 100644 index 0000000..ca4ec18 --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/thaisum_test.yaml @@ -0,0 +1,6 @@ +thaisum_test: + name: thaisum_test + available_on_hub: True + path_name: thaisum + split: test + subset: diff --git a/src/data/scripts/decontamination/config/datasets/xquad.yaml b/src/data/scripts/decontamination/config/datasets/xquad.yaml new file mode 100644 index 0000000..ad7c2f3 --- /dev/null +++ b/src/data/scripts/decontamination/config/datasets/xquad.yaml @@ -0,0 +1,6 @@ +xquad: + name: xquad + available_on_hub: True + path_name: xquad + split: validation + subset: xquad.th diff --git a/src/data/scripts/decontamination/config/decontamination.yaml b/src/data/scripts/decontamination/config/decontamination.yaml new file mode 100644 index 0000000..b2666fe --- /dev/null +++ b/src/data/scripts/decontamination/config/decontamination.yaml @@ -0,0 +1,35 @@ +defaults: + - datasets: + - copa_thai + - hellaswag_thai + - lst20 + - lst20_test + - multirc_thai + - record_thai + - rte_thai + - thaisum + - thaisum_test + - xquad + - ted_talks_iwslt_th_en + +train_dataset: + key: openthaigpt + name: openthaigpt_pretraining_dataset + available_on_hub: False + path_name: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal_deduplicated_128_09 + split: train + subset: + col_name: text + +minhash: + newmm_dict: ./src/data/openthaigpt_pretraining_data/core/words_th.txt + save_path: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal_deduplicated_128_09_minhash_128 + +decontaminate: + thresold: 0.3 + minhash_path: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal_deduplicated_128_09_minhash_128 + save_path: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal_deduplicated_128_09_decontaminated_128_03 + +global_config: + num_process: 128 + num_perm: 128 \ No newline at end of file diff --git a/src/data/scripts/decontamination/decontaminate.py b/src/data/scripts/decontamination/decontaminate.py new file mode 100644 index 0000000..bd3de76 --- /dev/null +++ b/src/data/scripts/decontamination/decontaminate.py @@ -0,0 +1,16 @@ +from openthaigpt_pretraining_data.decontamination.decontamintate import decontaminate +from openthaigpt_pretraining_data.decontamination.generate_minhash import ( + generate_minhash, +) + +import hydra + + +@hydra.main(version_base=None, config_path="./config", config_name="decontamination") +def main(cfg): + generate_minhash(cfg.datasets, cfg.train_dataset, cfg.minhash, cfg.global_config) + decontaminate(cfg.datasets, cfg.train_dataset, cfg.decontaminate, cfg.global_config) + + +if __name__ == "__main__": + main() # type: ignore diff --git a/src/data/scripts/decontamination/decontaminate_diagram.png b/src/data/scripts/decontamination/decontaminate_diagram.png new file mode 100644 index 0000000..b34360b Binary files /dev/null and b/src/data/scripts/decontamination/decontaminate_diagram.png differ diff --git a/src/data/scripts/decontamination/submit.sh b/src/data/scripts/decontamination/submit.sh new file mode 100644 index 0000000..57adeaa --- /dev/null +++ b/src/data/scripts/decontamination/submit.sh @@ -0,0 +1,19 @@ +#!/bin/bash +#SBATCH -p compute +#SBATCH -N 1 -c 128 +#SBATCH --ntasks-per-node=1 +#SBATCH -t 5:00:00 +#SBATCH -A lt200056 +#SBATCH -J test + +module purge +module load Apptainer +export HF_DATASETS_CACHE="/project/lt200056-opgpth/openthaigpt-refactor/.cache" + +proxy_server=172.23.0.21:9631 +export http_proxy=http://$proxy_server +export HTTP_PROXY=$http_proxy +export https_proxy=http://$proxy_server +export HTTPS_PROXY=$https_proxy + +apptainer run -B /lustrefs/flash/scratch --home /project/lt200056-opgpth/openthaigpt-refactor image_sandbox python ./src/data/scripts/decontamination/decontaminate.py \ No newline at end of file diff --git a/src/data/scripts/deduplication/README.md b/src/data/scripts/deduplication/README.md new file mode 100644 index 0000000..5c4018d --- /dev/null +++ b/src/data/scripts/deduplication/README.md @@ -0,0 +1,100 @@ +# OpenThaiGPT Deuplication Pipeline + +## Description + +The OpenThaiGPT Deduplication Pipeline is designed to remove duplicated entries from the Huggingface datasets. By using the techniques similar to this [paper](https://arxiv.org/abs/2107.06499), the pipeline uses the N-Gram MinHash approach in combination with LSH (Locality-Sensitive Hashing) to identify and eliminate duplicate content. + +![deduplication_diagram](deduplication_diagram.png) + +## Workflow + +1. Dataset Preparation: + +- Load the Huggingface dataset from the specified path. +- Tokenize the content in the text column using the newmm tokenizer from the nlpo3 library. +- Compute N-Gram MinHash for the tokenized text. + Store the MinHash results in a Huggingface dataset format on disk. + +2. LSH Indexing: + +- Load the computed MinHash dataset alongside the original dataset. +- Index the MinHash of all documents using LSH. + +3. Neighbor Identification: + +- Query each pretraining document on against the LSH index. +- Marking neighbors that have a similarity score exceeding the defined threshold as potentially duplicated. + +4. Duplicate Detection: + +- For each potentially duplicated document, compute the approximate Jaccard distance with its identified neighbors. +- Mark documents with Jaccard scores surpassing the threshold as duplicates. + +5. Duplicate Removal: + +- Extract all identified duplicate documents from the original dataset. + +6. Saving the Deduplicated Dataset: + +- Store the deduplicated documents in a new Huggingface dataset on disk. +- Save all identified duplicate documents in a separate Huggingface dataset format. This provides a record of duplicates for reference or potential restoration. + +## Usage + +**Prerequisites:** Install openthai-gpt-data depedencies because running this code [link](/src/data/README.md) + +Conda + +``` +python ./src/data/scripts/deduplication/deduplicate.py +``` + +Apptainer + +``` +apptainer run -B /lustrefs/flash/scratch --home /project/lt200056-opgpth/openthaigpt-refactor image_sandbox python ./src/data/scripts/deduplication/deduplicate.py +``` + +Note: + +- We run it on ThaiSC Lanta's scratch disk to improve the I/O performance +- We tested it with Apptainer, but conda python should also work +- We run it on Memory node of Lanta but Compute node should also work without OOM +- Command `export HF_DATASETS_CACHE="/project/lt200056-opgpth/openthaigpt-refactor/.cache"` is needed to prevent Huggingface storing cache in home directory and empty disk storage quota. + +## I/O + +`Huggingface input dataset format` + +```json +{ + "train": ["text", ...], // column names + "validate": ["text", ...] // column names + ... +} +``` + +`config/deduplicaiton.yaml` + +```yaml +train_dataset: + split: Choose Split to use from Huggingface Dataset ex. 'train' + +minhash: + save_path: Path to store minhash + +deduplication: + thresold: jaccard similarity and LSH thresold 0.9 + minhash_path: Path to store minhash + save_path: Path to save deduplicated dataset (For further training usage) + save_path_duplicated: path to save duplicated dataset (for EDA) + batch_size: batch size for huggingface map function + +global_config: + num_process: Process need to use (128 on Lanta) + num_perm: Permutation number to use with MinHash (default 128) +``` + +## Default Parameters + +- `N_GRAM` = 5 diff --git a/src/data/scripts/deduplication/config/deduplication.yaml b/src/data/scripts/deduplication/config/deduplication.yaml new file mode 100644 index 0000000..0b35ba0 --- /dev/null +++ b/src/data/scripts/deduplication/config/deduplication.yaml @@ -0,0 +1,22 @@ +train_dataset: + key: openthaigpt + name: openthaigpt_pretraining_dataset + available_on_hub: False + path_name: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal + split: train + subset: + +minhash: + newmm_dict: ./src/data/openthaigpt_pretraining_data/core/words_th.txt + save_path: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal_minhash_128 + +deduplication: + thresold: 0.9 + minhash_path: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal_minhash_128 + save_path: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal_deduplicated_128_09 + save_path_duplicated: /lustrefs/flash/scratch/lt200056-opgpth/HF_V6_Colassal_duplicated_128_09 + batch_size: 10000 + +global_config: + num_process: 128 + num_perm: 128 \ No newline at end of file diff --git a/src/data/scripts/deduplication/deduplicate.py b/src/data/scripts/deduplication/deduplicate.py new file mode 100644 index 0000000..7ab6f3b --- /dev/null +++ b/src/data/scripts/deduplication/deduplicate.py @@ -0,0 +1,16 @@ +from openthaigpt_pretraining_data.deduplication.deduplication import deduplicate +from openthaigpt_pretraining_data.deduplication.generate_minhash import ( + generate_minhash, +) + +import hydra + + +@hydra.main(version_base=None, config_path="./config", config_name="deduplication") +def main(cfg): + generate_minhash(cfg.train_dataset, cfg.minhash, cfg.global_config) + deduplicate(cfg.train_dataset, cfg.deduplication, cfg.global_config) + + +if __name__ == "__main__": + main() # type: ignore diff --git a/src/data/scripts/deduplication/deduplication_diagram.png b/src/data/scripts/deduplication/deduplication_diagram.png new file mode 100644 index 0000000..8bea9f8 Binary files /dev/null and b/src/data/scripts/deduplication/deduplication_diagram.png differ diff --git a/src/data/scripts/deduplication/submit.sh b/src/data/scripts/deduplication/submit.sh new file mode 100644 index 0000000..c8fbb2c --- /dev/null +++ b/src/data/scripts/deduplication/submit.sh @@ -0,0 +1,17 @@ +#!/bin/bash +#SBATCH -p memory +#SBATCH -N 1 -c 128 +#SBATCH --ntasks-per-node=1 +#SBATCH -t 20:00:00 +#SBATCH -A lt200056 +#SBATCH -J test + +ml Miniconda3 + +conda deactivate +conda activate oscar_collosal + +export HF_DATASETS_CACHE="/project/lt200056-opgpth/openthaigpt-refactor/.cache" + +python ./src/data/scripts/deduplication/deduplicate.py +python ./src/data/scripts/decontamination/decontaminate.py \ No newline at end of file diff --git a/src/data/scripts/huggingface_create/README.md b/src/data/scripts/huggingface_create/README.md new file mode 100644 index 0000000..88ac1f2 --- /dev/null +++ b/src/data/scripts/huggingface_create/README.md @@ -0,0 +1,40 @@ +# Hugging Face Dataset Creation Script +This script is designed to create datasets for use with the Hugging Face Transformers library. It takes JSONL files containing data and converts them into a format compatible with the Hugging Face Datasets library. The resulting dataset can then be easily loaded and used for training and evaluation in various NLP tasks. + +## Usage +This script is intended to be used for creating custom datasets that can be utilized with Hugging Face Transformers. It takes as input a set of JSONL files containing data and produces a Hugging Face dataset in the desired format. + +## Dependencies +Before using this script, make sure you have the following dependencies installed: + +datasets==2.12.0 +pandas==2.0.2 +tqdm==4.65.0 +You can typically install these dependencies using pip: + +```bash +pip install datasets==2.12.0 pandas==2.0.2 tqdm==4.65.0 +``` + +## How to Run +You can run this script from the command line with the following command: + +```bash +python script.py --train_path --eval_path --output_path +``` + +train_path: Path to the directory containing the training JSONL files. +eval_path: Path to the directory containing the evaluation JSONL files. +output_path: Path to the directory where the resulting dataset will be saved. + +## Input Data Format +The input data should be in JSONL (JSON Lines) format, where each line represents a JSON object. Each JSON object represents a data instance with one or more fields. + +The script assumes that all JSON objects within the JSONL files have the same set of keys. If some keys are missing in certain objects, they will be added with a default value of None. + +## Output Data Format +The script converts the input JSONL data into a Hugging Face dataset format. The resulting dataset is saved as a directory, and it contains two splits: + +train: The training split. +eval: The evaluation split. +Each split is stored as a set of Arrow files and can be loaded and used with Hugging Face Datasets library. \ No newline at end of file diff --git a/src/data/scripts/huggingface_create/hf_create.py b/src/data/scripts/huggingface_create/hf_create.py new file mode 100644 index 0000000..81341a3 --- /dev/null +++ b/src/data/scripts/huggingface_create/hf_create.py @@ -0,0 +1,63 @@ +import argparse +from datasets import Dataset, concatenate_datasets, DatasetDict +import glob +import json +import pandas as pd +from tqdm import tqdm + + +def load_data(filepaths): + dataframes = [] + all_keys = set() + for filepath in tqdm(filepaths): + with open(filepath, "r") as f: + lines = f.readlines() + json_lines = [json.loads(line) for line in lines] + + # Find all unique keys in the JSON data + for line in json_lines: + all_keys.update(line.keys()) + + data = [] + for line in json_lines: + # Add missing keys with default value None + normalized_line = {key: line.get(key, None) for key in all_keys} + # Normalize values to strings + normalized_line = { + key: str(value) for key, value in normalized_line.items() + } + data.append(normalized_line) + + dataframes.append(Dataset.from_pandas(pd.DataFrame(data))) + return concatenate_datasets(dataframes) + + +def main(train_path, eval_path, output_path): + # Get all file paths for train and eval + train_filepaths = glob.glob(train_path) + eval_filepaths = glob.glob(eval_path) + + # Load and concatenate datasets + train_dataset = load_data(train_filepaths).shuffle(seed=42) + eval_dataset = load_data(eval_filepaths).shuffle(seed=42) + + # Combine train and eval datasets into one dictionary + datasets = DatasetDict( + { + "train": train_dataset, + "eval": eval_dataset, + } + ) + + datasets.save_to_disk(output_path) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Dataset Loader") + parser.add_argument("--train_path", required=True, help="Path to train JSONL files") + parser.add_argument("--eval_path", required=True, help="Path to eval JSONL files") + parser.add_argument("--output_path", required=True, help="Path to save the dataset") + + args = parser.parse_args() + + main(args.train_path, args.eval_path, args.output_path) diff --git a/src/data/scripts/input.jsonl b/src/data/scripts/input.jsonl new file mode 100644 index 0000000..944a388 --- /dev/null +++ b/src/data/scripts/input.jsonl @@ -0,0 +1,8 @@ +{"text":"""ufabet 88 แทงบอลได้ใน 1 อาทิตย์"""} +{"text":"""เสือโคร่ง หรือ เสือลายพาดกลอน เป็นสัตว์เลี้ยงลูกด้วยน้ำนมอันดับสัตว์กินเนื้อ มีชื่อวิทยาศาสตร์ว่า Panthera tigris"""} +{"text":"""กันยายน พฤษภาคม มิถุนายน"""} +{"text":"""Posted by: น้องม่อน กินข้าววันไหนดี"""} +{"text":"""แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ ป การศ กษา 2555\nDownload "แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ ป การศ กษา 2555"\nแผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ จ ดท าข นจากข อเสนอแนะของ คณะกรรมการประเม นค ณภาพภายในมหาว ทยาล ยพาย พ ประจ า 2554 ประกอบด วยข อม ล 2 ส วนด งน 1. เอกสารส วนหน า (ร าง) แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ ข อม ลท ใช ในการจ ดท า : ข อเสนอแนะในภาพรวม 2. เอกสารแนบ แนวทางปร บปร งแก ไขเพ อพ ฒนาค ณภาพ ข อม ลท ใช ในการจ ดท า : ข อเสนอแนะรายองค ประกอบ หมายเหต มหาว ทยาล ยพาย พจะพ จารณาปร บงบประมาณกลาง เพ อรองร บแผนพ ฒนา ค ณภาพ เป นส าค ญ\nประเด น (องค ประกอบค ณภาพ ต วบ งช ท เก ยวข อง) ความเช อมโยงก บ แผนงานต างๆ (ต วบ งช : kpi) ต วบ งช ความส าเร จ ตามประเด น ค าเป าหมาย ความส าเร จ ตามประเด น แผนงาน โครงการ หร อแนวทางการด าเน นงาน ในการให บร การทางว ชาการ แล ว งบประมาณ ผ ร บผ ดชอบ ระยะเวลา การรายงาน ข อม ล 2 มหาว ทยาล ยพาย พจะ สน บสน นและอ านวย ความสะดวกในการท า ว จ ยของอาจารย มาก ข น (องค ประกอบ 4 ต วบ งช สกอ. 4.1, 4.2, 4.3 ต วบ งช สมศ. 5, 6) แผนกลย ทธ 55-59: (kpi 13, 15, 16, 17, 42) แผนปฏ บ ต การ 55 : (kpi 18, 20, 21, 22, 47) แผนบร หารความ เส ยง 55 ร อยละของ จ านวน อาจารย ประจ า ท ท าว จ ยต อ จ านวน อาจารย ท งหมด ร อยละ 25 1.จ ดเจ าหน าท ส าน กว จ ยไปด แลและอ านวยความสะดวก ในการท าว จ ยเป นรายคณะว ชา 2.ปร บปร งข นตอนการ"""} +{"text":"""http://www.dobrolubie.ru/forum/index.php?showuser=59153\nhttp://www.uzsat.net/index.php?showuser=22989 ตัวหนังสือแทรก\nhttp://www.prevedrussia.ru/projectrussiaclub/forum/index.php?showuser=17747\nมีข้อความข้างหน้า http://www.bizmama.ru/forum/index.php?showuser=35150 มีข้อความต่อ\nhttp://forum.streetbox.ru/index.php?s=0e393c8c0bffcf96760525b9fcfa164c&showuser=41952 มีข้อความต่อไป\nalibaba.com shopee.co.th look.mp4 data.pdf\nห้อง.เดี่ยว ปลาทอง.jp"""} +{"text":"""สวัสดีครับ [abcdefghi] วันนี้อากาศร้อน [asdfgsgsdg] ระวังโรคลมแดด [abcdefg][...]« ตอบ ข้อความที่อยู่ระหว่าง » เดี๋ยวไม่สบาย << ก็มันร้อนจริงๆ >>"""} +{"text":"""ตัว code embedded server-side <% if ( total_view > 0 ) { %> <%= total_view > 1 ? "total views" : "total view" %> <% if ( today_view > 0 ) { %> <%= today_view > 1 ? "views today" : "view today" %> no views today No views yet <% uncompleted format"""} diff --git a/src/data/scripts/internet/README.md b/src/data/scripts/internet/README.md new file mode 100644 index 0000000..814e1c8 --- /dev/null +++ b/src/data/scripts/internet/README.md @@ -0,0 +1,66 @@ +# Internet script + +This folder contains a script `main.py` to process internet dataset including OSCAR, mc4, and cc100. + +## How does the code work ? + +1. Read data from provided source. +2. Filter data and replace some part using regex patterns created from the studies of mc4 and OSCAR to remove garbage texts. +3. The perplexity of remain texts will be computed and use to filter more garbage data. The clean texts **`C`** will be the remaining. +4. The subset **`S`** of garbage texts from step 3 will be randomly selected. +5. Concat **`C`** and **`S`** to construct the final dataset. +6. Create metadata for the result (`created date`, `updated date`, `id`, `metadata`) + +For part 2-5, You can see each part in more details at `src/data/openthaigpt_pretraining_data/internet` + +## Running + +You can also process the internet data via running `main.py` + +Before running. please dvc pull `core.zip`. It contains an n-gram language model weight and Decision Tree classifier. + +### DVC Pull instruction + +First please request dvc pull credentials from this [link](https://docs.google.com/forms/d/e/1FAIpQLSeXrHMGpmRM9Wj4AVXT5WIl7w96wuhjPUnbU0jCs5Ujb0LL_w/viewform) + +After you received credentials, download your credentials file to local repository, and run + +```bash +export GOOGLE_APPLICATION_CREDENTIALS= path/to/yourfile +dvc push src/data/openthaigpt_pretraining_data/internet/perplexity/core.zip.dvc +``` + +### Running Example +```bash +cd src/data/scripts/internet +python main.py --config_filename=config/cc100_config.yaml +``` +This code will read the datasets, process, and save the output in jsonl format. + +### Config + +This file will read config from file in `config_filename` (Default is `config/internet_config.yaml`). Specify config_filename arguments with your preferred config or edit the default file when run. + +##### Config fields + +The `input_dataset` and `output_dataset` and their subconfig follow the new data pipeline's format. + +`Processing parameters` +- `num_proc` : Number of process to use in program. +- `batch_size` : Size of data chunks to be process in a single step of loading. +- `do_perplexity` : `True` or `False`. Indicates if we should do Step 3-4 in `What will the code do ?` +- `sampled_back_ratio` : Float number in range 0-1. Indicates the ratio between the number bad data to be sampled back in step 4 and the number of all bad data. This is used only when `do_perplexity` set to `True` + +## Note + +- Since the code didn't use any deep learning model, **_you don't need and shouldn't use the GPU_** to run the code +- The code was meant to process the original mc4, cc100, OSCAR on LANTA. +- If you want to process custom data using this pipeline, you should prepare your huggingface dataset directory with these required fields + - `text` : A text document you want to process + - `created_date` : Timestamp of the created date of data + - `source_id` : Integer id for each text document + Also add your custom config file in `config` and run with + ```bash + python main.py config=your_custom_config +- The reason we sample text back in step use sampled garbage text is **_to teach the LLM few inappropriate words_**. +- If `do_perplexity` is set to True and you want to sampled some bad data back, the `--batch_size` should be large enough to form the distribution in step 4 (Greater than 1000 should be fine). diff --git a/src/data/scripts/internet/config/internet_config.yaml b/src/data/scripts/internet/config/internet_config.yaml new file mode 100644 index 0000000..dd9c0ed --- /dev/null +++ b/src/data/scripts/internet/config/internet_config.yaml @@ -0,0 +1,15 @@ +input_dataset: + path: /project/lt200056-opgpth/mond_tmp_datasets/raw_datasets/public/cc100 + +output: + path: /project/lt200056-opgpth/mond_tmp_datasets/jsonl/cc100/raw + scratch_path: /lustrefs/flash/scratch/lt200056-opgpth/temp_dataset/cc100 + version: 1 + +processing_parameters: + num_proc: 128 + do_perplexity: True + batch_size: 1000 + sampled_back_ratio: 0.6 + +note: \ No newline at end of file diff --git a/src/data/scripts/internet/main.py b/src/data/scripts/internet/main.py new file mode 100644 index 0000000..ec461a2 --- /dev/null +++ b/src/data/scripts/internet/main.py @@ -0,0 +1,259 @@ +from datasets import load_dataset, load_from_disk, Dataset +import datetime # type: ignore +import jsonlines +from openthaigpt_pretraining_data.internet.mc4.preprocess import ( + clean_text as clean_mc4_text, +) +from openthaigpt_pretraining_data.internet.oscar.preprocess import ( + clean_text as clean_oscar_text, +) + +from openthaigpt_pretraining_data.internet.perplexity.perplexity import ( + classify_spam, + sample_text_back, +) +from openthaigpt_pretraining_data.core.processing_config import load_config +from openthaigpt_pretraining_data.core.metadata import ( + create_info_file, + create_metadata_file, +) +import numpy as np +import scipy +import json +import os +import zstandard as zstd +import argparse # type: ignore + +parser = argparse.ArgumentParser() +parser.add_argument( + "--config_filename", + help="Filename of yaml file to use in hydra (Default: 'config/internet_config.yaml')", # noqa: E501 + default="config/internet_config.yaml", +) +args = parser.parse_args() +config_filename = str(args.config_filename) + +config_dict = load_config(config_filename) + +input_based_path = config_dict["input_based_path"] +num_proc = config_dict["processing_parameters"]["num_proc"] +do_perplexity = config_dict["processing_parameters"]["do_perplexity"] +batch_size = config_dict["processing_parameters"]["batch_size"] +sampled_back_ratio = config_dict["processing_parameters"]["sampled_back_ratio"] +output_dir = config_dict["output_dir"] +scratch_location = config_dict["scratch_location"] +version = config_dict["version"] +source = config_dict["source"] +input_version = config_dict["input_version"] +note = config_dict["note"] + + +def clean_text(text): + text = text.strip() + text = clean_mc4_text(text) + + if text == "": + return -1, 0, "" + + text = clean_oscar_text(text) + + if text == "": + return -1, 0, "" + + if not do_perplexity: + return 0, 0, text + + prediction, log_pp_score = classify_spam(text) + + return prediction[0], log_pp_score, text + + +def process_chunk_data(chunk): + n = len(chunk["text"]) + predictions = [-1] * n + log_pp_scores = [0] * n + updated_dates = ["None"] * n + + for i, text in enumerate(chunk["text"]): + prediction, log_pp_score, new_text = clean_text(text) + + predictions[i] = prediction + log_pp_scores[i] = log_pp_score + + if new_text != text: + chunk["text"][i] = new_text + updated_dates[i] = str( + datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%fZ") + ) + + chunk["prediction"] = predictions + chunk["log_pp_score"] = log_pp_scores + chunk["updated_date"] = updated_dates + + # filter blank + blank_idx = set([i for i, t in enumerate(chunk["text"]) if t == ""]) # noqa: C403 + + for field in chunk: + chunk[field] = [val for i, val in enumerate(chunk[field]) if i not in blank_idx] + + non_spam_idx = [i for i, p in enumerate(chunk["prediction"]) if p == 0] + + sampled_back_idx = [] + + if do_perplexity: + spam_idx = [i for i, p in enumerate(chunk["prediction"]) if p == 1] + spam_idx_set = set(spam_idx) + + spam_log_pps = [ + log_pp + for i, log_pp in enumerate(chunk["log_pp_score"]) + if i in spam_idx_set + ] + log_pp_array = np.array(spam_log_pps) + + # sampled some data point classified as spam back + probs = scipy.stats.norm.pdf( + log_pp_array, + loc=np.mean(log_pp_array), + scale=np.std(log_pp_array), + ) + + sampled_back_idx = sample_text_back( + probs, + percentage=float(sampled_back_ratio), + ) + + sampled_back_idx_set = set(sampled_back_idx) + sampled_back_idx = [ + spam_idx[i] for i in range(len(spam_idx)) if i in sampled_back_idx_set + ] # Map Idx Back to the original index + + selected_idx = set(non_spam_idx + sampled_back_idx) + for field in chunk: + chunk[field] = [val for i, val in enumerate(chunk[field]) if i in selected_idx] + return chunk + + +def filter_field(data, source): + data["source"] = source + del data["log_pp_score"], data["prediction"] + if source != "oscar_cl": + data["source"] = source + meta_dict = {"filename": f"{input_based_path}/{input_version}"} + + if source == "mc4": + data["created_date"] = str(data["timestamp"]) + meta_dict["url"] = data["url"] + del data["timestamp"], data["url"] + + elif source == "cc100": + data["created_date"] = "2020-10-23T23:31:11.000Z" + + elif "oscar" in source: + data["created_date"] = "2023-06-08T14:30:28.000Z" + data["source_id"] = data["id"] + del data["id"] + + data["meta"] = str(meta_dict) + if data["updated_date"] == "None": + data["updated_date"] = data["created_date"] + return data + + +def read_jsonl_zst_files(dir_path): + for root, _, files in os.walk(dir_path): + for filename in files: + if filename.endswith(".jsonl.zst"): + file_path = os.path.join(root, filename) + folder_name = root.split("/")[-2] + try: + with zstd.open(open(file_path, "rb"), "rt", encoding="utf-8") as f: + id = 0 # Initialize ID for each file + for row in f: + item = json.loads(row) + yield { + "text": item["content"], + "created_date": item["warc_headers"]["warc-date"], + "source": "oscar_colossal_{}".format(folder_name), + # Use the ID within the file + "source_id": str(id), + "meta": str( + { + "url": item["warc_headers"]["warc-target-uri"], + "quality_warnings": item["metadata"][ + "quality_warnings" + ], + } + ), + } + id += 1 # Increment ID within the file + + except Exception as e: + print(f"Error processing file {file_path}: {e}") + + +if __name__ == "__main__": + if not os.path.exists(f"{output_dir}/{version}/data/"): + os.makedirs(f"{output_dir}/{version}/data/") + + if scratch_location: + if not os.path.exists(f"{scratch_location}/{version}/data/"): + os.makedirs(f"{scratch_location}/{version}/data/") + scratch_writer = jsonlines.open( + f"{scratch_location}/{version}/data/data.jsonl", "w" + ) + + with jsonlines.open(f"{output_dir}/{version}/data/data.jsonl", "w") as writer: + print("Loading dataset") + + if source == "mc4": + dataset = load_dataset( + "json", + data_files=[ + f"{input_based_path}/{input_version}/data/mc4_th_train.json", + f"{input_based_path}/{input_version}/data/mc4_th_validation.json", + ], + cache_dir=f"{input_based_path}/{input_version}/data/cache", + ) + + elif source == "oscar_cl": + dataset = Dataset.from_generator( + lambda: read_jsonl_zst_files(f"{input_based_path}/{input_version}/data") + ) + + else: + dataset = load_from_disk(f"{input_based_path}/{input_version}/data") + + print(dataset) + + if "train" in dataset.column_names: + dataset = dataset["train"] + if "id" not in dataset.column_names and "source_id" not in dataset.column_names: + dataset = dataset.add_column( + "source_id", [i for i in range(len(dataset))] # noqa: C416 + ) + + print("Loaded dataset") + + dataset = dataset.map( + process_chunk_data, + num_proc=num_proc, + batched=True, + batch_size=batch_size, + # keep_in_memory=True, + # Incase that I cannot write in public_datasets, so I write in this instead + # cache_file_name=f"hf_cache/{source}/processed.arrow", + ) + + for data in dataset: + filtered_data = filter_field(data, source) + writer.write(filtered_data) + if scratch_location: + scratch_writer.write(filtered_data) + + print("Finish processing") + + create_info_file(config_dict) + create_metadata_file(config_dict, pipeline_name="internet") + + print("Finish Writing the dataset") diff --git a/src/data/scripts/merge_jsonl/README.md b/src/data/scripts/merge_jsonl/README.md new file mode 100644 index 0000000..f5e45d7 --- /dev/null +++ b/src/data/scripts/merge_jsonl/README.md @@ -0,0 +1,21 @@ +# JSONL File Merger + +This Python script merges JSONL (JSON Lines) files from a specified folder into a single output file. + +## Dependencies +Before using this script, make sure you have the following dependencies installed: + +jsonlines==3.1.0 +You can typically install these dependencies using pip: + +```bash +pip install jsonlines==3.1.0 +``` + +## Usage +To merge JSONL files in a folder and save the merged data to an output file, In the SLURM script, modify the last line to specify the input folder containing the JSONL files and the output file path: + +```bash +python merge_jsonl_files.py +``` + diff --git a/src/data/scripts/merge_jsonl/merge.sh b/src/data/scripts/merge_jsonl/merge.sh new file mode 100644 index 0000000..c2ee1bd --- /dev/null +++ b/src/data/scripts/merge_jsonl/merge.sh @@ -0,0 +1,14 @@ +#!/bin/bash +#SBATCH -p memory +#SBATCH --gpus=0 +#SBATCH -N 1 -c 8 +#SBATCH --ntasks-per-node=1 +#SBATCH -t 01:00:00 +#SBATCH -A lt200056 +#SBATCH -J split-test + +ml Miniconda3 +conda deactivate +conda activate /project/lt200056-opgpth/decontamination/.conda/env + +python src/data/scripts/merge_jsonl/merge_jsonl.py /scratch/lt200056-opgpth/large_data/Oscar /scratch/lt200056-opgpth/large_data/Oscar/oscar_all.jsonl \ No newline at end of file diff --git a/src/data/scripts/merge_jsonl/merge_jsonl.py b/src/data/scripts/merge_jsonl/merge_jsonl.py new file mode 100644 index 0000000..29330d1 --- /dev/null +++ b/src/data/scripts/merge_jsonl/merge_jsonl.py @@ -0,0 +1,34 @@ +import argparse +import jsonlines +import glob + + +def merge_jsonl_files(folder_path, output_file): + # Get a list of JSONL files in the folder + file_list = glob.glob(folder_path + "/*.jsonl") + + # Create an empty list to store the merged data + merged_data = [] + + # Iterate over each file and append its data to the merged_data list + for file_path in file_list: + with jsonlines.open(file_path) as reader: + merged_data.extend(list(reader)) + + # Write the merged data to the output file + with jsonlines.open(output_file, mode="w") as writer: + writer.write_all(merged_data) + + print(f"Merged data written to {output_file}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Merge JSONL files in a folder.") + parser.add_argument( + "folder_path", type=str, help="Path to the folder containing JSONL files" + ) + parser.add_argument("output_file", type=str, help="Output file path") + + args = parser.parse_args() + + merge_jsonl_files(args.folder_path, args.output_file) diff --git a/src/data/scripts/merge_pdf/bcp.pdf b/src/data/scripts/merge_pdf/bcp.pdf new file mode 100644 index 0000000..b98dd70 Binary files /dev/null and b/src/data/scripts/merge_pdf/bcp.pdf differ diff --git a/src/data/scripts/merge_pdf/config/merge_pdf.yaml b/src/data/scripts/merge_pdf/config/merge_pdf.yaml new file mode 100644 index 0000000..737a6fa --- /dev/null +++ b/src/data/scripts/merge_pdf/config/merge_pdf.yaml @@ -0,0 +1,10 @@ +pdf_file: + key: openthaigpt + name: openthaigpt_pretraining_dataset + available_on_hub: False + path_name: src/data/scripts/merge_pdf/bcp.pdf + subset: + +text_rule_file: + engine: openthaigpt + path_name: src/data/scripts/merge_pdf/pdf_correction_rules_new.txt diff --git a/src/data/scripts/merge_pdf/merge_pdf.py b/src/data/scripts/merge_pdf/merge_pdf.py new file mode 100644 index 0000000..b449264 --- /dev/null +++ b/src/data/scripts/merge_pdf/merge_pdf.py @@ -0,0 +1,14 @@ +from openthaigpt_pretraining_data.merge_pdf import ( + pdf_2_text_markup, +) + +import hydra + + +@hydra.main(version_base=None, config_path="./config", config_name="merge_pdf") +def main(cfg): + pdf_2_text_markup(cfg.pdf_file, cfg.text_rule_file) + + +if __name__ == "__main__": + main() # type: ignore diff --git a/src/data/scripts/merge_pdf/pdf_correction_rules_new.txt b/src/data/scripts/merge_pdf/pdf_correction_rules_new.txt new file mode 100644 index 0000000..89e0f0d --- /dev/null +++ b/src/data/scripts/merge_pdf/pdf_correction_rules_new.txt @@ -0,0 +1,4674 @@ +$line = str_replace(" ","",$line); +$line = str_replace(" า"," ำ",$line); +$line = str_replace(" ์","์",$line); +$line = str_replace(" ““ทาไม้”"," ““ทำไม้”",$line); +$line = str_replace(" การต้งั ","การตั้ง",$line); +$line = str_replace(" กำรก่อ"," การก่อ",$line); +$line = str_replace(" ค้าขอจาก"," คำขอจาก",$line); +$line = str_replace(" จาเนื้อหา"," จำเนื้อหา",$line); +$line = str_replace(" ช้ำรุด "," ชำรุด ",$line); +$line = str_replace(" ได้ทา"," ได้ทำ",$line); +$line = str_replace(" ต่ากว่า"," ต่ำกว่า",$line); +$line = str_replace(" ติดตำม "," ติดตาม ",$line); +$line = str_replace(" ท้า"," ทำ",$line); +$line = str_replace(" ทาสัญญา"," ทำสัญญา",$line); +$line = str_replace(" ท้าสัญญา"," ทำสัญญา",$line); +$line = str_replace(" ทาให้"," ทำให้",$line); +$line = str_replace(" น้้า"," น้ำ",$line); +$line = str_replace(" น้าก่อน"," น้ำก่อน",$line); +$line = str_replace(" นาเข้า "," นำเข้า ",$line); +$line = str_replace(" นาเครื่อง"," นำเครื่อง",$line); +$line = str_replace(" น้าจาก"," น้ำจาก",$line); +$line = str_replace(" น้าตก"," น้ำตก",$line); +$line = str_replace(" น้าที่สูบ"," น้ำที่สูบ",$line); +$line = str_replace(" นานโยบาย"," นำนโยบาย",$line); +$line = str_replace(" น้าใน"," น้ำใน",$line); +$line = str_replace(" น้าเป็นสนิม"," น้ำเป็นสนิม",$line); +$line = str_replace(" น้าผิว"," น้ำผิว",$line); +$line = str_replace(" นาผู้"," นำผู้",$line); +$line = str_replace(" น่าฝาก"," นำฝาก",$line); +$line = str_replace(" นาพื้น"," นำพื้น",$line); +$line = str_replace(" น้ามันพืช"," น้ำมันพืช",$line); +$line = str_replace(" นามูล"," นำมูล",$line); +$line = str_replace(" น้ายา"," น้ำยา",$line); +$line = str_replace(" น้ายางสด"," น้ำยางสด",$line); +$line = str_replace(" นาระบบ"," นำระบบ",$line); +$line = str_replace(" นารายจ่าย"," นำรายจ่าย",$line); +$line = str_replace(" นาวัสดุ"," นำวัสดุ",$line); +$line = str_replace(" นาสะอาด"," น้ำสะอาด",$line); +$line = str_replace(" น้าสามารถ"," น้ำสามารถ",$line); +$line = str_replace(" น้าหลังเติม"," น้ำหลังเติม",$line); +$line = str_replace(" บทนา "," บทนำ ",$line); +$line = str_replace(" บำท "," บาท ",$line); +$line = str_replace(" ราข้าว "," รำข้าว ",$line); +$line = str_replace(" รำย "," ราย ",$line); +$line = str_replace(" แรงงำน "," แรงงาน ",$line); +$line = str_replace(" ลา "," ลำ ",$line); +$line = str_replace(" ลา)"," ลำ)",$line); +$line = str_replace(" แสนคา "," แสนคำ ",$line); +$line = str_replace(" หำกทบทวน"," หากทบทวน",$line); +$line = str_replace(" อำจไม่สำมำรถ"," อาจไม่สามารถ",$line); +$line = str_replace(" ะ","ะ",$line); +$line = str_replace(" า","ำ",$line); +$line = str_replace(" ่า","้่ำ",$line); +$line = str_replace(" ้า","้ำ",$line); +$line = str_replace(" ุ","ุ",$line); +$line = str_replace(",้","้,",$line); +$line = str_replace("!รดหลอดเลือด","โรดหลอดเลือด",$line); +$line = str_replace(".นากำไร",".นำกำไร",$line); +$line = str_replace(".น้ายืน",".น้ำยืน",$line); +$line = str_replace(".น้าโสม",".น้ำโสม",$line); +$line = str_replace("’้","้’",$line); +$line = str_replace("“ผู้ใดทาไม้","“ผู้ใดทำไม้",$line); +$line = str_replace("”้","้”",$line); +$line = str_replace(")้","้)",$line); +$line = str_replace("[e]ɛ","[é]",$line); +$line = str_replace("/้","้/",$line); +$line = str_replace("10 ลา","10 ลำ",$line); +$line = str_replace("๑๓ ล้า","๑๓ ลำ",$line); +$line = str_replace("๑๕๙ ล้า ","๑๕๙ ลำ ",$line); +$line = str_replace("๑๗๒ ล้า","๑๗๒ ลำ",$line); +$line = str_replace("๒ส่วน","๒ ส่วน",$line); +$line = str_replace("45 ลา","45 ลำ",$line); +$line = str_replace("50 ลา","50 ลำ",$line); +$line = str_replace("๘๓๔ ล้า","๘๓๔ ลำ",$line); +$line = str_replace("demonstrativeadjective","demonstrative adjective",$line); +$line = str_replace("É","่",$line); +$line = str_replace("Ê","้",$line); +$line = str_replace("interdentalsound","interdental sound",$line); +$line = str_replace("Iม้ล้มลุก","ไม้ล้มลุก",$line); +$line = str_replace("kuɛ-vluɛ:ka","kú-vlú:ka",$line); +$line = str_replace("nextto","next to",$line); +$line = str_replace("notionalstructure","notional structure",$line); +$line = str_replace("vluɛ:","vlú:",$line); +$line = str_replace("กฎ อัยการศึก","กฎอัยการศึก",$line); +$line = str_replace("กฎหมายชาสิก","กฎหมายซาสิก",$line); +$line = str_replace("กนต้อง","ก็ต้อง",$line); +$line = str_replace("กนั ","กัน",$line); +$line = str_replace("กบั","กับ",$line); +$line = str_replace("กพัเริย์","กษัตริย์",$line); +$line = str_replace("กม้ ","ก้ม",$line); +$line = str_replace("กร&จุก","กระจุก",$line); +$line = str_replace("กร&บอก","กระบอก",$line); +$line = str_replace("กรt'■จะ","กระจะ",$line); +$line = str_replace("กรXจุก","กระจุก",$line); +$line = str_replace("กรร;","กระ",$line); +$line = str_replace("กรร:จุก","กระจุก",$line); +$line = str_replace("กรร!จุก","กระจุก",$line); +$line = str_replace("กรร!บอก","กระบอก",$line); +$line = str_replace("กรร)บอก","กระบอก",$line); +$line = str_replace("กรรiจSi","กระจะ",$line); +$line = str_replace("กรรiบอก","กระบอก",$line); +$line = str_replace("กรรมกำร","กรรมการ",$line); +$line = str_replace("กรรมสิทธิ้","กรรมสิทธิ์",$line); +$line = str_replace("กรรมสิทธี้","กรรมสิทธิ์",$line); +$line = str_replace("กรองน้า","กรองน้ำ",$line); +$line = str_replace("กรองน้้า","กรองน้ำ",$line); +$line = str_replace("กระคาษ","กระดาษ",$line); +$line = str_replace("กระจายน้า","กระจายน้ำ",$line); +$line = str_replace("กระจายพ้นธุ๊","กระจายพันธุ์",$line); +$line = str_replace("กระจายพันธุโนประเทศ","กระจายพันธุ์ในประเทศ",$line); +$line = str_replace("กระจายพันธุเปทั้ว","กระจายพันธุ์ไปทั่ว",$line); +$line = str_replace("กระจำย","กระจาย",$line); +$line = str_replace("กระจุกข้อน","กระจุกซ้อน",$line); +$line = str_replace("กระจุกช้อน","กระจุกซ้อน",$line); +$line = str_replace("กระจุกเลืก","กระจุกเล็ก",$line); +$line = str_replace("กระซับขึ้น","กระชับขึ้น",$line); +$line = str_replace("กระต้นุ","กระตุ้น",$line); +$line = str_replace("กระตาษ","กระดาษ",$line); +$line = str_replace("กระตุน้","กระตุ้น",$line); +$line = str_replace("กระตุนให้้ ","กระตุ้นให้",$line); +$line = str_replace("กระทรวง กลาโหม","กระทรวงกลาโหม",$line); +$line = str_replace("กระทรวง การต่างประเทศ","กระทรวงการต่างประเทศ",$line); +$line = str_replace("กระทา","กระทำ",$line); +$line = str_replace("กระท่า","กระทำ",$line); +$line = str_replace("กระท้า","กระทำ",$line); +$line = str_replace("กระทำชัดเจนคือ","กระทำชัดเจน คือ",$line); +$line = str_replace("กระทียม","กระเทียม",$line); +$line = str_replace("กระบวนกำร","กระบวนการ",$line); +$line = str_replace("กระบอกลั่นแบน","กระบอกสั้นแบน",$line); +$line = str_replace("กระบองลั่น","กระบองสั้น",$line); +$line = str_replace("กระปี􀃌","กระปี๋",$line); +$line = str_replace("กระพื้สีขาว","กระพี้สีขาว",$line); +$line = str_replace("กระลวย","กระสวย",$line); +$line = str_replace("กระศวย","กระสวย",$line); +$line = str_replace("กระแสน้า","กระแสน้ำ",$line); +$line = str_replace("กระแสน้้า","กระแสน้ำ",$line); +$line = str_replace("กริง􀃉 ","กริ่ง",$line); +$line = str_replace("กรีชาคอฟ","กรีซาคอฟ",$line); +$line = str_replace("กรุง มาดรีด","กรุงมาดริด",$line); +$line = str_replace("กรุงบรัสเชลล์","กรุงบรัสเซลส์",$line); +$line = str_replace("กรุงมาดรีด","กรุงมาดริด",$line); +$line = str_replace("กลนั􀃊","กลั้น",$line); +$line = str_replace("กลบั ","กลับ",$line); +$line = str_replace("กลมแป็น","กลมแป้น",$line); +$line = str_replace("กลมผูน","กลมนูน",$line); +$line = str_replace("กล้วยน้าว้า","กล้วยน้ำว้า",$line); +$line = str_replace("กล้วยไม้ติน","กล้วยไม้ดิน",$line); +$line = str_replace("กลวั ","กลัว",$line); +$line = str_replace("กลัน􀃊 ","กลั้น",$line); +$line = str_replace("กลัน􀃊","กลั้น",$line); +$line = str_replace("กลาง ดอก","กลางดอก",$line); +$line = str_replace("กลางตอก","กลางดอก",$line); +$line = str_replace("กลางน้า ","กลางน้ำ ",$line); +$line = str_replace("กลาย เป็น","กลายเป็น",$line); +$line = str_replace("กลำง","กลาง",$line); +$line = str_replace("กล่ำว","กล่าว",$line); +$line = str_replace("กลำ􀃊 ","กล้ำ",$line); +$line = str_replace("กลำ􀃊","กล้ำ",$line); +$line = str_replace("กลินหอม","กลิ่นหอม",$line); +$line = str_replace("กลิบมีขม^","กลีบสีชมพู",$line); +$line = str_replace("กลีบตอก","กลีบดอก",$line); +$line = str_replace("กลีบรวมสัน","กลีบรวมสั้น",$line); +$line = str_replace("กลืนหอม","กลิ่นหอม",$line); +$line = str_replace("กลืบ","กลีบ",$line); +$line = str_replace("กลืบตอก","กลีบดอก",$line); +$line = str_replace("กลุ่ม วรรณกรรม","กลุ่มวรรณกรรม",$line); +$line = str_replace("กลุมคติ่ ","กลุ่มคติ",$line); +$line = str_replace("กลุมคนที่่ ","กลุ่มคนที่",$line); +$line = str_replace("กลุมจิ่ ตรกร","กลุ่มจิตรกร",$line); +$line = str_replace("กลุ่มที่ชัดตั้ง","กลุ่มที่จัดตั้ง",$line); +$line = str_replace("กลุ่มนำรถมาขนนำไป","กลุ่มนำรถมาขนน้ำไป",$line); +$line = str_replace("กลุ่มนิยมสตาสิน","กลุ่มนิยมสตาลิน",$line); +$line = str_replace("กลุมปล่่ อง","กลุ่มปล่อง",$line); +$line = str_replace("กลุ่มผู้ใช้นำใน","กลุ่มผู้ใช้น้ำใน",$line); +$line = str_replace("กลุ่มผู้ใช้นำเป็น","กลุ่มผู้ใช้น้ำเป็น",$line); +$line = str_replace("กลุ่มผู้ใช้นำส่วน","กลุ่มผู้ใช้น้ำส่วน",$line); +$line = str_replace("กลุมสถาปนิ่ ก","กลุ่มสถาปนิก",$line); +$line = str_replace("กลุ่มสิจิดิมิสต์","กลุ่มลิจิติมิสต์",$line); +$line = str_replace("กลไ้ ","กล้ไ",$line); +$line = str_replace("กลํ􀃊า","กล้ำ",$line); +$line = str_replace("กว้างสุค","กว้างสุด",$line); +$line = str_replace("กว่าน้าหนัก","กว่าน้ำหนัก",$line); +$line = str_replace("กษต่ริย์","กษัตริย์",$line); +$line = str_replace("กษ้ตริย์","กษัตริย์",$line); +$line = str_replace("กอ่ ","ก่อ",$line); +$line = str_replace("กอ้ ","ก้อ",$line); +$line = str_replace("ก่อ ความไม่สงบ","ก่อความไม่สงบ",$line); +$line = str_replace("ก๊อกน้า ","ก๊อกน้ำ ",$line); +$line = str_replace("กองทัพ เยอรมัน","กองทัพเยอรมัน",$line); +$line = str_replace("กองทัพนาซึ","กองทัพนาซี",$line); +$line = str_replace("ก่อตัวชิ้น","ก่อตัวขึ้น",$line); +$line = str_replace("ก่อนน้า","ก่อนนำ",$line); +$line = str_replace("ก่อนหน้านี่","ก่อนหน้านี้",$line); +$line = str_replace("ก่อปัญหาชื้น","ก่อปัญหาขึ้น",$line); +$line = str_replace("กะโรงแตง","กะโรงแดง",$line); +$line = str_replace("กักน้า","กักน้ำ",$line); +$line = str_replace("กักน้้า","กักน้ำ",$line); +$line = str_replace("กังหันน้า","กังหันน้ำ",$line); +$line = str_replace("กัง􀃊 ","กั้ง",$line); +$line = str_replace("กัใต้","ก็ได้",$line); +$line = str_replace("กั้นน้า","กั้นน้ำ",$line); +$line = str_replace("กั้นน้้า","กั้นน้ำ",$line); +$line = str_replace("กันยำยน","กันยายน",$line); +$line = str_replace("กัน􀃊 ","กั้น",$line); +$line = str_replace("กับ เนื้อสาระ","กับเนื้อสาระ",$line); +$line = str_replace("กับกำร","กับการ",$line); +$line = str_replace("กับน้้า","กับน้ำ",$line); +$line = str_replace("กับน้าจาก","กับน้ำจาก",$line); +$line = str_replace("กากน้าตาล","กากน้ำตาล",$line); +$line = str_replace("กากับ","กำกับ",$line); +$line = str_replace("ก้ากับ","กำกับ",$line); +$line = str_replace("กาจัด","กำจัด",$line); +$line = str_replace("ก้าจัด","กำจัด",$line); +$line = str_replace("กาชับ","กำชับ",$line); +$line = str_replace("ก่าชับ","กำชับ",$line); +$line = str_replace("ก้าชับ","กำชับ",$line); +$line = str_replace("กาดีเยร์ลาแตง","กาตีเยร์ลาแตง",$line); +$line = str_replace("ก้านคอก","ก้านดอก",$line); +$line = str_replace("ก้านช่อสัน","ก้านช่อสั้น",$line); +$line = str_replace("ก้านชุ","",$line); +$line = str_replace("ก้านดอก สันมาก","ก้านดอกสั้นมาก",$line); +$line = str_replace("ก้านดอกลั่นมาก","ก้านดอกสั้นมาก",$line); +$line = str_replace("ก้านดอกส้นมาก","ก้านดอกสั้นมาก",$line); +$line = str_replace("ก้านตอก","ก้านดอก",$line); +$line = str_replace("ก้านลี้นมาก","ก้านสั้นมาก",$line); +$line = str_replace("ก้านสัน","ก้านสั้น",$line); +$line = str_replace("กานัน","กำนัน",$line); +$line = str_replace("กาเนิด","กำเนิด",$line); +$line = str_replace("ก่าเนิด","กำเนิด",$line); +$line = str_replace("ก้าเนิด","กำเนิด",$line); +$line = str_replace("กาพร้า","กำพร้า",$line); +$line = str_replace("กาแพง","กำแพง",$line); +$line = str_replace("ก้าแพง","กำแพง",$line); +$line = str_replace("การ กระตุ้น","การกระตุ้น",$line); +$line = str_replace("การ ก่อการร้าย","การก่อการร้าย",$line); +$line = str_replace("การ ขยายตัว","การขยายตัว",$line); +$line = str_replace("การ คํ้า","การคํ้า",$line); +$line = str_replace("การ ต่อต้าน","การต่อต้าน",$line); +$line = str_replace("การ ตั้งรับ","การตั้งรับ",$line); +$line = str_replace("การ ปกครอง","การปกครอง",$line); +$line = str_replace("การ ปฏิรูป","การปฏิรูป",$line); +$line = str_replace("การ ปฏิวัติ","การปฏิวัติ",$line); +$line = str_replace("การ ประกาศ","การประกาศ",$line); +$line = str_replace("การ ปราบปราม","การปราบปราม",$line); +$line = str_replace("การ เมือง","การเมือง",$line); +$line = str_replace("การ สถาปนา","การสถาปนา",$line); +$line = str_replace("การแก่ไข","การแก้ไข",$line); +$line = str_replace("การขึ้นำ","การชี้นำ",$line); +$line = str_replace("การคานวณ","การคำนวณ",$line); +$line = str_replace("การค้านวน","การคำนวน",$line); +$line = str_replace("การคาประกัน","การค้ำประกัน",$line); +$line = str_replace("การชัดชื้อ","การจัดชื้อ",$line); +$line = str_replace("การช้าระ","การชำระ",$line); +$line = str_replace("การเช้าเมือง","การเข้าเมือง",$line); +$line = str_replace("การใช้ แผน","การใช้แผน",$line); +$line = str_replace("การใช้นาในปริมาณ","การใช้น้ำในปริมาณ",$line); +$line = str_replace("การใช้นำคน","การใช้น้ำคน",$line); +$line = str_replace("การใช้นำปริมาณ","การใช้น้ำปริมาณ",$line); +$line = str_replace("การดีพิมพ์","การตีพิมพ์",$line); +$line = str_replace("การเดมิ ","การเดิม ",$line); +$line = str_replace("การทา","การทำ",$line); +$line = str_replace("การท้า","การทำ",$line); +$line = str_replace("การทำงกฎหมาย","การทางกฎหมาย",$line); +$line = str_replace("การทำงละ","การทางละ",$line); +$line = str_replace("การทำงวินัย","การทางวินัย",$line); +$line = str_replace("การทำงสุราษฎร์ธานี","การทางสุราษฎร์ธานี",$line); +$line = str_replace("การทำงอาหาร","การทางอาหาร",$line); +$line = str_replace("การที่ ","การที่",$line); +$line = str_replace("การนา","การนำ",$line); +$line = str_replace("การน้า","การนำ",$line); +$line = str_replace("การน้้า","การน้ำ",$line); +$line = str_replace("การบัดหยุดงาน","การนัดหยุดงาน",$line); +$line = str_replace("การบ้าบัด","การบำบัด",$line); +$line = str_replace("การปกครอง ของออสเตรีย","การปกครองของออสเตรีย",$line); +$line = str_replace("การผลิตนำรวม","การผลิตน้ำรวม",$line); +$line = str_replace("การพื้เนฟู","การฟื้นฟู",$line); +$line = str_replace("การฟิกฝน","การฝึกฝน",$line); +$line = str_replace("การฟิกอบรม","การฝึกอบรม",$line); +$line = str_replace("การฟินพ่","การฟื้นฟู",$line); +$line = str_replace("การเมือง และสังคม","การเมืองและสังคม",$line); +$line = str_replace("การเมืองท้องลื่น","การเมืองท้องถิ่น",$line); +$line = str_replace("การรุกล้า","การรุกล้ำ",$line); +$line = str_replace("การลุ่มตรวจสอบ","การสุ่มตรวจสอบ",$line); +$line = str_replace("การศึกษา ระดับต้น","การศึกษาระดับต้น",$line); +$line = str_replace("การสั้น","การสั่น",$line); +$line = str_replace("การสั้นของแก้ว","การสั่นของแก้ว",$line); +$line = str_replace("การสั้นสะเทือน","การสั่นสะเทือน",$line); +$line = str_replace("การสัมผัสน้า","การสัมผัสน้ำ",$line); +$line = str_replace("กาไร","กำไร",$line); +$line = str_replace("ก่าไร","กำไร",$line); +$line = str_replace("ก้าไร","กำไร",$line); +$line = str_replace("กาลัง","กำลัง",$line); +$line = str_replace("ก้าลัง","กำลัง",$line); +$line = str_replace("ก่าลังไฟ","กำลังไฟ",$line); +$line = str_replace("ก้าวล้้า","ก้าวล้ำ",$line); +$line = str_replace("กาหนด","กำหนด",$line); +$line = str_replace("ก่าหนด","กำหนด",$line); +$line = str_replace("ก้าหนด","กำหนด",$line); +$line = str_replace("ก้ำกับ","กำกับ",$line); +$line = str_replace("กำม^หยี่","กำมะหยี่",$line); +$line = str_replace("กำร ","การ ",$line); +$line = str_replace("กำรกระจาย","การกระจาย",$line); +$line = str_replace("กำรกำ","การกำ",$line); +$line = str_replace("กำรกู้","การกู้",$line); +$line = str_replace("กำรเก็บ","การเก็บ",$line); +$line = str_replace("กำรเกษตร","การเกษตร",$line); +$line = str_replace("กำรแก้","การแก้",$line); +$line = str_replace("กำรข","การข",$line); +$line = str_replace("กำรขยำย","การขยาย",$line); +$line = str_replace("กำรของ","การของ",$line); +$line = str_replace("กำรเข้ำ","การเข้า",$line); +$line = str_replace("กำรแข่ง","การแข่ง",$line); +$line = str_replace("กำรคณะ","การคณะ",$line); +$line = str_replace("กำรควบคุม","การควบคุม",$line); +$line = str_replace("กำรคัด","การคัด",$line); +$line = str_replace("กำรคัดกรอง","การคัดกรอง",$line); +$line = str_replace("กำรค้ำ","การค้า",$line); +$line = str_replace("กำรจดจำ","การจดจำ",$line); +$line = str_replace("กำรจัด","การจัด",$line); +$line = str_replace("กำรจำ","การจำ",$line); +$line = str_replace("กำรแจกจ่ำย","การแจกจ่าย",$line); +$line = str_replace("กำรชำ","การชำ",$line); +$line = str_replace("กำรเชื่อม","การเชื่อม",$line); +$line = str_replace("กำรใช้","การใช้",$line); +$line = str_replace("กำรซ่อม","การซ่อม",$line); +$line = str_replace("กำรซัก","การซัก",$line); +$line = str_replace("กำรณ์","การณ์",$line); +$line = str_replace("กำรดังนี้","การดังนี้",$line); +$line = str_replace("กำรดำ","การดำ",$line); +$line = str_replace("กำรด้ำเนินงำน","การดำเนินงาน",$line); +$line = str_replace("กำรดูแล","การดูแล",$line); +$line = str_replace("กำรได้","การได้",$line); +$line = str_replace("กำรตก","การตก",$line); +$line = str_replace("กำรตรวจ","การตรวจ",$line); +$line = str_replace("กำรตลาด","การตลาด",$line); +$line = str_replace("กำรตัด","การตัด",$line); +$line = str_replace("กำรต่ำ","การต่ำ",$line); +$line = str_replace("กำรตำม","การตาม",$line); +$line = str_replace("กำรติด","การติด",$line); +$line = str_replace("กำรติดตั้ง","การติดตั้ง",$line); +$line = str_replace("กำรติดตาม","การติดตาม",$line); +$line = str_replace("กำรแต่ง","การแต่ง",$line); +$line = str_replace("กำรถ่ำย","การถ่าย",$line); +$line = str_replace("กำรทด","การทด",$line); +$line = str_replace("กำรทดแทน","การทดแทน",$line); +$line = str_replace("กำรท่อง","การท่อง",$line); +$line = str_replace("กำรทำ","การทำ",$line); +$line = str_replace("กำรท้ำ","การทำ",$line); +$line = str_replace("กำรที่","การที่",$line); +$line = str_replace("กำรนำ","การนำ",$line); +$line = str_replace("กำรนิ","การนิ",$line); +$line = str_replace("กำรใน","การใน",$line); +$line = str_replace("กำรบริกำร","การบริการ",$line); +$line = str_replace("กำรบริหาร","การบริหาร",$line); +$line = str_replace("กำรบันทึก","การบันทึก",$line); +$line = str_replace("กำรบ้ำรุง","การบำรุง",$line); +$line = str_replace("กำรบูรณา","การบูรณา",$line); +$line = str_replace("กำรปฏิบัติ","การปฏิบัติ",$line); +$line = str_replace("กำรประ","การประ",$line); +$line = str_replace("กำรประกำศ","การประกาศ",$line); +$line = str_replace("กำรประชา","การประชา",$line); +$line = str_replace("กำรประเมิน","การประเมิน",$line); +$line = str_replace("กำรประสำน","การประสาน",$line); +$line = str_replace("กำรปรับ","การปรับ",$line); +$line = str_replace("กำรปลูก","การปลูก",$line); +$line = str_replace("กำรปลูกพืช","การปลูกพืช",$line); +$line = str_replace("กำรผลิต","การผลิต",$line); +$line = str_replace("กำรเผย","การเผย",$line); +$line = str_replace("กำรฝึก","การฝึก",$line); +$line = str_replace("กำรพัฒนา","การพัฒนา",$line); +$line = str_replace("กำรพิจารณา","การพิจารณา",$line); +$line = str_replace("กำรเพำะ","การเพาะ",$line); +$line = str_replace("กำรเพิ่ม","การเพิ่ม",$line); +$line = str_replace("กำรมอบ","การมอบ",$line); +$line = str_replace("กำรมี","การมี",$line); +$line = str_replace("กำรยก","การยก",$line); +$line = str_replace("กำรร่วม","การร่วม",$line); +$line = str_replace("กำรรอ","การรอ",$line); +$line = str_replace("กำรรับ","การรับ",$line); +$line = str_replace("กำรราย","การราย",$line); +$line = str_replace("กำรเรียน","การเรียน",$line); +$line = str_replace("กำรลด","การลด",$line); +$line = str_replace("กำรแลก","การแลก",$line); +$line = str_replace("กำรวัด","การวัด",$line); +$line = str_replace("กำรวำงแผน","การวางแผน",$line); +$line = str_replace("กำรวิเคราะห์","การวิเคราะห์",$line); +$line = str_replace("กำรศึกษา","การศึกษา",$line); +$line = str_replace("กำรศูนย์","การศูนย์",$line); +$line = str_replace("กำรส่ง","การส่ง",$line); +$line = str_replace("กำรสนับสนุน","การสนับสนุน",$line); +$line = str_replace("กำรสมทบ","การสมทบ",$line); +$line = str_replace("กำรสร้าง","การสร้าง",$line); +$line = str_replace("กำรสอน","การสอน",$line); +$line = str_replace("กำรสำรวจ","การสำรวจ",$line); +$line = str_replace("กำรส้ำรวจ","การสำรวจ",$line); +$line = str_replace("กำรสื่อสำร","การสื่อสาร",$line); +$line = str_replace("กำรหมุน","การหมุน",$line); +$line = str_replace("กำรหรือ","การหรือ",$line); +$line = str_replace("กำรให้","การให้",$line); +$line = str_replace("กำรอบรม","การอบรม",$line); +$line = str_replace("กำรอำชีว","การอาชีว",$line); +$line = str_replace("กำรอุป","การอุป",$line); +$line = str_replace("กำรเ","การเ",$line); +$line = str_replace("กำไรนา","กำไรนำ",$line); +$line = str_replace("กำลงั ","กำลัง ",$line); +$line = str_replace("กำลัง คิด","กำลังคิด",$line); +$line = str_replace("กำลัง เปล่งเสียง","กำลังเปล่งเสียง",$line); +$line = str_replace("กำลัง พูด","กำลังพูด",$line); +$line = str_replace("กำลัง เลื่อน","กำลังเลื่อน",$line); +$line = str_replace("กำลัง เหนื่อย","กำลังเหนื่อย",$line); +$line = str_replace("ก้ำลัง","กำลัง",$line); +$line = str_replace("ก้ำวหน้ำ","ก้าวหน้า",$line); +$line = str_replace("กำหนด เคอร์ฟิว","กำหนดเคอร์ฟิว",$line); +$line = str_replace("ก้ำหนด","กำหนด",$line); +$line = str_replace("กิ่งเลื่อย","กิ่งเลื้อย",$line); +$line = str_replace("กิ่งสัน","กิ่งสั้น",$line); +$line = str_replace("กิงอ่อน","กิ่งอ่อน",$line); +$line = str_replace("กิง􀃉 ","กิ่ง",$line); +$line = str_replace("กิง􀃉","กิ่ง",$line); +$line = str_replace("กิจกรรมระดับกลางนากับ","กิจกรรมระดับกลางน้ำกับ",$line); +$line = str_replace("กิตติมคักดี้","กิตติมศักดิ์",$line); +$line = str_replace("กิตติมศักด็","กิตติมศักดิ์",$line); +$line = str_replace("กินแกเข้ ","กินแก้ไข้ ",$line); +$line = str_replace("กิสเกอเรีส","กิสเกอเริส",$line); +$line = str_replace("กิ􀃉ง","กิ่ง",$line); +$line = str_replace("กี,􀃉","กี่,",$line); +$line = str_replace("กีดขวางทางนา","กีดขวางทางน้ำ",$line); +$line = str_replace("กีป􀃉 ","กี่ป",$line); +$line = str_replace("กีย􀃉 ","กี่ย",$line); +$line = str_replace("กีเ􀃉 ","กี่เ",$line); +$line = str_replace("กีโ􀃉 ","กี่โ",$line); +$line = str_replace("กี􀃊","กี่",$line); +$line = str_replace("กึ่งก้าน","กิ่งก้าน",$line); +$line = str_replace("กึ่งแยก","กิ่งแยก",$line); +$line = str_replace("กึง􀃉 ","กึ่ง",$line); +$line = str_replace("กึ􀃉","กึ่",$line); +$line = str_replace("กืขาวนวล","สีขาวนวล",$line); +$line = str_replace("กืเขียวแกม•นาตาล","สีเขียวแกมน้ำตาล",$line); +$line = str_replace("กุย้ ","กุ้ย",$line); +$line = str_replace("กุล่มเป้าหมาย","กลุ่มเป้าหมาย",$line); +$line = str_replace("กุหลาบช้อน","กุหลาบซ้อน",$line); +$line = str_replace("กู้นาเงิน","กู้นำเงิน",$line); +$line = str_replace("เก็บน้า","เก็บน้ำ",$line); +$line = str_replace("เก็บน้้า","เก็บน้ำ",$line); +$line = str_replace("เก็บน้าซีเมนต์","เก็บน้ำซีเมนต์",$line); +$line = str_replace("เก็บนำเพิ่ม","เก็บน้ำเพิ่ม",$line); +$line = str_replace("เก็บสาเนำ","เก็บสำเนา",$line); +$line = str_replace("เกริน􀃉 ","เกริ่น",$line); +$line = str_replace("เกลรเพคผู้","เกสรเพศผู้",$line); +$line = str_replace("เกลือ􀃉 ","เกลื่อ",$line); +$line = str_replace("เกศร","เกสร",$line); +$line = str_replace("เกษตรกรทานา","เกษตรกรทำนา",$line); +$line = str_replace("เกษตรกรนาวัสดุ","เกษตรกรนำวัสดุ",$line); +$line = str_replace("เกษตรน้าพี้","เกษตรน้ำพี้",$line); +$line = str_replace("เกษตรน้าแวน","เกษตรน้ำแวน",$line); +$line = str_replace("เกสร เพศเมีย","เกสรเพศเมีย",$line); +$line = str_replace("เกสรสัน","เกสรสั้น",$line); +$line = str_replace("เก้าอี่","เก้าอี้",$line); +$line = str_replace("เกิด ความคิด","เกิดความคิด",$line); +$line = str_replace("เกิดอะไรชิ้น","เกิดอะไรขึ้น",$line); +$line = str_replace("เกิต","เกิด",$line); +$line = str_replace("เกินกว่ำ","เกินกว่า",$line); +$line = str_replace("เกี􀃉ยว","เกี่ยว",$line); +$line = str_replace("แกก้ ","แก้ก",$line); +$line = str_replace("แก็ไข","แก้ไข",$line); +$line = str_replace("แก่ไข","แก้ไข",$line); +$line = str_replace("แก้ไขเพิ่มเดิม","แก้ไขเพิ่มเติม",$line); +$line = str_replace("แก้ใฃ้","แก้ไข้",$line); +$line = str_replace("แก้ใช่","แก้ไข้",$line); +$line = str_replace("แกํไช้","แก้ไข้",$line); +$line = str_replace("แกด้ ","แก้ด",$line); +$line = str_replace("แกนนา","แกนนำ",$line); +$line = str_replace("แกป้ ","แก้ป",$line); +$line = str_replace("แกปั้ญหา","แก้ปัญหา",$line); +$line = str_replace("แกมนาตาล","แกมน้ำตาล",$line); +$line = str_replace("แกมนื้าเงิน","แกมน้ำเงิน",$line); +$line = str_replace("แกมริปไข่","แกมรูปไข่",$line); +$line = str_replace("แกรนค์คุ๊กปอล","แกรนค์ดุ๊กปอล",$line); +$line = str_replace("แกรนค์ดุ๊ก","แกรนด์ดุ๊ก",$line); +$line = str_replace("แกรนด์ ดุ๊กปอล","แกรนด์ดุ๊กปอล",$line); +$line = str_replace("แกรนด์ดุกปอล","แกรนด์ดุ๊กปอล",$line); +$line = str_replace("แกว้ ","แก้ว",$line); +$line = str_replace("แก้วนาแสง","แก้วนำแสง",$line); +$line = str_replace("แกเ้","แก้เ",$line); +$line = str_replace("แกโ้ดย","แก้โดย",$line); +$line = str_replace("แกไ้ ","แก้ไ",$line); +$line = str_replace("ใกลจุ้ด","ใกล้จุด",$line); +$line = str_replace("ใกลชิ้ด","ใกล้ชิด",$line); +$line = str_replace("ใกลตั้ว","ใกล้ตัว",$line); +$line = str_replace("ใกลฟั้น","ใกล้ฟัน",$line); +$line = str_replace("ใกล้ยอต","ใกล้ยอด",$line); +$line = str_replace("ใกลัเลัน","ใกล้เส้น",$line); +$line = str_replace("ใกลเ้","ใกล้เ",$line); +$line = str_replace("ไกลน้า","ไกลน้ำ",$line); +$line = str_replace("ไกลักน","ไกลกัน",$line); +$line = str_replace("ขณะนั น","ขณะนั้น",$line); +$line = str_replace("ขดั ","ขัด",$line); +$line = str_replace("ขน้ ","ขั้น",$line); +$line = str_replace("ขนมี'นาตาล","ขนสีน้ำตาล",$line); +$line = str_replace("ขนล้นนุ่ม","ขนส้นนุ่ม",$line); +$line = str_replace("ขนลั่น","",$line); +$line = str_replace("ขนลัน","ขนสั้น",$line); +$line = str_replace("ขนลั้น","ขนสั้น",$line); +$line = str_replace("ขนลี้นหนานุ่ม","ขนสั้นหนานุ่ม",$line); +$line = str_replace("ขนลีฟ้าตาลแดง","ขนสีน้ำตาลแดง",$line); +$line = str_replace("ขนส้น","ขนสั้น",$line); +$line = str_replace("ขนสะเอียด","ขนละเอียด",$line); +$line = str_replace("ขนสัน","",$line); +$line = str_replace("ขนสันหนา","ขนสั้นหนา",$line); +$line = str_replace("ขนหนาพุ่ม","ขนหนานุ่ม",$line); +$line = str_replace("ขนั ","ขัน",$line); +$line = str_replace("ขนั􀃊 ","ขั้น",$line); +$line = str_replace("ขนั􀃊","ขั้น",$line); +$line = str_replace("ขนาด เล็ก","ขนาดเล็ก",$line); +$line = str_replace("ขนาดเด็ก","ขนาดเล็ก",$line); +$line = str_replace("ขนาด่ใหญ่","ขนาดใหญ่",$line); +$line = str_replace("ขนาต","ขนาด",$line); +$line = str_replace("ขยำย","ขยาย",$line); +$line = str_replace("ข่วงบน","ช่วงบน",$line); +$line = str_replace("ข่วงล่าง","ช่วงล่าง",$line); +$line = str_replace("ขวลิต","ชวลิต",$line); +$line = str_replace("ขวั􀃊","ขั้ว",$line); +$line = str_replace("ขอ้ ","ข้อ",$line); +$line = str_replace("ข่อ กร!แจุก","ช่อกระจุก",$line); +$line = str_replace("ข่อ กรifจุก","ช่อกระจุก",$line); +$line = str_replace("ข่อ กรร!จร!","ช่อกระจะ",$line); +$line = str_replace("ข่อ กระจะ","ช่อกระจะ",$line); +$line = str_replace("ข่อ ตอก","ช่อดอก",$line); +$line = str_replace("ขอกใบ","ซอกใบ",$line); +$line = str_replace("ข่อกร^จุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกร๕จุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกรtเจุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกรแจุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกรร!จร!","ช่อกระจะ",$line); +$line = str_replace("ข่อกรร!จร)","ช่อกระจะ",$line); +$line = str_replace("ข่อกรร.<จุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกรร'จแ","ช่อกระจะ",$line); +$line = str_replace("ข่อกรร)จร)","ช่อกระจะ",$line); +$line = str_replace("ข่อกรร)จรเ","ช่อกระจะ",$line); +$line = str_replace("ข่อกรร)จุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกรร}■จร}","ช่อกระจะ",$line); +$line = str_replace("ข่อกรร}จร}","ช่อกระจะ",$line); +$line = str_replace("ข่อกรร1จะ","ช่อกระจะ",$line); +$line = str_replace("ข่อกรรfจะ","ช่อกระจะ",$line); +$line = str_replace("ข่อกรรiจร1","ช่อกระจะ",$line); +$line = str_replace("ข่อกรรiจรi","ช่อกระจะ",$line); +$line = str_replace("ข่อกรรiจุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกรรriเก","ช่อกระจุก",$line); +$line = str_replace("ข่อกรรเจรแขีงปรรเกอบ","ช่อกระจะเชิงประกอบ",$line); +$line = str_replace("ข่อกรรเจรเ","ช่อกระจะ",$line); +$line = str_replace("ข่อกรรเจุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกรรรจรi","ช่อกระจะ",$line); +$line = str_replace("ข่อกระจร!","ช่อกระจะ",$line); +$line = str_replace("ข่อกระจรi","ช่อกระจะ",$line); +$line = str_replace("ข่อกระจะ","ช่อกระจะ",$line); +$line = str_replace("ข่อกระจุก","ช่อกระจุก",$line); +$line = str_replace("ข้อกระจุก","ช่อกระจุก",$line); +$line = str_replace("ข่อกระรู!ก","ช่อกระจุก",$line); +$line = str_replace("ข่อขีร่ม","ช่อซี่ร่ม",$line); +$line = str_replace("ข้อขีร่ม","ช่อซี่ร่ม",$line); +$line = str_replace("ข่อเข่งลด","ช่อเชิงลด",$line); +$line = str_replace("ข่อเข้งลต","ช่อเชิงลด",$line); +$line = str_replace("ข่อเข่งหลั่น","ช่อเชิงหลั่น",$line); +$line = str_replace("ข่อเขีงลต","ช่อเชิงลด",$line); +$line = str_replace("ข้อเขีงลต","ช่อเชิงลด",$line); +$line = str_replace("ข่อเขีงหลั่น","ช่อเชิงหลั่น",$line); +$line = str_replace("ของ เยอรมนี","ของเยอรมนี",$line); +$line = str_replace("ของ สนธิสัญญา","ของสนธิสัญญา",$line); +$line = str_replace("ของกลุ่มผู้ใช้นำ","ของกลุ่มผู้ใช้น้ำ",$line); +$line = str_replace("ของน้าฝน","ของน้ำฝน",$line); +$line = str_replace("ข่องอากาศ","ช่องอากาศ",$line); +$line = str_replace("ข่อเชิงลด","ช่อเชิงลด",$line); +$line = str_replace("ข่อดอก","ช่อดอก",$line); +$line = str_replace("ข่อตอก","ช่อดอก",$line); +$line = str_replace("ข่อตี่ร่ม","ช่อซี่ร่ม",$line); +$line = str_replace("ขอทาความ","ขอทำความ",$line); +$line = str_replace("ข้อนเข่งประกอบ","ซ้อนเชิงประกอบ",$line); +$line = str_replace("ขอนาดินไปใช้","ขอนำดินไปใช้",$line); +$line = str_replace("ข้อมูลกำร","ข้อมูลการ",$line); +$line = str_replace("ข้อมูลน้า","ข้อมูลน้ำ",$line); +$line = str_replace("ข้อมูลมำปรับ","ข้อมูลมาปรับ",$line); +$line = str_replace("ข้อมูลแหล่งนา ","ข้อมูลแหล่งน้ำ",$line); +$line = str_replace("ข่อย่อย","ช่อย่อย",$line); +$line = str_replace("ข่อแยก","ช่อแยก",$line); +$line = str_replace("ขอแยกแขนง","",$line); +$line = str_replace("ข้อแยกแขนง","ช่อแยกแขนง",$line); +$line = str_replace("ข้อรูปถ้วย","ช่อรูปถ้วย",$line); +$line = str_replace("ข้อเรียกรัอง","ข้อเรียกร้อง",$line); +$line = str_replace("ข่อหางกระรอก","ช่อหางกระรอก",$line); +$line = str_replace("ขั นตอน","ขั้นตอน",$line); +$line = str_replace("ขั นพื้นฐาน","ขั้นพื้นฐาน",$line); +$line = str_replace("ขั้นต่้า","ขั้นต่ำ",$line); +$line = str_replace("ขันตีปีเอโตร","ซันตีปีเอโตร",$line); +$line = str_replace("ขั้นปันไต","ขั้นบันได",$line); +$line = str_replace("ขัน􀃊 ","ขั้น",$line); +$line = str_replace("ขัน􀃊","ขั่น",$line); +$line = str_replace("ขับ'นานม","ขับน้ำนม",$line); +$line = str_replace("ขับพิษใฃ้","ขับพิษไข้",$line); +$line = str_replace("ข้ามขั่น","ข้ามขั้น",$line); +$line = str_replace("ข้ามลลับ","ข้ามสลับ",$line); +$line = str_replace("ข่ายน้า","ข่ายน้ำ",$line); +$line = str_replace("ขาวแกมแตง","ขาวแกมแดง",$line); +$line = str_replace("ข้าวปุูน","ข้าวปุู้น",$line); +$line = str_replace("ขาวอมขมพู","ขาวอมชมพู",$line); +$line = str_replace("ข้ำงต้น","ข้างต้น",$line); +$line = str_replace("ข้ำงมำก","ข้างมาก",$line); +$line = str_replace("ขำด","ขาด",$line); +$line = str_replace("ขำดความ","ขาดความ",$line); +$line = str_replace("ขำดจุด","ขาดจุด",$line); +$line = str_replace("ขำดระบบ","ขาดระบบ",$line); +$line = str_replace("ขำดแรง","ขาดแรง",$line); +$line = str_replace("ขำยที่","ขายที่",$line); +$line = str_replace("ข่ำยสำร","ข่ายสาร",$line); +$line = str_replace("ข้ำรำชกำร","ข้าราชการ",$line); +$line = str_replace("ข่ำวสำร","ข่าวสาร",$line); +$line = str_replace("ขีจ􀃉 ","ขี่จ",$line); +$line = str_replace("ขีช􀃉 ","ขี่ช",$line); +$line = str_replace("ขีนไนแข็ง","ชั้นในแข็ง",$line); +$line = str_replace("ขีร􀃉 ","ขี่ร",$line); +$line = str_replace("ขีวประวิติ","ชีวประวิติ",$line); +$line = str_replace("ขีวิด","ชีวิต",$line); +$line = str_replace("ขึ น","ขึ้น",$line); +$line = str_replace("ขึน􀃊 ","ขึ้น",$line); +$line = str_replace("ขึน􀃊","ขึ้น",$line); +$line = str_replace("ขึ􀃊ง","ขึ้ง",$line); +$line = str_replace("ขึ􀃊น","ขึ้น",$line); +$line = str_replace("เข่งประกอบ","เชิงประกอบ",$line); +$line = str_replace("เข้งประกอบ","เชิงประกอบ",$line); +$line = str_replace("เข่งลต","เชิงลด",$line); +$line = str_replace("เขตร้อนชื่น","เขตร้อนชื้น",$line); +$line = str_replace("เขตริเวิยรา","เขตริเวียรา",$line); +$line = str_replace("เขม้ ","เข้ม",$line); +$line = str_replace("เข้มขั้น","เข้มข้น",$line); +$line = str_replace("เข้มถึงแตง","เข้มถึงแดง",$line); +$line = str_replace("เข้มอมล้ม","เข้มอมส้ม",$line); +$line = str_replace("เขา้","เข้า",$line); +$line = str_replace("เข้าทาประโยชน์","เข้าทำประโยชน์",$line); +$line = str_replace("เข้ามาทานา","เข้ามาทำนา",$line); +$line = str_replace("เข้ามำ","เข้ามา",$line); +$line = str_replace("เข้ำ","เข้า",$line); +$line = str_replace("เข้ำใจ","เข้าใจ",$line); +$line = str_replace("เข้ำร่วม","เข้าร่วม",$line); +$line = str_replace("เขีงปร๕กอบ","เชิงประกอบ",$line); +$line = str_replace("เขีงประกอบ","เชิงประกอบ",$line); +$line = str_replace("เขีงลต","เชิงลด",$line); +$line = str_replace("เขียงราย","เชียงราย",$line); +$line = str_replace("เขีย􀃊 ","เขี้ย",$line); +$line = str_replace("เขี􀃊ยว","เขี้ยว",$line); +$line = str_replace("แข่น-า","แช่น้ำ",$line); +$line = str_replace("ไขจ้ ","ไข้จ",$line); +$line = str_replace("ไขที้","ไข้ที",$line); +$line = str_replace("ไข้สิทธิ","ใช้สิทธิ",$line); +$line = str_replace("ไขห้ ","ไข้ห",$line); +$line = str_replace("เฃิร์บ","เซิร์บ",$line); +$line = str_replace("คณะท้างาน","คณะทำงาน",$line); +$line = str_replace("คณำจำรย์","คณาจารย์",$line); +$line = str_replace("คดนกถูอ","คดนกกูด",$line); +$line = str_replace("คต'นfเคูด","คดนกกูด",$line); +$line = str_replace("คน้ ","ค้น",$line); +$line = str_replace("คน ชายผลไม้","คนขายผลไม้",$line); +$line = str_replace("คนไข้ที","^",$line); +$line = str_replace("คนเช้าเมือง","คนเข้าเมือง",$line); +$line = str_replace("คนยืวอพยพ","คนยิวอพยพ",$line); +$line = str_replace("คนั ","คัน",$line); +$line = str_replace("ครงั􀃊 ","ครั้ง",$line); +$line = str_replace("ครบล้วน","ครบถ้วน",$line); +$line = str_replace("ครั ง","ครั้ง",$line); +$line = str_replace("ครั้งนี่","ครั้งนี้",$line); +$line = str_replace("ครัง􀃊 ","ครั้ง",$line); +$line = str_replace("ครัง􀃊","ครั้ง",$line); +$line = str_replace("ครัน􀃊 ","ครั้น",$line); +$line = str_replace("คราม'นา","ครามน้ำ",$line); +$line = str_replace("คริสต์ ศตวรรษ","คริสต์ศตวรรษ",$line); +$line = str_replace("ครึ่งเลี้ยว","ครึ่งเสี้ยว",$line); +$line = str_replace("ครึง􀃉 ","ครึ่ง",$line); +$line = str_replace("ครึสตจักร","คริสตจักร",$line); +$line = str_replace("คลองน้า","คลองน้ำ",$line); +$line = str_replace("คลอโรฟิลค์","คลอโรฟิลล์",$line); +$line = str_replace("คล้ายเลี้ยววงกลม","คล้ายเสี้ยววงกลม",$line); +$line = str_replace("คล้ำย","คล้าย",$line); +$line = str_replace("คลีค􀃉 ","คลี่ค",$line); +$line = str_replace("คลี้า","คล้ำ",$line); +$line = str_replace("คลืน􀃉 ","คลื่น",$line); +$line = str_replace("คลืน􀃉","คลื่น",$line); +$line = str_replace("คลือ􀃉 ","คลื่อ",$line); +$line = str_replace("คลื􀃉น","คลื่น",$line); +$line = str_replace("คลื􀃉นเ","คลื่นเ",$line); +$line = str_replace("ควรนามา","ควรนำมา",$line); +$line = str_replace("ควฮ‘บจโเ‘รว'ไส","ครอบจักรวาล ๒",$line); +$line = str_replace("ความ ก้าวหน้า","ความก้าวหน้า",$line); +$line = str_replace("ความ คิด","ความคิด",$line); +$line = str_replace("ความ บริสุทธิ้","ความบริสุทธิ์",$line); +$line = str_replace("ความ ประนีประนอม","ความประนีประนอม",$line); +$line = str_replace("ความ สัมพันธ๊","ความสัมพันธ์",$line); +$line = str_replace("ความ สัมพันธ์","ความสัมพันธ์",$line); +$line = str_replace("ความ สำคัญ","ความสำคัญ",$line); +$line = str_replace("ความเขม้","ความเข้ม",$line); +$line = str_replace("ความจานง","ความจำนง",$line); +$line = str_replace("ความจ้ำ","ความจำ",$line); +$line = str_replace("ความชื น","ความชื้น",$line); +$line = str_replace("ความซึ่น","ความชื้น",$line); +$line = str_replace("ความถี่สั้นพ้อง","ความถี่สั่นพ้อง",$line); +$line = str_replace("ความรักอย่างตึกขึ้ง","ความรักอย่างลึกซึ้ง",$line); +$line = str_replace("ความล้าบาก","ความลำบาก",$line); +$line = str_replace("ความเลียหาย","ความเสียหาย",$line); +$line = str_replace("ความสั้นพ้อง","ความสั่นพ้อง",$line); +$line = str_replace("ความสัมพันธ์ตึกขึ้ง","ความสัมพันธ์ลึกซึ้ง",$line); +$line = str_replace("ความเหน","ความเห็น",$line); +$line = str_replace("ควำม","ความ",$line); +$line = str_replace("ควำมเข้ำใจ","ความเข้าใจ",$line); +$line = str_replace("ควำมคุ้มค่า","ความคุ้มค่า",$line); +$line = str_replace("ควำมตั้งใจ","ความตั้งใจ",$line); +$line = str_replace("ควำมประสงค์","ความประสงค์",$line); +$line = str_replace("ควำมพร้อม","ความพร้อม",$line); +$line = str_replace("ควำมไม่","ความไม่",$line); +$line = str_replace("ควำมสัมพันธ์","ความสัมพันธ์",$line); +$line = str_replace("ควำมเสี่ยง","ความเสี่ยง",$line); +$line = str_replace("ควำ􀃉 ","คว่ำ",$line); +$line = str_replace("คอ้ ","ค้อ",$line); +$line = str_replace("คอกแยก เพศ","ดอกแยกเพศ",$line); +$line = str_replace("คอกแยกเพศ","ดอกแยกเพศ",$line); +$line = str_replace("คอกสมบูรณ์เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ค่อนข้ำง","ค่อนข้าง",$line); +$line = str_replace("ค่อนช้าง","ค่อนข้าง",$line); +$line = str_replace("คอมมิวนิสต","คอมมิวนิสต์",$line); +$line = str_replace("คอมมิวนิสต้","คอมมิวนิสต์",$line); +$line = str_replace("คอมมิวนิสต์์","คอมมิวนิสต์",$line); +$line = str_replace("คอลินแยลล็อบ","คอลิน แยลล็อบ",$line); +$line = str_replace("คักดสิทธิ์","ศักดิ์สิทธิ์",$line); +$line = str_replace("คักดิ้","ศักดิ์",$line); +$line = str_replace("คักดิ้สิทธี้","ศักดิ์สิทธิ์",$line); +$line = str_replace("คักดี้สิทธิ้","ศักดิ์สิทธิ์",$line); +$line = str_replace("คัน􀃉 ","คั่น",$line); +$line = str_replace("คา'งแมว","คางแมว",$line); +$line = str_replace("ค้้า","ค้ำ",$line); +$line = str_replace("คาขอ","คำขอ",$line); +$line = str_replace("คาเขื่อนแก้ว","คำเขื่อนแก้ว",$line); +$line = str_replace("คาจัดกัด","คำจัดกัด",$line); +$line = str_replace("คาจำกัดความ","คำจำกัดความ",$line); +$line = str_replace("คาชี้แจง","คำชี้แจง",$line); +$line = str_replace("คาถาม","คำถาม",$line); +$line = str_replace("ค้านบนเกลี้ยง","ด้านบนเกลี้ยง",$line); +$line = str_replace("คานวณ","คำนวณ",$line); +$line = str_replace("ค้านวณ","คำนวณ",$line); +$line = str_replace("คานา ","คำนำ ",$line); +$line = str_replace("ค่าน้า","ค่าน้ำ",$line); +$line = str_replace("ค่าน้่า","ค่าน้ำ",$line); +$line = str_replace("ค่าน้้า","ค่าน้ำ",$line); +$line = str_replace("ค่าน้ามัน","ค่าน้ำมัน",$line); +$line = str_replace("คานาหน้า","คำนำหน้า",$line); +$line = str_replace("ค่านำมาก","ค่าน้ำมาก",$line); +$line = str_replace("คานิยาม","คำนิยาม",$line); +$line = str_replace("คานึง","คำนึง",$line); +$line = str_replace("ค่านึง","คำนึง",$line); +$line = str_replace("ค้านึง","คำนึง",$line); +$line = str_replace("ค้าแนะน้า","คำแนะนำ",$line); +$line = str_replace("คาแนะนำ","คำแนะนำ",$line); +$line = str_replace("ค่าแนะนำ","คำแนะนำ",$line); +$line = str_replace("ค้าประกัน","ค้ำประกัน",$line); +$line = str_replace("คาปรึกษา","คำปรึกษา",$line); +$line = str_replace("ค้าปรึกษา","คำปรึกษา",$line); +$line = str_replace("ค่ายผู้สิ้ภัย","ค่ายผู้ลี้ภัย",$line); +$line = str_replace("คายืนยัน","คำยืนยัน",$line); +$line = str_replace("คาร์ดินัลรัตติ","คาร์ดินัลรัตตี",$line); +$line = str_replace("ค้าศัพท์","คำศัพท์",$line); +$line = str_replace("คาสั่ง","คำสั่ง",$line); +$line = str_replace("ค่าสั่ง","คำสั่ง",$line); +$line = str_replace("ค้าสั่ง","คำสั่ง",$line); +$line = str_replace("คาเสนอ","คำเสนอ",$line); +$line = str_replace("ค่าเสืยหาย","ค่าเสียหาย",$line); +$line = str_replace("ค่ำ วันนี้","ค่ำวันนี้",$line); +$line = str_replace("ค่ำแก๊ส","ค่าแก๊ส",$line); +$line = str_replace("คำขึ้แจง","คำชี้แจง",$line); +$line = str_replace("ค่ำเฉลี่ย","ค่าเฉลี่ย",$line); +$line = str_replace("คำชี แจง","คำชี้แจง",$line); +$line = str_replace("ค่ำใช้จ่าย","ค่าใช้จ่าย",$line); +$line = str_replace("คำดกำรณ์","คาดการณ์",$line); +$line = str_replace("ค้ำแนะนำ","คำแนะนำ",$line); +$line = str_replace("ค้ำแนะน้ำ","คำแนะนำ",$line); +$line = str_replace("ค่ำเสีย","ค่าเสีย",$line); +$line = str_replace("คำ􀃉","ค่ำ",$line); +$line = str_replace("คิดไปทาไป","คิดไปทำไป",$line); +$line = str_replace("คิลปวัฒนธรรม","ศิลปวัฒนธรรม",$line); +$line = str_replace("คิลปวัตถุ","ศิลปวัตถุ",$line); +$line = str_replace("คิลปวิทยา","ศิลปวิทยา",$line); +$line = str_replace("คิ􀃊ว","คิ้ว",$line); +$line = str_replace("คีลธรรม","ศีลธรรม",$line); +$line = str_replace("คี่เหลี่ยมคางหมู","สี่เหลี่ยมคางหมู",$line); +$line = str_replace("คุณภาพนา","คุณภาพน้ำ",$line); +$line = str_replace("คุณภาพน้า","คุณภาพน้ำ",$line); +$line = str_replace("คุณภาพน้่า","คุณภาพน้ำ",$line); +$line = str_replace("คุณภาพน้้า","คุณภาพน้ำ",$line); +$line = str_replace("คุณภำพ","คุณภาพ",$line); +$line = str_replace("คุณภำพน้ำ","คุณภาพน้ำ",$line); +$line = str_replace("คุน้ ","คุ้น",$line); +$line = str_replace("คุ้มค่ำ","คุ้มค่า",$line); +$line = str_replace("คู่แช่ง","คู่แข่ง",$line); +$line = str_replace("คูน้า","คูน้ำ",$line); +$line = str_replace("เคก้","เค้ก",$line); +$line = str_replace("เคยทาแต่","เคยทำแต่",$line); +$line = str_replace("เคยทาเท่านั้น","เคยทำเท่านั้น",$line); +$line = str_replace("เครือข่ำย","เครือข่าย",$line); +$line = str_replace("เครืองจั่ กร","เครื่องจักร",$line); +$line = str_replace("เครื่องดานา","เครื่องดำนา",$line); +$line = str_replace("เครื่องทาขนม","เครื่องทำขนม",$line); +$line = str_replace("เครื่องทาน้าเย็น","เครื่องทำน้ำเย็น",$line); +$line = str_replace("เครื่องท้าน้้าเย็น","เครื่องทำน้ำเย็น",$line); +$line = str_replace("เครื่องบุ่งห่ม","เครื่องนุ่งห่ม",$line); +$line = str_replace("เครื่องปั่นน้ายาง","เครื่องปั่นน้ำยาง",$line); +$line = str_replace("เครื่องสารองไฟฟูาฯ","เครื่องสำรองไฟฟ้าฯ",$line); +$line = str_replace("เครือ􀃉 ","^เครื่อ",$line); +$line = str_replace("เครือ􀃉 ง","เครื่อง",$line); +$line = str_replace("เครื􀃉อง","เครื่อง",$line); +$line = str_replace("เคลีอบ","เคลือบ",$line); +$line = str_replace("เคลื􀃉อน","เคลื่อน",$line); +$line = str_replace("เคี􀃊","เคี้",$line); +$line = str_replace("แคลนนา","แคลนน้ำ",$line); +$line = str_replace("แคลนน้า","แคลนน้ำ",$line); +$line = str_replace("แคลนน้้า","แคลนน้ำ",$line); +$line = str_replace("แคลนนำ","แคลนน้ำ",$line); +$line = str_replace("โคง้ ","โค้ง",$line); +$line = str_replace("โค้งสัน","โค้งสั้น",$line); +$line = str_replace("โคนเขีอมติต","โคนเชื่อมติด",$line); +$line = str_replace("โคนมนแหลม","โคนมน แหลม",$line); +$line = str_replace("โครงกา ร","โครงการ",$line); +$line = str_replace("โครงกำร ","โครงการ ",$line); +$line = str_replace("โครงกำร","โครงการ",$line); +$line = str_replace("งแท,้ ","งแท้, ",$line); +$line = str_replace("งนั􀃊","งั้น",$line); +$line = str_replace("งน้าเครื่อง","งนำเครื่อง",$line); +$line = str_replace("งัน􀃊","งั้น",$line); +$line = str_replace("งานขึ้นสำคัญ","งานชิ้นสำคัญ",$line); +$line = str_replace("งานเชียน","งานเขียน",$line); +$line = str_replace("งานตำม","งานตาม",$line); +$line = str_replace("งำน","งาน",$line); +$line = str_replace("งำนตำม","งานตาม",$line); +$line = str_replace("งำนที่","งานที่",$line); +$line = str_replace("งำนมำก","งานมาก",$line); +$line = str_replace("งำนหลัก","งานหลัก",$line); +$line = str_replace("งำนอาชีพ","งานอาชีพ",$line); +$line = str_replace("ง่ำย ","ง่าย ",$line); +$line = str_replace("งิ􀃊ว","งิ้ว",$line); +$line = str_replace("เงือ􀃉 ","เงื่อ",$line); +$line = str_replace("เงื􀃉อน","เงื่อน",$line); +$line = str_replace("จกั ","จัก",$line); +$line = str_replace("จง้ ","จ้ง",$line); +$line = str_replace("จงั ","จัง",$line); +$line = str_replace("จดจาง่าย","จดจำง่าย",$line); +$line = str_replace("จดมาตรน้า","จดมาตรน้ำ",$line); +$line = str_replace("จนท่าให้","จนทำให้",$line); +$line = str_replace("จร!งอย","จะงอย",$line); +$line = str_replace("จริงมำ","จริงมา",$line); +$line = str_replace("จว้ ","จ้ว",$line); +$line = str_replace("จอห์นคลาร์ก","จอห์น คลาร์ก",$line); +$line = str_replace("จอห์นเซิร์ล","จอห์น เซิร์ล",$line); +$line = str_replace("จอห์นเฟิร์ท","จอห์น เฟิร์ท",$line); +$line = str_replace("จอห์นเลเวอร์","จอห์น เลเวอร์",$line); +$line = str_replace("จอห์นออสติน","จอห์น ออสติน",$line); +$line = str_replace("จอห์นโอฮาลา","จอห์น โอฮาลา",$line); +$line = str_replace("จะใช้นำ","จะใช้น้ำ",$line); +$line = str_replace("จะทา ","จะทำ ",$line); +$line = str_replace("จะทาได้","จะทำได้",$line); +$line = str_replace("จะทาหนังสือ","จะทำหนังสือ",$line); +$line = str_replace("จะนา","จะนำ",$line); +$line = str_replace("จะน้า","จะนำ",$line); +$line = str_replace("จะเริ่มสั้น","จะเริ่มสั่น",$line); +$line = str_replace("จักรวรรดิ ไรค์","จักรวรรดิไรค์",$line); +$line = str_replace("จังหวัดนาระบบ","จังหวัดนำระบบ",$line); +$line = str_replace("จังหวัดลาปาง","จังหวัดลำปาง",$line); +$line = str_replace("จัด ตั้ง","จัดตั้ง",$line); +$line = str_replace("จัดการทำงกฎหมาย","จัดการทางกฎหมาย",$line); +$line = str_replace("จัดการนำ และ","จัดการน้ำ และ",$line); +$line = str_replace("จัดการนำเสีย","จัดการน้ำเสีย",$line); +$line = str_replace("จัดกำร","จัดการ",$line); +$line = str_replace("จัดจ้ำง","จัดจ้าง",$line); +$line = str_replace("จัดซื อ","จัดซื้อ",$line); +$line = str_replace("จัดตั ง ","จัดตั้ง",$line); +$line = str_replace("จัดตั้ง สมาคม","จัดตั้งสมาคม",$line); +$line = str_replace("จัดทา","จัดทำ",$line); +$line = str_replace("จัดท่า","จัดทำ",$line); +$line = str_replace("จัดท้า","จัดทำ",$line); +$line = str_replace("จัดท่าระเบียบ","จัดทำระเบียบ",$line); +$line = str_replace("จัดท้ำ","จัดทำ",$line); +$line = str_replace("จัดล้ำดับ","จัดลำดับ",$line); +$line = str_replace("จัดสรรนำ ","จัดสรรน้ำ ",$line); +$line = str_replace("จัดสรรนำที่","จัดสรรน้ำที่",$line); +$line = str_replace("จัตุรัสเชนต์ปีเตอร์","จัตุรัสเซนต์ปีเตอร์",$line); +$line = str_replace("จันทร์ครึ่งเลียว","จันทร์ครึ่งเสี้ยว",$line); +$line = str_replace("จากต่ำ ไปหาสูง","จากต่ำไปหาสูง",$line); +$line = str_replace("จากนั น ","จากนั้น",$line); +$line = str_replace("จากน้า","จากน้ำ",$line); +$line = str_replace("จากน้้า","จากน้ำ",$line); +$line = str_replace("จากนาและสัตว์","จากน้ำและสัตว์",$line); +$line = str_replace("จากัด","จำกัด",$line); +$line = str_replace("จ้ากัด","จำกัด",$line); +$line = str_replace("จ้างทา ","จ้างทำ ",$line); +$line = str_replace("จ้างท่าของ","จ้างทำของ",$line); +$line = str_replace("จ้างทาระบบ","จ้างทำระบบ",$line); +$line = str_replace("จาต้อง","จำต้อง",$line); +$line = str_replace("จานวน","จำนวน",$line); +$line = str_replace("จ่านวน","จำนวน",$line); +$line = str_replace("จ้านวน","จำนวน",$line); +$line = str_replace("จานอง","จำนอง",$line); +$line = str_replace("จาแนก","จำแนก",$line); +$line = str_replace("จ่าแนก","จำแนก",$line); +$line = str_replace("จ้าแนก","จำแนก",$line); +$line = str_replace("จาเป็น","จำเป็น",$line); +$line = str_replace("จ้าเป็น","จำเป็น",$line); +$line = str_replace("จาพวก","จำพวก",$line); +$line = str_replace("จาเพาะ","จำเพาะ",$line); +$line = str_replace("จาไม่ได","จำไม่ได",$line); +$line = str_replace("จ่ายต่า","จ่ายต่ำ",$line); +$line = str_replace("จ่ายน้า","จ่ายน้ำ",$line); +$line = str_replace("จ่ายน้้า","จ่ายน้ำ",$line); +$line = str_replace("จ่ายนำ","จ่ายน้ำ",$line); +$line = str_replace("จาลอง","จำลอง",$line); +$line = str_replace("จาสำหรับ","จำสำหรับ",$line); +$line = str_replace("จาหน่วย","จำหน่วย",$line); +$line = str_replace("จาหน่าย","จำหน่าย",$line); +$line = str_replace("จ่าหน่าย","จำหน่าย",$line); +$line = str_replace("จ้าหน่าย","จำหน่าย",$line); +$line = str_replace("จำก ","จาก ",$line); +$line = str_replace("จำกกลุ่ม","จากกลุ่ม",$line); +$line = str_replace("จำกกอง","จากกอง",$line); +$line = str_replace("จำกการ","จากการ",$line); +$line = str_replace("จำกกำร","จากการ",$line); +$line = str_replace("จำกเกษตร","จากเกษตร",$line); +$line = str_replace("จำกข้อมูล","จากข้อมูล",$line); +$line = str_replace("จำกโครง","จากโครง",$line); +$line = str_replace("จำกเชื้อ","จากเชื้อ",$line); +$line = str_replace("จำกติด","จากติด",$line); +$line = str_replace("จำกที่","จากที่",$line); +$line = str_replace("จำกผล","จากผล",$line); +$line = str_replace("จำกฟอสซิล","จากฟอสซิล",$line); +$line = str_replace("จำกระบบ","จากระบบ",$line); +$line = str_replace("จำกโรงเรือน","จากโรงเรือน",$line); +$line = str_replace("จำกสถาน","จากสถาน",$line); +$line = str_replace("จำกสมาชิก","จากสมาชิก",$line); +$line = str_replace("จำกแสง","จากแสง",$line); +$line = str_replace("จำกแหล่ง","จากแหล่ง",$line); +$line = str_replace("จำกอำคำร","จากอาคาร",$line); +$line = str_replace("จำคุก ตลอดชีวิต","จำคุกตลอดชีวิต",$line); +$line = str_replace("จ้ำนวน","จำนวน",$line); +$line = str_replace("จำนวนนี ","จำนวนนี้",$line); +$line = str_replace("จำนวนมำก","จำนวนมาก",$line); +$line = str_replace("จ้ำเป็น","จำเป็น",$line); +$line = str_replace("จ่ำยเงิน","จ่ายเงิน",$line); +$line = str_replace("จำหน่ายน้า","จำหน่ายน้ำ",$line); +$line = str_replace("จำหน่ำย","จำหน่าย",$line); +$line = str_replace("จ้ำหน่ำย","จำหน่าย",$line); +$line = str_replace("จิก􀃋 กี,􀃌","จิ๊กกี๋ , ",$line); +$line = str_replace("จิด􀃋","จิ๊ด",$line); +$line = str_replace("จิตสานึก","จิตสำนึก",$line); +$line = str_replace("จิบ􀃋","จิ๊บ",$line); +$line = str_replace("จิ􀃊ง","จิ้ง",$line); +$line = str_replace("จี,􀃉","จี่,",$line); +$line = str_replace("จึงท้า","จึงทำ",$line); +$line = str_replace("จึงนากล้า","จึงนำกล้า",$line); +$line = str_replace("จุดขำย","จุดขาย",$line); +$line = str_replace("จุดทักเห","จุดหักเห",$line); +$line = str_replace("จุดสิตำ","จุดสีดำ",$line); +$line = str_replace("เจริญ เติบโต","เจริญเติบโต",$line); +$line = str_replace("เจ้าหน้าที่ ของรัฐ","เจ้าหน้าที่ของรัฐ",$line); +$line = str_replace("เจ้ำของ","เจ้าของ",$line); +$line = str_replace("เจ้ำหน้ำที่","เจ้าหน้าที่",$line); +$line = str_replace("เจำะจง","เจาะจง",$line); +$line = str_replace("แจง้ ","แจ้ง",$line); +$line = str_replace("แจ้งนา","แจ้งนำ",$line); +$line = str_replace("แจ่มจ่ารูญ","แจ่มจำรูญ",$line); +$line = str_replace("โจเซฟกรีนเบิร์ก","โจเซฟ กรีนเบิร์ก",$line); +$line = str_replace("โจมดี","โจมตี",$line); +$line = str_replace("ฉบบั ","ฉบับ",$line); +$line = str_replace("ฉบับนี่","ฉบับนี้",$line); +$line = str_replace("ฉลำก","ฉลาก",$line); +$line = str_replace("ฉํ่านั้า","ฉํ่าน้ำ",$line); +$line = str_replace("ฉิ􀃉น","ฉิ่น",$line); +$line = str_replace("เฉพำะ","เฉพาะ",$line); +$line = str_replace("เฉลีย􀃉 ","เฉลี่ย",$line); +$line = str_replace("เฉลี􀃉ย","เฉลี่ย",$line); +$line = str_replace("เฉือ􀃉 ","เฉื่อ",$line); +$line = str_replace("เฉื􀃉","เฉื่",$line); +$line = str_replace("แฉกจุ้มหนา","แฉกงุ้มหนา",$line); +$line = str_replace("แฉกติ้น","แฉกตื้น",$line); +$line = str_replace("แฉกตื่น","แฉกตื้น",$line); +$line = str_replace("แฉกสัน","แฉกสั้น",$line); +$line = str_replace("ช่่ วง","ช่วง",$line); +$line = str_replace("ชค้ ","ช้ค",$line); +$line = str_replace("ชณะเดียวกัน","ขณะเดียวกัน",$line); +$line = str_replace("ชณะนั้น","ขณะนั้น",$line); +$line = str_replace("ชดใซั","ชดใช้",$line); +$line = str_replace("ชนขั้น","ชนชั้น",$line); +$line = str_replace("ชนชันแรงงาน","ชนชั้นแรงงาน",$line); +$line = str_replace("ชนดิ ","ชนิด",$line); +$line = str_replace("ชนั􀃊 ","ชั้น",$line); +$line = str_replace("ชนิค","ชนิด",$line); +$line = str_replace("ชนิดน้า","ชนิดน้ำ",$line); +$line = str_replace("ชนิดนิ้","ชนิดนี้",$line); +$line = str_replace("ชนิดนี่","ชนิดนี้",$line); +$line = str_replace("ชนิดนื้","ชนิดนี้",$line); +$line = str_replace("ชมพูถึงแตง","ชมพูถึงแดง",$line); +$line = str_replace("ชมพูอมแตง","ชมพูอมแดง",$line); +$line = str_replace("ช่วยน้้า","ช่วยน้ำ",$line); +$line = str_replace("ชสื้อ􀃉 ","ช้สื่อ",$line); +$line = str_replace("ช่อกรi1 จุก","ช่อกระจุก",$line); +$line = str_replace("ช่อกระจุกข้อน","ช่อกระจุกซ้อน",$line); +$line = str_replace("ช่อเขีงลต","ช่อเชิงลด",$line); +$line = str_replace("ช่อเขีงสต","ช่อเชิงลด",$line); +$line = str_replace("ช่อคอก","ช่อดอก",$line); +$line = str_replace("ชองกรมป่าไม้","ของกรมป่าไม้",$line); +$line = str_replace("ชองตุรกี","ของตุรกี",$line); +$line = str_replace("ช่องทำง","ช่องทาง",$line); +$line = str_replace("ช่องมืออรูล","ช่องมีออวุล",$line); +$line = str_replace("ช่อดอกเพคผู้","ช่อดอกเพศผู้",$line); +$line = str_replace("ช่อดอกเพลเมีย","ช่อดอกเพศเมีย",$line); +$line = str_replace("ช่อตอก","ช่อดอก",$line); +$line = str_replace("ช้อนทับ","ซ้อนทับ",$line); +$line = str_replace("ช้อนเหลื่อม","ซ้อนเหลื่ยม",$line); +$line = str_replace("ช่อมักสัน","ช่อมักสั้น",$line); +$line = str_replace("ชอร์บอนน์","ซอร์บอนน์",$line); +$line = str_replace("ช่อส้น","ช่อสั้น",$line); +$line = str_replace("ชั น","ชั้น",$line); +$line = str_replace("ชั นตาก","ชั้นตาก",$line); +$line = str_replace("ชันเดียว","ชั้นเดียว",$line); +$line = str_replace("ชันตีปีเอโตร","ซันตีปีเอโตร",$line); +$line = str_replace("ชัน􀃊","ชั้น",$line); +$line = str_replace("ชัยชนะ ดังกล่าว","ชัยชนะดังกล่าว",$line); +$line = str_replace("ชัว􀃉 ","ชั่ว",$line); +$line = str_replace("ชัิ่บัติงาน","ชั่วโมงปฏิบัติงาน",$line); +$line = str_replace("ชั􀃊น","ชั้น",$line); +$line = str_replace("ช้างน้า ","ช้างน้ำ ",$line); +$line = str_replace("ชํ้าช้อน","ซ้ำซ้อน",$line); +$line = str_replace("ชานาญ","ชำนาญ",$line); +$line = str_replace("ช้านาญ","ชำนาญ",$line); +$line = str_replace("ชาร์ดิเนีย","ซาร์ดิเนีย",$line); +$line = str_replace("ชาร์อะเด็กชานเดอร์","ซาร์อะเด็กซานเดอร์",$line); +$line = str_replace("ชาร์อะเด็กซานเดอร์","ซาร์อะเด็กซานเดอร์",$line); +$line = str_replace("ชาระ","ชำระ",$line); +$line = str_replace("ช่าระ","ชำระ",$line); +$line = str_replace("ชาราบ","ชำราบ",$line); +$line = str_replace("ชารีนาแคเทอรีน","ซารีนาแคเทอรีน",$line); +$line = str_replace("ชารุด","ชำรุด",$line); +$line = str_replace("ช่ารุด","ชำรุด",$line); +$line = str_replace("ช้ารุด","ชำรุด",$line); +$line = str_replace("ชาวเซ็ก","ชาวเช็ก",$line); +$line = str_replace("ชาวเดิร์ก","ชาวเติร์ก",$line); +$line = str_replace("ชาวยึว","ชาวยิว",$line); +$line = str_replace("ชาวยืว","ชาวยิว",$line); +$line = str_replace("ชาแหละ","ชำแหละ",$line); +$line = str_replace("ช่ำงชุม","ช่างชุม",$line); +$line = str_replace("ช่ำงฝี","ช่างฝี",$line); +$line = str_replace("ชำติ","ชาติ",$line); +$line = str_replace("ชำนำญ","ชำนาญ",$line); +$line = str_replace("ชำระหนี่","ชำระหนี้",$line); +$line = str_replace("ช้ำรุด","ชำรุด",$line); +$line = str_replace("ชิมซับ","ซึมซับ",$line); +$line = str_replace("ชิ􀃊น","ชิ้น",$line); +$line = str_replace("ชิ􀃊นนี่","ชิ้นนี้",$line); +$line = str_replace("ชี แจง","ชี้แจง",$line); +$line = str_replace("ชีค􀃊 ","ชี้ค",$line); +$line = str_replace("ชี่ฟัน","ซี่ฟัน",$line); +$line = str_replace("ชีวภำพ","ชีวภาพ",$line); +$line = str_replace("ชีอพ้อง","ชื่อพ้อง",$line); +$line = str_replace("ชีอสามัญ","ชื่อสามัญ",$line); +$line = str_replace("ชี􀃊","ชี้",$line); +$line = str_replace("ชื้นชม","ชื่นชม",$line); +$line = str_replace("ชื้นในดินแดน","ขึ้นในดินแดน",$line); +$line = str_replace("ชืน􀃉 ","ชื่น",$line); +$line = str_replace("ชืน􀃉","ชื่น",$line); +$line = str_replace("ชื่อสๆม้ญ","ชื่อสามัญ",$line); +$line = str_replace("ชือ􀃉 ","ชื่อ",$line); +$line = str_replace("ชือ􀃉","ชื่อ",$line); +$line = str_replace("ชื􀃉น","ชื่น",$line); +$line = str_replace("ชื􀃉อ","ชื่อ",$line); +$line = str_replace("ชุดสันเรียง","ชุดสั้นเรียง",$line); +$line = str_replace("ชเ้","ช้เ",$line); +$line = str_replace("เช่น กัน","เช่นกัน",$line); +$line = str_replace("เช่น คำว่า","เช่นคำว่า",$line); +$line = str_replace("เช่น เดียวกัน","เช่นเดียวกัน",$line); +$line = str_replace("เช่น เดียวกับ","เช่นเดียวกับ",$line); +$line = str_replace("เช่น นั้น","เช่นนั้น",$line); +$line = str_replace("เช่น นี้","",$line); +$line = str_replace("เช่นคำว่า","เช่น คำว่า",$line); +$line = str_replace("เชนด์ปีเตอร์สเบิร์ก","เซนด์ปีเตอร์สเบิร์ก",$line); +$line = str_replace("เชนด์ปึ เตอร์สเบิร์ก","เซนด์ปีเตอร์สเบิร์ก",$line); +$line = str_replace("เชนต์จอร์จ","เซนต์จอร์จ",$line); +$line = str_replace("เชนตบิเตอร์สเบิร์ก","เซนด์ปีเตอร์สเบิร์ก",$line); +$line = str_replace("เชนต์ปีเตอร์สเบิร์ก","เซนต์ปีเตอร์สเบิร์ก",$line); +$line = str_replace("เชนต์ปึเตอร์สเบิร์ก","เซนด์ปีเตอร์สเบิร์ก",$line); +$line = str_replace("เช่นนั้นเรียกว่า","เช่นนั้น เรียกว่า",$line); +$line = str_replace("เชอร์เบีย","เซอร์เบีย",$line); +$line = str_replace("เชอร์รอเบิร์ต","เซอร์รอเบิร์ต",$line); +$line = str_replace("เชอร์เฮนรี","เซอร์เฮนรี",$line); +$line = str_replace("เช้าครอบครอง","เข้าครอบครอง",$line); +$line = str_replace("เช้าใจ","เข้าใจ",$line); +$line = str_replace("เช้าพิธี","เข้าพิธี",$line); +$line = str_replace("เช้ารุกราน","เข้ารุกราน",$line); +$line = str_replace("เชียงใหม ่","เชียงใหม่",$line); +$line = str_replace("เชี่ยวชำญ","เชี่ยวชาญ",$line); +$line = str_replace("เชีย􀃉 ","เชี่ย",$line); +$line = str_replace("เชี􀃉ยว","เชี่ยว",$line); +$line = str_replace("เชื อ","เชื้อ",$line); +$line = str_replace("เชื่อ ม","เชื่อม",$line); +$line = str_replace("เชือมต่่ อ","เชื่อมต่อ",$line); +$line = str_replace("เชื่อมติคกัน","เชื่อมติดกัน",$line); +$line = str_replace("เชื้อสายยึว","เชื้อสายยิว",$line); +$line = str_replace("เชื่เองฟู","เฟื่องฟู",$line); +$line = str_replace("เชือ􀃉 ","เชื่อ",$line); +$line = str_replace("เชื􀃊อ","เชื้อ",$line); +$line = str_replace("ใชก้ ","ใช้ก",$line); +$line = str_replace("ใชกั้ ","ใช้กั",$line); +$line = str_replace("ใชกั้น","ใช้กัน",$line); +$line = str_replace("ใช้แก้ใข้","ใช้แก้ไข้",$line); +$line = str_replace("ใชข้ ","ใช้ข",$line); +$line = str_replace("ใชคุ้ณศัพท์","ใช้คุณศัพท์",$line); +$line = str_replace("ใชคู้่","ใช้คู่",$line); +$line = str_replace("ใชง้ ","ใช้ง",$line); +$line = str_replace("ใช้งำน","ใช้งาน",$line); +$line = str_replace("ใชจ้ ","ใช้จ",$line); +$line = str_replace("ใช้จ่ำย","ใช้จ่าย",$line); +$line = str_replace("ใชชื้","ใช้ชื",$line); +$line = str_replace("ใชฐ้ ","ใช้ฐ",$line); +$line = str_replace("ใชต้่","ใช้ต่",$line); +$line = str_replace("ใชต้อบ","ใช้ตอบ",$line); +$line = str_replace("ใชตั้ว","ใช้ตัว",$line); +$line = str_replace("ใชต้าม","ใช้ตาม",$line); +$line = str_replace("ใชติ้ด","ใช้ติด",$line); +$line = str_replace("ใชตี้","ใช้ตี",$line); +$line = str_replace("ใชถ้ ","ใช้ถ",$line); +$line = str_replace("ใชท้ ","ใช้ท",$line); +$line = str_replace("ใชทั้ง􀃊","ใช้ทั้ง",$line); +$line = str_replace("ใช้ทำสึใต้","ใช้ทำสีได้",$line); +$line = str_replace("ใชนั้","ใช้นั",$line); +$line = str_replace("ใช้น้า","ใช้น้ำ",$line); +$line = str_replace("ใช้น้้า","ใช้น้ำ",$line); +$line = str_replace("ใช้นาใน","ใช้น้ำใน",$line); +$line = str_replace("ใช้นำ ","ใช้น้ำ ",$line); +$line = str_replace("ใช้นำจำก","ใช้น้ำจาก",$line); +$line = str_replace("ใชนิ้","ใช้นิ",$line); +$line = str_replace("ใช้ใน วิทยาภาษาถิ่น","ใช้ในวิทยาภาษาถิ่น",$line); +$line = str_replace("ใชบ้ ","ใช้บ",$line); +$line = str_replace("ใชป้ ","ใช้ป",$line); +$line = str_replace("ใชพ้ ","ใช้พ",$line); +$line = str_replace("ใชพู้ด","ใช้พูด",$line); +$line = str_replace("ใชฟั้น","ใช้ฟัน",$line); +$line = str_replace("ใชภ้ ","ใช้ภ",$line); +$line = str_replace("ใชม้ ","ใช้ม",$line); +$line = str_replace("ใชร้ ","ใช้ร",$line); +$line = str_replace("ใชรั้","ใช้รั",$line); +$line = str_replace("ใชรู้","ใช้รู",$line); +$line = str_replace("ใชรู้ป","ใช้รูป",$line); +$line = str_replace("ใชล้ ","ใช้ล",$line); +$line = str_replace("ใชลั้กษณ์","ใช้ลักษณ์",$line); +$line = str_replace("ใชลั้กษณะ","ใช้ลักษณะ",$line); +$line = str_replace("ใชลิ้􀃊","ใช้ลิ้",$line); +$line = str_replace("ใชว้ ","ใช้ว",$line); +$line = str_replace("ใชวั้จนกรรม","ใช้วัจนกรรม",$line); +$line = str_replace("ใชวิ้เคราะห์","ใช้วิเคราะห์",$line); +$line = str_replace("ใชวิ้ธี","ใช้วิธี",$line); +$line = str_replace("ใชศั้พท์","ใช้ศัพท์",$line); +$line = str_replace("ใชส้ ","ใช้ส",$line); +$line = str_replace("ใชสั้ญลักษณ์","ใช้สัญลักษณ์",$line); +$line = str_replace("ใชสั้ทอักษร","ใช้สัทอักษร",$line); +$line = str_replace("ใชสุ้ด","ใช้สุด",$line); +$line = str_replace("ใชห้ ","ใช้ห",$line); +$line = str_replace("ใช้หนี่","ใช้หนี้",$line); +$line = str_replace("ใชอ้ ","ใช้อ",$line); +$line = str_replace("ใชอั้กษร","ใช้อักษร",$line); +$line = str_replace("ใชอี้ก","ใช้อีก",$line); +$line = str_replace("ใชเ้","ใช้เ",$line); +$line = str_replace("ใชแ้ ","ใช้แ",$line); +$line = str_replace("ใชโ้ ","ใช้โ",$line); +$line = str_replace("ใชไ้ ","ใช้ไ",$line); +$line = str_replace("ซงึ􀃉 ","ซึ่ง",$line); +$line = str_replace("ซนชันสูง","ชนชั้นสูง",$line); +$line = str_replace("ซมพู","ชมพู",$line); +$line = str_replace("ซวลิต","ชวลิต",$line); +$line = str_replace("ซอ้ ","ซ้อ",$line); +$line = str_replace("ซ่อกระจุก","ช่อกระจุก",$line); +$line = str_replace("ซ้อนลังหรือนอนลัง","ซ้อนถังหรือนอนถัง",$line); +$line = str_replace("ซ่อมท้าใหญ่","ซ่อมทำใหญ่",$line); +$line = str_replace("ซัดเจน","ชัดเจน",$line); +$line = str_replace("ซับน้า","ซับน้ำ",$line); +$line = str_replace("ซ้า","ซ้ำ",$line); +$line = str_replace("ซ้้าซ้อน ","ซ้ำซ้อน ",$line); +$line = str_replace("ซ้าซ้อน","ซ้ำซ้อน",$line); +$line = str_replace("ซ้่าซ้อน","ซ้ำซ้อน",$line); +$line = str_replace("ซ้้าซ้อน","ซ้ำซ้อน",$line); +$line = str_replace("ซาฟ้ด","ซาฟัด",$line); +$line = str_replace("ซามวั","ซามัว",$line); +$line = str_replace("ซาร์ดิเนืย","ซาร์ดิเนีย",$line); +$line = str_replace("ซาร์อะเล็ก ซานเดอร์","ซาร์อะเล็กซานเดอร์",$line); +$line = str_replace("ซ้ำ กัน","ซ้ำกัน",$line); +$line = str_replace("ซำซ้อน","ซ้ำซ้อน",$line); +$line = str_replace("ซ้ำยมือ","ซ้ายมือ",$line); +$line = str_replace("ซำ􀃊 ","ซ้ำ",$line); +$line = str_replace("ซำ􀃊","ซ้ำ",$line); +$line = str_replace("ซิ-ซิ","๑-ม.ค.",$line); +$line = str_replace("ซิน􀃉 ","ซิ่น",$line); +$line = str_replace("ซี่ฟ้น","ซี่ฟัน",$line); +$line = str_replace("ซี่ฟ้นเด็ก","ซี่ฟันเล็ก",$line); +$line = str_replace("ซีอพ้อง","ชื่อพ้อง",$line); +$line = str_replace("ซีอสามัญ","ซื่อสามัญ",$line); +$line = str_replace("ซีไ􀃉 ","ซี่ไ",$line); +$line = str_replace("ซึกบน","ซีกบน",$line); +$line = str_replace("ซึ่งมี ขน","ซึ่งมีขน",$line); +$line = str_replace("ซึง􀃉 ","ซึ่ง",$line); +$line = str_replace("ซึง􀃉","ซึ่ง",$line); +$line = str_replace("ซึ􀃉ง","ซึ่ง",$line); +$line = str_replace("ซื อ","ซื้อ",$line); +$line = str_replace("ซื้อน้า","ซื้อน้ำ",$line); +$line = str_replace("ซื่อสามัญ","ชื่อสามัญ",$line); +$line = str_replace("ซื่ออื่นๆ","ชื่ออื่น ๆ",$line); +$line = str_replace("ซือ􀃉 ","ซื่อ",$line); +$line = str_replace("ซือ􀃊 ","ซื้อ",$line); +$line = str_replace("ซื􀃊อ","ซื้อ",$line); +$line = str_replace("ซุมประตู้","ซุ้มประตู",$line); +$line = str_replace("เซิงลด","เชิงลด",$line); +$line = str_replace("โซลัชชี","โซลัซซี",$line); +$line = str_replace("โซเวิยต","โซเวียต",$line); +$line = str_replace("โซเวืยต","โซเวียต",$line); +$line = str_replace("ใซ้แรงงาน","ใช้แรงงาน",$line); +$line = str_replace("ซํ􀃊า","ซ้ำ",$line); +$line = str_replace("ญี่ปุน่","ญี่ปุ่น",$line); +$line = str_replace("ญี่ปุนนิ่ ยมนัง่ ","ญี่ปุ่นนิยมนั่ง",$line); +$line = str_replace("ญี่ปุนมี่ ","ญี่ปุ่นมี",$line); +$line = str_replace("ญี่ปุนแสดง่ ","ญี่ปุ่นแสดง",$line); +$line = str_replace("ญีป􀃉 ","ญี่ป",$line); +$line = str_replace("ญี􀃉","ญี่",$line); +$line = str_replace("ฐานตอก","ฐานดอก",$line); +$line = str_replace("ฐานน้าบริโภค","ฐานน้ำบริโภค",$line); +$line = str_replace("ฐานันดรคักดิ้","ฐานันดรศักดิ์",$line); +$line = str_replace("ฐำน","ฐาน",$line); +$line = str_replace("ฐำนะ","ฐานะ",$line); +$line = str_replace("ด ว้ ","ด้ว",$line); +$line = str_replace("ด ้าน","ด้าน",$line); +$line = str_replace("ด้งกล่าว","ดังกล่าว",$line); +$line = str_replace("ดงั ","ดัง",$line); +$line = str_replace("ดงั นี้","ดังนี้",$line); +$line = str_replace("ดงั􀃊 ","ดั้ง",$line); +$line = str_replace("ดบั ","ดับ",$line); +$line = str_replace("ดรู้ว้ ่","ด้รู้ว่",$line); +$line = str_replace("ดลัายช่อ","คล้ายช่อ",$line); +$line = str_replace("ดว้ ","ด้ว",$line); +$line = str_replace("ดว่ น","ด่วน",$line); +$line = str_replace("ดว้ ย","ด้วย",$line); +$line = str_replace("ด้วย ชัยชนะ","ด้วยชัยชนะ",$line); +$line = str_replace("ดอ้ ","ด้อ",$line); +$line = str_replace("ดอก ลมบูรณ์เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ดอกข้อน","ดอกซ้อน",$line); +$line = str_replace("ดอกคาใต้","ดอกคำใต้",$line); +$line = str_replace("ดอกเคี่ยว","ดอกเดี่ยว",$line); +$line = str_replace("ดอกดูม","ดอกตูม",$line); +$line = str_replace("ดอกดูมรูปกรวย","ดอกตูมรูปกรวย",$line); +$line = str_replace("ดอกเด็ก","ดอกเล็ก",$line); +$line = str_replace("ดอกบีเหลือง","ดอกสีเหลือง",$line); +$line = str_replace("ดอกมีเหลืองสต","ดอกสีเหลืองสด",$line); +$line = str_replace("ดอกแยก เพศร่วมช่อ","ดอกแยกเพศร่วมช่อ",$line); +$line = str_replace("ดอกลูม","ดอกตูม",$line); +$line = str_replace("ดอกสม,มูรฟ้เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ดอกสม'มูรณ์เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ดอกสมนูรณ์ เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ดอกสมบุรณ์เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ดอกสมบูรณ์'เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ดอกสัน","ดอกสั้น",$line); +$line = str_replace("ดอนกายาน","ดอนกำยาน",$line); +$line = str_replace("ดอนยำว","ดอนยาว",$line); +$line = str_replace("ดังกล่าวเช่น","ดังกล่าว เช่น",$line); +$line = str_replace("ดังกล่าวเมื่อใด","ดังกล่าว เมื่อใด",$line); +$line = str_replace("ดังกล่ำว","ดังกล่าว",$line); +$line = str_replace("ดังน้นั ","ดังนั้น",$line); +$line = str_replace("ดังนั น","ดังนั้น",$line); +$line = str_replace("ดังนี ","ดังนี้",$line); +$line = str_replace("ดัง􀃊 ","ดั้ง",$line); +$line = str_replace("ดัง􀃊","ดั้ง",$line); +$line = str_replace("ดา้ ","ด้า",$line); +$line = str_replace("ดาํ เนนิ","ดำเนิน",$line); +$line = str_replace("ด้านซ้ำย","ด้านซ้าย",$line); +$line = str_replace("ด่าเนน","ดำเนิน",$line); +$line = str_replace("ดาเนิน","ดำเนิน",$line); +$line = str_replace("ด่าเนิน","ดำเนิน",$line); +$line = str_replace("ด้าเนิน","ดำเนิน",$line); +$line = str_replace("ดารง","ดำรง",$line); +$line = str_replace("ด้ารัส","ดำรัส",$line); +$line = str_replace("ดาริ","ดำริ",$line); +$line = str_replace("ด้ำน","ด้าน",$line); +$line = str_replace("ด้ำนการ","ด้านการ",$line); +$line = str_replace("ด้ำนต่าง","ด้านต่าง",$line); +$line = str_replace("ด้ำนพลังงาน","ด้านพลังงาน",$line); +$line = str_replace("ด้ำนแรงงำน","ด้านแรงงาน",$line); +$line = str_replace("ด้ำนวิชำชีพ","ด้านวิชาชีพ",$line); +$line = str_replace("ด้ำนสถำนที่","ด้านสถานที่",$line); +$line = str_replace("ด้ำเนิน","ดำเนิน",$line); +$line = str_replace("ดำเนินกำร","ดำเนินการ",$line); +$line = str_replace("ด้ำเนินกำร","ดำเนินการ",$line); +$line = str_replace("ดำเนินงำน","ดำเนินงาน",$line); +$line = str_replace("ด้ำเนินงำน","ดำเนินงาน",$line); +$line = str_replace("ด้ำเนินตำม ","ดำเนินตาม ",$line); +$line = str_replace("ดำ􀃋 ","ด๊ำ",$line); +$line = str_replace("ดิ,􀃍","ดิ์,",$line); +$line = str_replace("ดิดที่ขอบ","ติดที่ขอบ",$line); +$line = str_replace("ดิดที่ฐาน","ติดที่ฐาน",$line); +$line = str_replace("ดินทากิน","ดินทำกิน",$line); +$line = str_replace("ดินและน้า","ดินและน้ำ",$line); +$line = str_replace("ดิบนาเข้า ","ดิบนำเข้า ",$line); +$line = str_replace("ดิศ􀃍 ","ดิ์ศ",$line); +$line = str_replace("ดิ􀃍","ดิ์",$line); +$line = str_replace("ดี่ง แหลม","ติ่งแหลม",$line); +$line = str_replace("ดีด􀃋 ","ดี๊ด",$line); +$line = str_replace("ดี􀃊 ","ดี้",$line); +$line = str_replace("ดี􀃊","ดี้",$line); +$line = str_replace("ดื่มน้้า","ดื่มน้ำ",$line); +$line = str_replace("ดืม􀃉 ","ดื่ม",$line); +$line = str_replace("ดืม􀃉","ดื่ม",$line); +$line = str_replace("ดื􀃉","ดื่",$line); +$line = str_replace("ดื􀃉ม","ดื่ม",$line); +$line = str_replace("ดุลาคม","ตุลาคม",$line); +$line = str_replace("เด่นซัด","เด่นชัด",$line); +$line = str_replace("เดยี ว","เดียว",$line); +$line = str_replace("เดียวกันเช่น","เดียวกัน เช่น",$line); +$line = str_replace("เดียวกันนี่","เดียวกันนี้",$line); +$line = str_replace("เดีย􀃉 ","เดี่ย",$line); +$line = str_replace("เดีย􀃌 ","เดี๋ย",$line); +$line = str_replace("เดีอน","เดือน",$line); +$line = str_replace("เดี􀃉","เดี่",$line); +$line = str_replace("เดือนทุมภาพันธ์","เดือนกุมภาพันธ์",$line); +$line = str_replace("เดือนลุลาคม","เดือนตุลาคม",$line); +$line = str_replace("แดงเลีอตนก","แดงเลือดนก",$line); +$line = str_replace("ดแู ล","ดูแล",$line); +$line = str_replace("โดยท้าข้อ","โดยทำข้อ",$line); +$line = str_replace("โดยนา","โดยนำ",$line); +$line = str_replace("โดยน้าราย","โดยนำราย",$line); +$line = str_replace("โดยน้าเสนอ","โดยนำเสนอ",$line); +$line = str_replace("โดยน้าหลัก","โดยนำหลัก",$line); +$line = str_replace("โดยน้าเอา","โดยนำเอา",$line); +$line = str_replace("โดยน้ำข้อบกพร่อง","โดยนำข้อบกพร่อง",$line); +$line = str_replace("โดยนำงศิริพร","โดยนางศิริพร",$line); +$line = str_replace("ได้ ทา","ได้ ทำ",$line); +$line = str_replace("ได้ รับ","ได้รับ",$line); +$line = str_replace("ได้ สำเร็จ","ได้สำเร็จ",$line); +$line = str_replace("ไดก้ ","ได้ก",$line); +$line = str_replace("ไดกั้บ","ได้กับ",$line); +$line = str_replace("ไดกี้ดกัน","ได้กีดกัน",$line); +$line = str_replace("ไดข้ ","ได้ข",$line); +$line = str_replace("ไดขึ้","ได้ขึ",$line); +$line = str_replace("ไดค้ ","ได้ค",$line); +$line = str_replace("ไดคิ้ด","ได้คิด",$line); +$line = str_replace("ไดจ้ ","ได้จ",$line); +$line = str_replace("ไดจ้ าก","ได้จาก",$line); +$line = str_replace("ไดจั้ด","ได้จัด",$line); +$line = str_replace("ไดจึ้ง","ได้จึง",$line); +$line = str_replace("ไดชั้ด","ได้ชัด",$line); +$line = str_replace("ไดชั้ดเจน","ได้ชัดเจน",$line); +$line = str_replace("ไดชื้อ","ได้ชือ",$line); +$line = str_replace("ได้เช่น","ได้ เช่น",$line); +$line = str_replace("ได็ใช้","ได้ใช้",$line); +$line = str_replace("ไดซ้ ","ได้ซ",$line); +$line = str_replace("ไดซึ้","ได้ซึ",$line); +$line = str_replace("ไดด้","ได้ด",$line); +$line = str_replace("ไดดี้","ได้ดี",$line); +$line = str_replace("ไดต้ ","ได้ต",$line); +$line = str_replace("ไดต้ าม","ได้ตาม",$line); +$line = str_replace("ไดต้้งั","ได้ตั้ง",$line); +$line = str_replace("ไดตั้","ได้ตั",$line); +$line = str_replace("ได้ตำม","ได้ตาม",$line); +$line = str_replace("ไดติ้ดต่อ","ได้ติดต่อ",$line); +$line = str_replace("ไดถึ้ง","ได้ถึง",$line); +$line = str_replace("ไดท้ ","ได้ท",$line); +$line = str_replace("ไดทั้","ได้ทั",$line); +$line = str_replace("ไดทั้น","ได้ทัน",$line); +$line = str_replace("ไดทั้ว","ได้ทัว",$line); +$line = str_replace("ได้ท้าคัน","ได้ทำคัน",$line); +$line = str_replace("ได้ท้าหนัง","ได้ทำหนัง",$line); +$line = str_replace("ได้ทาหลักฐาน","ได้ทำหลักฐาน",$line); +$line = str_replace("ไดที้","ได้ที",$line); +$line = str_replace("ไดน้ ","ได้น",$line); +$line = str_replace("ได้น้า","ได้นำ",$line); +$line = str_replace("ได้นากระสอบ","ได้นำกระสอบ",$line); +$line = str_replace("ได้น่าค่า","ได้นำค่า",$line); +$line = str_replace("ได้นาเครื่อง","ได้นำเครื่อง",$line); +$line = str_replace("ได้นาดินที่","ได้นำดินที่",$line); +$line = str_replace("ได้น้าน้ำ","ได้นำน้ำ",$line); +$line = str_replace("ได้นาใบ","ได้นำใบ",$line); +$line = str_replace("ได้นาแผ่นพลาสติก","ได้นำแผ่นพลาสติก",$line); +$line = str_replace("ได้นาหนังสือ","ได้นำหนังสือ",$line); +$line = str_replace("ได้น้ำขึ้น","ได้นำขึ้น",$line); +$line = str_replace("ไดบ้ ","ได้บ",$line); +$line = str_replace("ไดป้ ","ได้ป",$line); +$line = str_replace("ไดพ้ ","ได้พ",$line); +$line = str_replace("ไดพั้ฒนา","ได้พัฒนา",$line); +$line = str_replace("ไดพิ้จารณา","ได้พิจารณา",$line); +$line = str_replace("ไดพู้ด","ได้พูด",$line); +$line = str_replace("ไดม้ ","ได้ม",$line); +$line = str_replace("ไดมี้","ได้มี",$line); +$line = str_replace("ไดย้ ","ได้ย",$line); +$line = str_replace("ไดยิ้น","ได้ยิน",$line); +$line = str_replace("ไดร้ ","ได้ร",$line); +$line = str_replace("ได้รับ การเลื่อน","ได้รับการเลื่อน",$line); +$line = str_replace("ไดรั้บ","ได้รับ",$line); +$line = str_replace("ไดรู้ป","ได้รูป",$line); +$line = str_replace("ไดล้ ","ได้ล",$line); +$line = str_replace("ไดล้ ง","ได้ลง",$line); +$line = str_replace("ไดว้ ","ได้ว",$line); +$line = str_replace("ไดว้ ่า","ได้ว่า",$line); +$line = str_replace("ได้ว่ำ","ได้ว่า",$line); +$line = str_replace("ไดวิ้เคราะห์","ได้วิเคราะห์",$line); +$line = str_replace("ไดส้ ","ได้ส",$line); +$line = str_replace("ไดสั้ก","ได้สัก",$line); +$line = str_replace("ไดสิ้","ได้สิ",$line); +$line = str_replace("ไดสู้ญ","ได้สูญ",$line); +$line = str_replace("ไดสู้ญเสีย","ได้สูญเสีย",$line); +$line = str_replace("ไดห้ ","ได้ห",$line); +$line = str_replace("ไดอ้ ","ได้อ",$line); +$line = str_replace("ไดอ้ ยา่ ","ได้อย่า",$line); +$line = str_replace("ไดอ้ ยา่ ง ","ได้อย่าง",$line); +$line = str_replace("ไดอั้นเนื่อง","ได้อันเนื่อง",$line); +$line = str_replace("ไดอี้ก","ได้อีก",$line); +$line = str_replace("ดไี ดอ้ ยา่ ง","ดีได้อย่าง",$line); +$line = str_replace("ไดเ้ ","ได้เ",$line); +$line = str_replace("ไดเ้ ตรียม","ได้เตรียม",$line); +$line = str_replace("ไดเ้","ได้เ",$line); +$line = str_replace("ไดแ้ ","ได้แ",$line); +$line = str_replace("ไดโ้ ","ได้โ",$line); +$line = str_replace("ไดโ้ครง","ได้โครง",$line); +$line = str_replace("ไดไ้ ","ได้ไ",$line); +$line = str_replace("ต้ ","ต้",$line); +$line = str_replace("ตกั ","ตัก",$line); +$line = str_replace("ต้งั ","ตั้ง",$line); +$line = str_replace("ต้งั แตไ่ ดรั้บ","ตั้งแต่ได้รับ",$line); +$line = str_replace("ตงั􀃊 ","ตั้ง",$line); +$line = str_replace("ตดั ","ตัด",$line); +$line = str_replace("ตดิ ต้ง","ติดตั้ง",$line); +$line = str_replace("ตน้ ","ต้น",$line); +$line = str_replace("ตน้","ต้น",$line); +$line = str_replace("ต้นทึ๋เตเต็มที่","ต้นที่โตเต็มที่",$line); +$line = str_replace("ต้นน้า ","ต้นน้ำ ",$line); +$line = str_replace("ต้นนา กลางนา ปลายนา ","ต้นน้ำ กลางน้ำ ปลายน้ำ ",$line); +$line = str_replace("ต้นน้า","ต้นน้ำ",$line); +$line = str_replace("ต้นไมต้ระกูล","ต้นไม้ตระกูล",$line); +$line = str_replace("ต้มนี่า","ต้มน้ำ",$line); +$line = str_replace("ต้มนี่าดี่ม","ต้มน้ำดี่ม",$line); +$line = str_replace("ต้มนื้าดี่ม","ต้มน้ำดื่ม",$line); +$line = str_replace("ตรงช้ามกับ","ตรงข้ามกับ",$line); +$line = str_replace("ตรงตำม","ตรงตาม",$line); +$line = str_replace("ตระกูลชุนนาง","ตระกูลขุนนาง",$line); +$line = str_replace("ตระกูลักน","ตระกูลกัน",$line); +$line = str_replace("ตลอดปิ","ตลอดปี",$line); +$line = str_replace("ตลับตั้งฉาก","สลับตั้งฉาก",$line); +$line = str_replace("ตลาดน้า","ตลาดน้ำ",$line); +$line = str_replace("ตลำด","ตลาด",$line); +$line = str_replace("ตลิง􀃉 ","ตลิ่ง",$line); +$line = str_replace("ตลิง􀃉","ตลิ่ง",$line); +$line = str_replace("ต้วยขนแข็ง","ด้วยขนแข็ง",$line); +$line = str_replace("ตวั ","ตัว",$line); +$line = str_replace("ต้เหต้องอ่อน","สีเหลืองอ่อน",$line); +$line = str_replace("ตอ่ ","ต่อ",$line); +$line = str_replace("ตอ้ ","ต้อ",$line); +$line = str_replace("ตอ่ เน่อื ง","ต่อเนื่อง",$line); +$line = str_replace("ตอก ตีเหลือง","ดอกสีเหลือง",$line); +$line = str_replace("ตอก แยกเพศ","ดอกแยกเพศ",$line); +$line = str_replace("ตอก รูป","ดอกรูป",$line); +$line = str_replace("ตอก ลั'ม่วง","ดอกสีม่วง",$line); +$line = str_replace("ตอก?เมบูรณ์","ดอกสมบูรณ์",$line); +$line = str_replace("ตอกกิขาว","ดอกสีขาว",$line); +$line = str_replace("ตอกต้ขาว","ดอกสีขาว",$line); +$line = str_replace("ตอกติชมพู","ดอกสีชมพู",$line); +$line = str_replace("ตอกเต่น","ดอกเด่น",$line); +$line = str_replace("ตอกเตียว","ดอกเดียว",$line); +$line = str_replace("ตอกถั่ว","ดอกถั่ว",$line); +$line = str_replace("ตอกถึเขียวอ่อน","ดอกสีเขียวอ่อน",$line); +$line = str_replace("ตอกถึม่วง","ดอกสีม่วง",$line); +$line = str_replace("ตอกทีเหลือง","ดอกสีเหลือง",$line); +$line = str_replace("ตอกเพศ","ดอกเพศ",$line); +$line = str_replace("ตอกมีขาว","ดอกมีขาว",$line); +$line = str_replace("ตอกแยก","ดอกแยก",$line); +$line = str_replace("ตอกแยกเพค","ดอกแยกเพศ",$line); +$line = str_replace("ตอกแยกเพศ","ดอกแยกเพศ",$line); +$line = str_replace("ตอกรูป","ดอกรูป",$line); +$line = str_replace("ตอกล็ขมพู","ดอกสีขมพู",$line); +$line = str_replace("ตอกล์ขาว","ดอกสีขาว",$line); +$line = str_replace("ตอกล์ขาวนวล","ดอกสีขาวนวล",$line); +$line = str_replace("ตอกลม'Ljรณ์เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ตอกลมบูรณ์เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ตอกลมใรูรณ์ เพศ","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ตอกลมหูรณ์ เพค","ดอกสมบูรณ์เพศ",$line); +$line = str_replace("ตอกล้เหล้องอมล้ม","ดอกสีเหลืองอมส้ม",$line); +$line = str_replace("ตอกลัม่วงแดง","ดอกสีม่วงแดง",$line); +$line = str_replace("ตอกลิขม}รู","ดอกสีชมพู",$line); +$line = str_replace("ตอกลินวล","ดอกสีนวล",$line); +$line = str_replace("ตอกลิเหลือง","ดอกสีเหลือง",$line); +$line = str_replace("ตอกลี ขาว","ดอกสีขาว",$line); +$line = str_replace("ตอกลี่เหลือง","ดอกสีเหลือง",$line); +$line = str_replace("ตอกลึขาว","ดอกสีขาว",$line); +$line = str_replace("ตอกลึแตง","ดอกสีแดง",$line); +$line = str_replace("ตอกลึน่าตาล","ดอกสีน้ำตาล",$line); +$line = str_replace("ตอกลืแตง","ดอกสีแดง",$line); +$line = str_replace("ตอกลืเหลีอง","ดอกสีเหลือง",$line); +$line = str_replace("ตอกเล็ก","ดอกเล็ก",$line); +$line = str_replace("ตอกสัขาว","ดอกสีขาว",$line); +$line = str_replace("ตอกสัแตง","ดอกสีแดง",$line); +$line = str_replace("ตอกสีขาว","ดอกสีขาว",$line); +$line = str_replace("ตอกสีเขียว","ดอกสีเขียว",$line); +$line = str_replace("ตอกสีชมพู","ดอกสีชมพู",$line); +$line = str_replace("ตอกสีนวล","ดอกสีนวล",$line); +$line = str_replace("ตอกสีนิ้าเงิน","ดอกสีน้ำเงิน",$line); +$line = str_replace("ตอกสีม่วง","ดอกสีม่วง",$line); +$line = str_replace("ตอกสีม่วงแดง","ดอกสีม่วงแดง",$line); +$line = str_replace("ตอกสีส้ม","ดอกสีส้ม",$line); +$line = str_replace("ตอกสีเหลีอง","ดอกสีเหลือง",$line); +$line = str_replace("ตอกสีเหลือง","ดอกสีเหลือง",$line); +$line = str_replace("ตอกให้นื้าหวาน","ดอกให้น้ำหวาน",$line); +$line = str_replace("ต้องค้านึง","ต้องคำนึง",$line); +$line = str_replace("ต้องทาฐาน","ต้องทำฐาน",$line); +$line = str_replace("ต้องทาอย่าง","ต้องทำอย่าง",$line); +$line = str_replace("ต้องน้า","ต้องนำ",$line); +$line = str_replace("ต้องนาข้าวสาร","ต้องนำข้าวสาร",$line); +$line = str_replace("ต้องนาเข้า","ต้องนำเข้า",$line); +$line = str_replace("ต้องนาดิน","ต้องนำดิน",$line); +$line = str_replace("ต้องนาผังเมือง","ต้องนำผังเมือง",$line); +$line = str_replace("ต้องมีกำร","ต้องมีการ",$line); +$line = str_replace("ตองยินยอม","ต้องยินยอม",$line); +$line = str_replace("ต่อท่อนำ","ต่อท่อน้ำ",$line); +$line = str_replace("ต่อนาจาก","ต่อน้ำจาก",$line); +$line = str_replace("ตอบคาถาม","ตอบคำถาม",$line); +$line = str_replace("ตะวันตก เฉียงใต้","ตะวันตกเฉียงใต้",$line); +$line = str_replace("ตั ง","ตั้ง",$line); +$line = str_replace("ตั้ ง","ตั้ง",$line); +$line = str_replace("ตัก􀃋 ","ตั๊ก",$line); +$line = str_replace("ตั้งแด","ตั้งแต่",$line); +$line = str_replace("ตั้งแต้","ตั้งแต่",$line); +$line = str_replace("ตั้งั ","ตั้ง",$line); +$line = str_replace("ตัง􀃊 ","ตั้ง",$line); +$line = str_replace("ตัง􀃊","ตั้ง",$line); +$line = str_replace("ตับเต่ำ","ตับเต่า",$line); +$line = str_replace("ตัวชี วัด","ตัวชี้วัด",$line); +$line = str_replace("ตัวอย่างน้า","ตัวอย่างน้ำ",$line); +$line = str_replace("ตัวอย่างน้้า","ตัวอย่างน้ำ",$line); +$line = str_replace("ตา่ ","ต่า",$line); +$line = str_replace("ต่า","ต่ำ",$line); +$line = str_replace("ต่่า","ต่ำ",$line); +$line = str_replace("ต่้า","ต่ำ",$line); +$line = str_replace("ต่ากว่า","ต่ำกว่า",$line); +$line = str_replace("ต่้ากว่า","ต่ำกว่า",$line); +$line = str_replace("ต่ากว่าค่า","ต่ำกว่าค่า",$line); +$line = str_replace("ต่าง ประเทศ","ต่างประเทศ",$line); +$line = str_replace("ต่างกันซึ่งหมายถึง","ต่างกัน ซึ่งหมายถึง",$line); +$line = str_replace("ต่างทา ","ต่างทำ ",$line); +$line = str_replace("ต้านข้าง","ด้านข้าง",$line); +$line = str_replace("ต้านนอก","ด้านนอก",$line); +$line = str_replace("ต้านใน","",$line); +$line = str_replace("ต้านบน","ด้านบน",$line); +$line = str_replace("ต้านมีขน","ด้านมีขน",$line); +$line = str_replace("ต้านล่าง","ด้านล่าง",$line); +$line = str_replace("ต้านล่างลือ่อน","ด้านล่างสีอ่อน",$line); +$line = str_replace("ตาบล","ตำบล",$line); +$line = str_replace("ต้าบล","ตำบล",$line); +$line = str_replace("ตามกึ่ง","ตามกิ่ง",$line); +$line = str_replace("ตามปุมปม","ตามปุ่มปม",$line); +$line = str_replace("ตารวจ","ตำรวจ",$line); +$line = str_replace("ต้ารวจ","ตำรวจ",$line); +$line = str_replace("ต่้าลง","ต่ำลง",$line); +$line = str_replace("ต่้าสุด","ต่ำสุด",$line); +$line = str_replace("ตาแหน่ง","ตำแหน่ง",$line); +$line = str_replace("ต้าแหน่ง","ตำแหน่ง",$line); +$line = str_replace("ตำ่ ","ต่ำ",$line); +$line = str_replace("ต่ำ กว่า","ต่ำกว่า",$line); +$line = str_replace("ตำ บล","ตำบล",$line); +$line = str_replace("ต่ำ ลง","ต่ำลง",$line); +$line = str_replace("ต่ำ ลึก","ต่ำลึก",$line); +$line = str_replace("ต่ำ สุด","ต่ำสุด",$line); +$line = str_replace("ต่ำกว่ำ","ต่ำกว่า",$line); +$line = str_replace("ต่้ำกว่ำ","ต่ำกว่า",$line); +$line = str_replace("ตำแกม ม่วง","ดำแกมม่วง",$line); +$line = str_replace("ต่ำง ๆ","ต่าง ๆ",$line); +$line = str_replace("ต่ำง","ต่าง",$line); +$line = str_replace("ต่ำงกัน","ต่างกัน",$line); +$line = str_replace("ต่ำงจังหวัด","ต่างจังหวัด",$line); +$line = str_replace("ตำต้น","ลำต้น",$line); +$line = str_replace("ตำเนินการ","ดำเนินการ",$line); +$line = str_replace("ต่ำบล","ตำบล",$line); +$line = str_replace("ตำบลคาโคก","ตำบลคำโคก",$line); +$line = str_replace("ตำบลค่าบง","ตำบลคำบง",$line); +$line = str_replace("ตำบลน้าริด","ตำบลน้ำริด",$line); +$line = str_replace("ตำบลน้าไหล","ตำบลน้ำไหล",$line); +$line = str_replace("ตำบลน้าอ่าง","ตำบลน้ำอ่าง",$line); +$line = str_replace("ตำมกลุ่ม","ตามกลุ่ม",$line); +$line = str_replace("ตำมกิจ","ตามกิจ",$line); +$line = str_replace("ตำมข้อ","ตามข้อ",$line); +$line = str_replace("ตำมขั้น","ตามขั้น",$line); +$line = str_replace("ตำมความ","ตามความ",$line); +$line = str_replace("ตำมควำมจำ","ตามความจำ",$line); +$line = str_replace("ตำมโครง","ตามโครง",$line); +$line = str_replace("ตำมเงื่อนไข","ตามเงื่อนไข",$line); +$line = str_replace("ตำมตัว","ตามตัว",$line); +$line = str_replace("ตำมท้อง","ตามท้อง",$line); +$line = str_replace("ตำมที่","ตามที่",$line); +$line = str_replace("ตำมป","ตามป",$line); +$line = str_replace("ตำมปี","ตามปี",$line); +$line = str_replace("ตำมเป้า","ตามเป้า",$line); +$line = str_replace("ตำมพ","ตามพ",$line); +$line = str_replace("ตำมมา","ตามมา",$line); +$line = str_replace("ตำมมำตร","ตามมาตร",$line); +$line = str_replace("ตำมยุทธ","ตามยุทธ",$line); +$line = str_replace("ตำมระเบียบ","ตามระเบียบ",$line); +$line = str_replace("ตำมลำดับ","ตามลำดับ",$line); +$line = str_replace("ตำมวัตถุ","ตามวัตถุ",$line); +$line = str_replace("ตำมหลัก","ตามหลัก",$line); +$line = str_replace("ตำมแ","ตามแ",$line); +$line = str_replace("ตำแหบ่ง","ตำแหน่ง",$line); +$line = str_replace("ตำ􀃉 ","ต่ำ",$line); +$line = str_replace("ตำ􀃉","ต่ำ",$line); +$line = str_replace("ติเขียวสุกติแตง","สีเขียว สุกสีแดง",$line); +$line = str_replace("ติดเขึ้อ","ติดเชื้อ",$line); +$line = str_replace("ติดซ้า","ติดซ้ำ",$line); +$line = str_replace("ติดตั ง","ติดตั้ง",$line); +$line = str_replace("ติดตำม","ติดตาม",$line); +$line = str_replace("ติตกัน","ติดกัน",$line); +$line = str_replace("ติตทน","ติดทน",$line); +$line = str_replace("ตี่งฉาก","ตั้งฉาก",$line); +$line = str_replace("ตี่งแหลม","ติ่งแหลม",$line); +$line = str_replace("ตีนำตาล","สีน้ำตาล",$line); +$line = str_replace("ตี􀃉","ตี่",$line); +$line = str_replace("ตืน􀃉 ","ตื่น",$line); +$line = str_replace("ตื้อรั้น","ดื้อรั้น",$line); +$line = str_replace("ตื􀃉น","ตื่น",$line); +$line = str_replace("ตื􀃊น","ตื้น",$line); +$line = str_replace("ตุง้","ตุ้ง",$line); +$line = str_replace("ตุน้ ","ตุ้น",$line); +$line = str_replace("ตุลำคม","ตุลาคม",$line); +$line = str_replace("ตู,้","ตู้,",$line); +$line = str_replace("ตูร้ ","ตู้ร",$line); +$line = str_replace("เต้นใบ","เส้นใบ",$line); +$line = str_replace("เตี่ยวทางปลาย","เดี่ยวทางปลาย",$line); +$line = str_replace("เตือนกันยายน","เดือนกันยายน",$line); +$line = str_replace("เตือนกุมภาพันธ์","เดือนกุมภาพันธ์",$line); +$line = str_replace("เตือนตุลาคม","เดือนตุลาคม",$line); +$line = str_replace("เตือนธันวาคม","เดือนธันวาคม",$line); +$line = str_replace("เตือนพฤษภาคม","เดือนพฤษภาคม",$line); +$line = str_replace("เตือนมิถุนายน","เดือนมิถุนายน",$line); +$line = str_replace("เตือนมีนาคม","เดือนมีนาคม",$line); +$line = str_replace("เตือนเมษายน","เดือนเมษายน",$line); +$line = str_replace("เตือนสิงหาคม","เดือนสิงหาคม",$line); +$line = str_replace("แตกกิงตำ","แตกกิ่งต่ำ",$line); +$line = str_replace("แตขั่้น","แต่ขั้น",$line); +$line = str_replace("แตง่","แต่ง",$line); +$line = str_replace("แตทั่้ง","แต่ทั้ง",$line); +$line = str_replace("แตใน","แต่ใน",$line); +$line = str_replace("แตใบ","แต่ใบ",$line); +$line = str_replace("แตม้ ","แต้ม",$line); +$line = str_replace("แต้มแตง","แต้มแดง",$line); +$line = str_replace("แตไม่สำเร็จ","แต่ไม่สำเร็จ",$line); +$line = str_replace("แต่ละครั้งเช่น","แต่ละครั้ง เช่น",$line); +$line = str_replace("แต่ละเลี้ยว","แต่ละเสี้ยว",$line); +$line = str_replace("แตวั่น","แต่วัน",$line); +$line = str_replace("ต้แู ผง","ตู้แผง",$line); +$line = str_replace("แตใ่ น","แต่ใน",$line); +$line = str_replace("โต้งห้อย","โค้งห้อย",$line); +$line = str_replace("โตต้อบ","โต้ตอบ",$line); +$line = str_replace("โตนก้าน","โคนก้าน",$line); +$line = str_replace("โตยเฉพาะ","โดยเฉพาะ",$line); +$line = str_replace("โตว้ ","โต้ว",$line); +$line = str_replace("โตแ้ ","โต้แ",$line); +$line = str_replace("ใต,้","ใต้,",$line); +$line = str_replace("ใตก้ ","ใต้ก",$line); +$line = str_replace("ใตข้ ","ใต้ข",$line); +$line = str_replace("ใตค้ ","ใต้ค",$line); +$line = str_replace("ใตจุ้ด","ใต้จุด",$line); +$line = str_replace("ใตต้","ใต้ต",$line); +$line = str_replace("ใตผ้ ","ใต้ผ",$line); +$line = str_replace("ใตม้ ","ใต้ม",$line); +$line = str_replace("ใตส้ ","ใต้ส",$line); +$line = str_replace("ใตสั้ทอักษร","ใต้สัทอักษร",$line); +$line = str_replace("ใตห้ ","ใต้ห",$line); +$line = str_replace("ใตเ้","ใต้เ",$line); +$line = str_replace("ไต้ถึง","ได้ถึง",$line); +$line = str_replace("ไต้ร่วมมือ","ได้ร่วมมือ",$line); +$line = str_replace("ไต้รับ","ได้รับ",$line); +$line = str_replace("ไต้วงกลีบ","ใต้วงกลีบ",$line); +$line = str_replace("ไต้สำเร็จ","ได้สำเร็จ",$line); +$line = str_replace("ถดั ","ถัด",$line); +$line = str_replace("ถนนแซกวีลล์","ถนนแซกวิลล์",$line); +$line = str_replace("ถว้ ","ถ้ว",$line); +$line = str_replace("ถ้วยตี๋น","ถ้วยตื้น",$line); +$line = str_replace("ถวั􀃉","ถั่ว",$line); +$line = str_replace("ถอ้ ","ถ้อ",$line); +$line = str_replace("ถอ้ ม","ถ้อม",$line); +$line = str_replace("ถังเก็บนา ","ถังเก็บน้ำ ",$line); +$line = str_replace("ถังเก็บนำ","ถังเก็บน้ำ",$line); +$line = str_replace("ถังน้า ","ถังน้ำ ",$line); +$line = str_replace("ถังน้า","ถังน้ำ",$line); +$line = str_replace("ถังน้้า","ถังน้ำ",$line); +$line = str_replace("ถัว􀃉 ","ถั่ว",$line); +$line = str_replace("ถ้าน้าตก","ถ้าน้ำตก",$line); +$line = str_replace("ถำมผู้","ถามผู้",$line); +$line = str_replace("ถำวร","ถาวร",$line); +$line = str_replace("ถิน􀃉 ","ถิ่น",$line); +$line = str_replace("ถิน􀃉","ถิ่น",$line); +$line = str_replace("ถิ􀃉น","ถิ่น",$line); +$line = str_replace("ถี 􀃉","ถี่",$line); +$line = str_replace("ถีข􀃉 ","ถี่ข",$line); +$line = str_replace("ถีช􀃉 ","ถี่ช",$line); +$line = str_replace("ถีด􀃉 ","ถี่ด",$line); +$line = str_replace("ถีต􀃉 ","ถี่ต",$line); +$line = str_replace("ถีท􀃉 ","ถี่ท",$line); +$line = str_replace("ถีธ􀃉 ","ถี่ธ",$line); +$line = str_replace("ถี่นกำเนิด","ถิ่นกำเนิด",$line); +$line = str_replace("ถี่นเดียว","ถิ่นเดียว",$line); +$line = str_replace("ถีม􀃉 ","ถี่ม",$line); +$line = str_replace("ถีร􀃉 ","ถี่ร",$line); +$line = str_replace("ถีส􀃉 ","ถี่ส",$line); +$line = str_replace("ถีเ􀃉 ","ถี่เ",$line); +$line = str_replace("ถีใ􀃉 ","ถี่ใ",$line); +$line = str_replace("ถีไ􀃉 ","ถี่ไ",$line); +$line = str_replace("ถี􀃉","ถี่",$line); +$line = str_replace("ถึงแมผู้พู้ด","ถึงแม้ผู้พูด",$line); +$line = str_replace("ถึนํ้าเงิน","สีนํ้าเงิน",$line); +$line = str_replace("ถึนํ้าตาล","สีนํ้าตาล",$line); +$line = str_replace("ถึน้ำตาล","สีน้ำตาล",$line); +$line = str_replace("ถูกทาลาย","ถูกทำลาย",$line); +$line = str_replace("ถูกน้้ากัด","ถูกน้ำกัด",$line); +$line = str_replace("ถูกน่าชื่อ","ถูกนำชื่อ",$line); +$line = str_replace("ถูกนาใช้","ถูกนำใช้",$line); +$line = str_replace("ถูกยกเสิก","ถูกยกเลิก",$line); +$line = str_replace("แถบดาบัง","แถบดำบัง",$line); +$line = str_replace("ทกั ","ทัก",$line); +$line = str_replace("ทงั􀃉 ","ทั่ง",$line); +$line = str_replace("ทงั􀃊","ทั้ง",$line); +$line = str_replace("ทดนำ้","ทดน้ำ",$line); +$line = str_replace("ทบั ","ทับ",$line); +$line = str_replace("ทมี􀃉 ","ที่ม",$line); +$line = str_replace("ทรงกรร}บอก","ทรงกระบอก",$line); +$line = str_replace("ทรงกรรเบอก","ทรงกระบอก",$line); +$line = str_replace("ทรัพยากรธรรมขาด","ทรัพยากรธรรมชาติ",$line); +$line = str_replace("ทรัพยากรน้า","ทรัพยากรน้ำ",$line); +$line = str_replace("ทรัพยากรน้้า","ทรัพยากรน้ำ",$line); +$line = str_replace("ทรัพยำกร","ทรัพยากร",$line); +$line = str_replace("ทรำบ","ทราบ",$line); +$line = str_replace("ทรำบว่ำ","ทราบว่า",$line); +$line = str_replace("ทวั􀃉 ","ทั่ว",$line); +$line = str_replace("ทวิความรุนแรง","ทวีความรุนแรง",$line); +$line = str_replace("ทวีป แอฟริกา","ทวีปแอฟริกา",$line); +$line = str_replace("ทศั ","ทัศ",$line); +$line = str_replace("ทหารเดิร์ก","ทหารเติร์ก",$line); +$line = str_replace("ทอ้ ","ท้อ",$line); +$line = str_replace("ทอ้ ง","ท้อง",$line); +$line = str_replace("ทองคา","ทองคำ",$line); +$line = str_replace("ท่อน้้า","ท่อน้ำ",$line); +$line = str_replace("ท่อส่งนา","ท่อส่งน้ำ",$line); +$line = str_replace("ท่อส่งนำ","ท่อส่งน้ำ",$line); +$line = str_replace("ทั ง","ทั้ง",$line); +$line = str_replace("ทั งนี","ทั้งนี้",$line); +$line = str_replace("ทักษะ ด้าน","ทักษะด้าน",$line); +$line = str_replace("ทั้ง ","ทั้ง",$line); +$line = str_replace("ทั้ง๒","ทั้ง ๒",$line); +$line = str_replace("ทั้ง๓","ทั้ง ๓",$line); +$line = str_replace("ทั่งช่อ","ทั้งช่อ",$line); +$line = str_replace("ทั่งต้น","ทั้งต้น",$line); +$line = str_replace("ทั้งน้าข้อมูล","ทั้งนำข้อมูล",$line); +$line = str_replace("ทั้งนาคู่มือ","ทั้งนำคู่มือ",$line); +$line = str_replace("ทั้งน้าเสีย","ทั้งน้ำเสีย",$line); +$line = str_replace("ทั้งนี่","ทั้งนี้",$line); +$line = str_replace("ทัง􀃉 ","ทั่ง",$line); +$line = str_replace("ทัง􀃉","ทั่ง",$line); +$line = str_replace("ทัง􀃊 ","ทั้ง",$line); +$line = str_replace("ทัง􀃊","ทั้ง",$line); +$line = str_replace("ทันพ่วงที","ทันท่วงที",$line); +$line = str_replace("ทั้นฟูระบอบ","ฟื้นฟูระบอบ",$line); +$line = str_replace("ทั่ว'ใป","ทั่วไป",$line); +$line = str_replace("ทัว􀃉 ","ทั่ว",$line); +$line = str_replace("ทา โดย","ทำ โดย",$line); +$line = str_replace("ทาการ","ทำการ",$line); +$line = str_replace("ท้าการ","ทำการ",$line); +$line = str_replace("ทาการเพาะปลูก","ทำการเพาะปลูก",$line); +$line = str_replace("ทากำไร","ทำกำไร",$line); +$line = str_replace("ทากิจกรรม","ทำกิจกรรม",$line); +$line = str_replace("ทาเกษตร","ทำเกษตร",$line); +$line = str_replace("ทาขนม","ทำขนม",$line); +$line = str_replace("ทาข้อตก","ทำข้อตก",$line); +$line = str_replace("ทาความ","ทำความ",$line); +$line = str_replace("ท้าความ","ทำความ",$line); +$line = str_replace("ทาความเข้าใจ","ทำความเข้าใจ",$line); +$line = str_replace("ท่าความเข้าใจ","ทำความเข้าใจ",$line); +$line = str_replace("ทาความสะอาด","ทำความสะอาด",$line); +$line = str_replace("ทาค่ายฯ","ทำค่ายฯ",$line); +$line = str_replace("ทาเครื่องหมาย","ทำเครื่องหมาย",$line); +$line = str_replace("ทาง การ","ทางการ",$line); +$line = str_replace("ทางน้า","ทางน้ำ",$line); +$line = str_replace("ทางน้้า","ทางน้ำ",$line); +$line = str_replace("ทางนาธรรมชาติ","ทางน้ำธรรมชาติ",$line); +$line = str_replace("ทางนาผ่าน","ทางน้ำผ่าน",$line); +$line = str_replace("ทางนำ้","ทางน้ำ",$line); +$line = str_replace("ทางาน","ทำงาน",$line); +$line = str_replace("ท้างาน","ทำงาน",$line); +$line = str_replace("ทาเงื่อนไข","ทำเงื่อนไข",$line); +$line = str_replace("ทาจาก","ทำจาก",$line); +$line = str_replace("ท้าจาก","ทำจาก",$line); +$line = str_replace("ท้าได้","ทำได้",$line); +$line = str_replace("ทาทะเบียน","ทำทะเบียน",$line); +$line = str_replace("ทาธุรกิจ","ทำธุรกิจ",$line); +$line = str_replace("ทานอง","ทำนอง",$line); +$line = str_replace("ท้านอง","ทำนอง",$line); +$line = str_replace("ทานา ","ทำนา ",$line); +$line = str_replace("ทานา","ทำนา",$line); +$line = str_replace("ท้านา","ทำนา",$line); +$line = str_replace("ทานาขั้นบันได","ทำนาขั้นบันได",$line); +$line = str_replace("ทานาข้าว","ทำนาข้าว",$line); +$line = str_replace("ทาน้าเย็น","ทำน้ำเย็น",$line); +$line = str_replace("ทาบรรจุ","ทำบรรจุ",$line); +$line = str_replace("ทาใบยืม","ทำใบยืม",$line); +$line = str_replace("ทาปฏิกริยา","ทำปฏิกริยา",$line); +$line = str_replace("ทาประกาศฯ","ทำประกาศฯ",$line); +$line = str_replace("ทาประมง","ทำประมง",$line); +$line = str_replace("ทาประโยชน์","ทำประโยชน์",$line); +$line = str_replace("ทาป้าย","ทำป้าย",$line); +$line = str_replace("ทาปุ๋ย","ทำปุ๋ย",$line); +$line = str_replace("ทาเป็นฝาย","ทำเป็นฝาย",$line); +$line = str_replace("ทาผิว","ทำผิว",$line); +$line = str_replace("ทาพันธ","ทำพันธ",$line); +$line = str_replace("ทาพันธุ์","ทำพันธุ์",$line); +$line = str_replace("ทาลาย","ทำลาย",$line); +$line = str_replace("ทาลายป่า","ทำลายป่า",$line); +$line = str_replace("ทาเลที่","ทำเลที่",$line); +$line = str_replace("ท่าเลที่ตั้ง","ทำเลที่ตั้ง",$line); +$line = str_replace("ท้าสวน","ทำสวน",$line); +$line = str_replace("ทาสวนบ้าน","ทำสวนบ้าน",$line); +$line = str_replace("ทาสวนยาง","ทำสวนยาง",$line); +$line = str_replace("ทาสัญญา","ทำสัญญา",$line); +$line = str_replace("ท่าสัญญา","ทำสัญญา",$line); +$line = str_replace("ท้าสัญญา","ทำสัญญา",$line); +$line = str_replace("ทาหนังสือ","ทำหนังสือ",$line); +$line = str_replace("ทาหนังสือแจ้ง","ทำหนังสือแจ้ง",$line); +$line = str_replace("ทาหน้าที่","ทำหน้าที่",$line); +$line = str_replace("ท่าหน้าที่","ทำหน้าที่",$line); +$line = str_replace("ท้าหน้าที่","ทำหน้าที่",$line); +$line = str_replace("ท่าหลักฐาน","ทำหลักฐาน",$line); +$line = str_replace("ทาเหมือง","ทำเหมือง",$line); +$line = str_replace("ทาให้","ทำให้",$line); +$line = str_replace("ท่าให","ทำให",$line); +$line = str_replace("ท้าให้","ทำให้",$line); +$line = str_replace("ทาอันตราย","ทำอันตราย",$line); +$line = str_replace("ทาอาหาร","ทำอาหาร",$line); +$line = str_replace("ทาเอกสาร","ทำเอกสาร",$line); +$line = str_replace("ท้ำกำร","ทำการ",$line); +$line = str_replace("ท้ำกำรมุง","ทำการมุง",$line); +$line = str_replace("ท้ำกำรวิเครำะห์","ทำการวิเคราะห์",$line); +$line = str_replace("ท้ำกำรสำธิต","ทำการสาธิต",$line); +$line = str_replace("ท้ำเกษตร","ทำเกษตร",$line); +$line = str_replace("ทำค้าขอ","ทำคำขอ",$line); +$line = str_replace("ทำงการ","ทางการ",$line); +$line = str_replace("ทำงกำร","ทางการ",$line); +$line = str_replace("ทำงเข้ำ","ทางเข้า",$line); +$line = str_replace("ทำงด้าน","ทางด้าน",$line); +$line = str_replace("ทำงเดียว","ทางเดียว",$line); +$line = str_replace("ทำงปฏิบัติ","ทางปฏิบัติ",$line); +$line = str_replace("ทำงพิเศษ","ทางพิเศษ",$line); +$line = str_replace("ทำงแพ่ง","ทางแพ่ง",$line); +$line = str_replace("ทำงละเมิด","ทางละเมิด",$line); +$line = str_replace("ทำงเลือก","ทางเลือก",$line); +$line = str_replace("ทำงวิชาการ","ทางวิชาการ",$line); +$line = str_replace("ทำงเศรษฐกิจ","ทางเศรษฐกิจ",$line); +$line = str_replace("ทำงสถานี","ทางสถานี",$line); +$line = str_replace("ทำงสังคม","ทางสังคม",$line); +$line = str_replace("ทำงหลวง","ทางหลวง",$line); +$line = str_replace("ทำงให้","ทางให้",$line); +$line = str_replace("ทำงอาญา","ทางอาญา",$line); +$line = str_replace("ทำงอิเล็กทรอนิกส์","ทางอิเล็กทรอนิกส์",$line); +$line = str_replace("ทำงำน","ทำงาน",$line); +$line = str_replace("ทำนำมากกว่า","ทำนามากกว่า",$line); +$line = str_replace("ทำมำ","ทำมา",$line); +$line = str_replace("ทำหน้ำ","ทำหน้า",$line); +$line = str_replace("ท้ำให้","ทำให้",$line); +$line = str_replace("ทิ􀃊ง","ทิ้ง",$line); +$line = str_replace("ที ่","ที่",$line); +$line = str_replace("ที่ เข้มแข็ง","ที่เข้มแข็ง",$line); +$line = str_replace("ที่ จุ","ที่จุ",$line); +$line = str_replace("ที่ ซ้ำ","ที่ซ้ำ",$line); +$line = str_replace("ที่ ดิน","ที่ดิน",$line); +$line = str_replace("ที่ ตี่าลง","ที่ต่ำลง",$line); +$line = str_replace("ที่ นั่ง","ที่นั่ง",$line); +$line = str_replace("ที่ มี เชื้อ","ที่มีเชื้อ",$line); +$line = str_replace("ที่ ยุบ","ที่ยุบ",$line); +$line = str_replace("ที่ รัฐ","ที่รัฐ",$line); +$line = str_replace("ที 􀃉","ที่",$line); +$line = str_replace("ที,􀃉","ที่,",$line); +$line = str_replace("ที…􀃉","ที่…",$line); +$line = str_replace("ที)􀃉","ที่)",$line); +$line = str_replace("ทีเกิ่ ด","ที่เกิด",$line); +$line = str_replace("ทีก􀃉 ","ที่ก",$line); +$line = str_replace("ทีข􀃉 ","ที่ข",$line); +$line = str_replace("ที้ข􀃉 ","ที่ข",$line); +$line = str_replace("ทีค􀃉 ","ที่ค",$line); +$line = str_replace("ทีง􀃉 ","ที่ง",$line); +$line = str_replace("ที่จาหน่าย","ที่จำหน่าย",$line); +$line = str_replace("ทีจ􀃉 ","ที่จ",$line); +$line = str_replace("ทีฉ􀃉 ","ที่ฉ",$line); +$line = str_replace("ที่ชื่น","ที่ชื้น",$line); +$line = str_replace("ทีช􀃉 ","ที่ช",$line); +$line = str_replace("ทีซ􀃉 ","ที่ซ",$line); +$line = str_replace("ทีฐ􀃉 ","ที่ฐ",$line); +$line = str_replace("ทีด􀃉 ","ที่ด",$line); +$line = str_replace("ทีตั้่ ง","ที่ตั้ง",$line); +$line = str_replace("ที่ต่ำ ในการแยก","ที่ต่ำในการแยก",$line); +$line = str_replace("ทีต􀃉 ","ที่ต",$line); +$line = str_replace("ทีถ􀃉 ","ที่ถ",$line); +$line = str_replace("ที่ทา","ที่ทำ",$line); +$line = str_replace("ที่ทาการ","ที่ทำการ",$line); +$line = str_replace("ที่ทากิน","ที่ทำกิน",$line); +$line = str_replace("ที่ทาหน้าที่","ที่ทำหน้าที่",$line); +$line = str_replace("ที่ทำงราชการ","ที่ทางราชการ",$line); +$line = str_replace("ทีท􀃉 ","ที่ท",$line); +$line = str_replace("ทีธ􀃉 ","ที่ธ",$line); +$line = str_replace("ที่นั่ง ที่มีขา","ที่นั่งที่มีขา",$line); +$line = str_replace("ที่นั่นคง","ที่มั่นคง",$line); +$line = str_replace("ที่นั่นทอน","ที่บั่นทอน",$line); +$line = str_replace("ที่นาคอม","ที่นำคอม",$line); +$line = str_replace("ที่น้าสามารถ","ที่น้ำสามารถ",$line); +$line = str_replace("ที่น้าไหล","ที่น้ำไหล",$line); +$line = str_replace("ที่นี้","ที่นี่",$line); +$line = str_replace("ทีน􀃉 ","ที่น",$line); +$line = str_replace("ทีน􀃉","ที่น",$line); +$line = str_replace("ทีบ􀃉 ","ที่บ",$line); +$line = str_replace("ที่ปรึกษา ทางวิชาการ","ที่ปรึกษาทางวิชาการ",$line); +$line = str_replace("ทีป􀃉 ","ที่ป",$line); +$line = str_replace("ทีผ􀃉 ","ที่ผ",$line); +$line = str_replace("ทีพั่ ก","ที่พัก",$line); +$line = str_replace("ทีพ􀃉 ","ที่พ",$line); +$line = str_replace("ทีภ􀃉 ","ที่ภ",$line); +$line = str_replace("ที่มี ชื่อเสียง","ที่มีชื่อเสียง",$line); +$line = str_replace("ทีม􀃉 ","ที่ม",$line); +$line = str_replace("ทีม􀃉 ","ที่มี",$line); +$line = str_replace("ทีม􀃉 า","ที่มา",$line); +$line = str_replace("ที่ยอต","ที่ยอด",$line); +$line = str_replace("ทีย􀃉 ","ที่ย",$line); +$line = str_replace("ทีร􀃉 ","ที่ร",$line); +$line = str_replace("ทีลงตั่ ว","ที่ลงตัว",$line); +$line = str_replace("ทีล􀃉 ","ที่ล",$line); +$line = str_replace("ทีว􀃉 ","ที่ว",$line); +$line = str_replace("ทีศ􀃉 ","ที่ศ",$line); +$line = str_replace("ที่สื่อ โดย","ที่สื่อโดย",$line); +$line = str_replace("ที่สื่อ อารมณ์","ที่สื่ออารมณ์",$line); +$line = str_replace("ทีสุ่ ด ","ที่สุด",$line); +$line = str_replace("ที่สูงจาก ระดับน้ำ","ที่สูงจากระดับน้ำ",$line); +$line = str_replace("ที่ใส่งแจ้ง","ที่โล่งแจ้ง",$line); +$line = str_replace("ทีส􀃉 ","ที่ส",$line); +$line = str_replace("ทีส􀃉","ที่ส",$line); +$line = str_replace("ทีห􀃉 ","ที่ห",$line); +$line = str_replace("ทีอ􀃉 ","ที่อ",$line); +$line = str_replace("ทีเ􀃉 ","ที่เ",$line); +$line = str_replace("ทีเ􀃉","ที่เ",$line); +$line = str_replace("ทีแ􀃉 ","ที่แ",$line); +$line = str_replace("ทีโ􀃉 ","ที่โ",$line); +$line = str_replace("ทีใ􀃉 ","ที่ใ",$line); +$line = str_replace("ทีไ􀃉 ","ที่ไ",$line); +$line = str_replace("ทีไ􀃉 ด้","ที่ได้",$line); +$line = str_replace("ที􀃉","ที่",$line); +$line = str_replace("ที�","ที่",$line); +$line = str_replace("ทื่สูง","ที่สูง",$line); +$line = str_replace("ทื่อยู่","ที่อยู่",$line); +$line = str_replace("ทุกข~์ ","ทุกข์~",$line); +$line = str_replace("ทุกรำย ","ทุกราย ",$line); +$line = str_replace("ทุกล่วน","ทุกส่วน",$line); +$line = str_replace("ทุกลา","ทุกลำ",$line); +$line = str_replace("ทุเกส่วน","ทุกส่วน",$line); +$line = str_replace("ทุ่นลอยน้า","ทุ่นลอยน้ำ",$line); +$line = str_replace("ทุ่นลอยนำ","ทุ่นลอยน้ำ",$line); +$line = str_replace("ทุใบเรียว","หูใบเรียว",$line); +$line = str_replace("ทุมภาพันธ์","กุมภาพันธ์",$line); +$line = str_replace("ทุเรียนน้า","ทุเรียนน้ำ",$line); +$line = str_replace("ทุหลาบขาว","กุหลาบขาว",$line); +$line = str_replace("ทุหลาบป่า","กุหลาบป่า",$line); +$line = str_replace("เท่านั้นแต่เป็น","เท่านั้น แต่เป็น",$line); +$line = str_replace("เท่ำ","เท่า",$line); +$line = str_replace("เท่ำนั้น","เท่านั้น",$line); +$line = str_replace("ท่เี กิด","ที่เกิด",$line); +$line = str_replace("เที่ ยว","เที่ยว",$line); +$line = str_replace("เทียบเท่ำ","เทียบเท่า",$line); +$line = str_replace("แทข้ ","แท้ข",$line); +$line = str_replace("แท้งค์น้า","แท้งค์น้ำ",$line); +$line = str_replace("แทจ้ ","แท้จ",$line); +$line = str_replace("แท่นวัดน้า","แท่นวัดน้ำ",$line); +$line = str_replace("แท้บเล็ต","แท็บเล็ต",$line); +$line = str_replace("แทมี้","แท้มี",$line); +$line = str_replace("แทรู้ป","แท้รูป",$line); +$line = str_replace("แทสั้","แท้สั",$line); +$line = str_replace("โทษจาคุก","โทษจำคุก",$line); +$line = str_replace("ท่ไี ","ที่ไ",$line); +$line = str_replace("ธนาคารน้า","ธนาคารน้ำ",$line); +$line = str_replace("ธรรมชำติ","ธรรมชาติ",$line); +$line = str_replace("ธว้ข่สัย","ธวัชชัย",$line); +$line = str_replace("ธวัๆเข้ย","ธวัชชัย",$line); +$line = str_replace("ธวัขข้ย","ธวัชชัย",$line); +$line = str_replace("ธวัขขัย","ธวัชชัย",$line); +$line = str_replace("ธิ 􀃍","ธิ์",$line); +$line = str_replace("ธิ􀃍","ธิ์",$line); +$line = str_replace("น ","น",$line); +$line = str_replace("น ัง􀃉","นั่ง",$line); +$line = str_replace("น ี 􀃉","นี่",$line); +$line = str_replace("น ีห􀃉 ","นี่ห",$line); +$line = str_replace("นครเจนึวา","นครเจนีวา",$line); +$line = str_replace("นครเจนืวา","นครเจนีวา",$line); +$line = str_replace("นครราชลิมา","นครราชสีมา",$line); +$line = str_replace("นครราชสิมา","นครราชสีมา",$line); +$line = str_replace("นนั􀃊 ","นั้น",$line); +$line = str_replace("นนั􀃊 ","นั้น",$line); +$line = str_replace("นนั􀃊","นั้น",$line); +$line = str_replace("นโยบำย","นโยบาย",$line); +$line = str_replace("นอ้ ","น้อ",$line); +$line = str_replace("นอ้ ย","น้อย",$line); +$line = str_replace("นอกจากนั้นยังมี","นอกจากนั้น ยังมี",$line); +$line = str_replace("นอกจากนี ","นอกจากนี้ ",$line); +$line = str_replace("นอกจากนี ","นอกจากนี้",$line); +$line = str_replace("นอกจากนี่","นอกจากนี้",$line); +$line = str_replace("นอกจำก","นอกจาก",$line); +$line = str_replace("น้อยกว่ำ","น้อยกว่า",$line); +$line = str_replace("นอร์แมนสกอตต์","นอร์แมน สกอตต์",$line); +$line = str_replace("นอร์เวย","นอร์เวย์",$line); +$line = str_replace("นอร์เวย์์","นอร์เวย์",$line); +$line = str_replace("น้อี ีก","นี้อีก",$line); +$line = str_replace("นั น ๆ","นั้น ๆ",$line); +$line = str_replace("นั่ง ที่โต๊ะ","นั่งที่โต๊ะ",$line); +$line = str_replace("นั่ง บนที่นั่ง","นั่งบนที่นั่ง",$line); +$line = str_replace("นั่ง รถ","นั่งรถ",$line); +$line = str_replace("นั่ง อยู่","นั่งอยู่",$line); +$line = str_replace("นัง􀃉 ","นั่ง",$line); +$line = str_replace("นัง􀃉","นั่ง",$line); +$line = str_replace("นัน􀃉 ","นั่น",$line); +$line = str_replace("นัน􀃉","นั่น",$line); +$line = str_replace("นัน􀃊 ","นั้น",$line); +$line = str_replace("นั้น􀃊 ","นั้น",$line); +$line = str_replace("นัน􀃊","นั้น",$line); +$line = str_replace("นับถือ นิกาย","นับถือนิกาย",$line); +$line = str_replace("นัองสาว","น้องสาว",$line); +$line = str_replace("นั้าทะเล","น้ำทะเล",$line); +$line = str_replace("นั􀃊น","นั้น",$line); +$line = str_replace("น้้า","น้ำ",$line); +$line = str_replace("นากฎหมาย","นำกฎหมาย",$line); +$line = str_replace("นากระแส","นำกระแส",$line); +$line = str_replace("น้ากลั่น","น้ำกลั่น",$line); +$line = str_replace("นากลุ่ม","นำกลุ่ม",$line); +$line = str_replace("นากิจกรรมต่าง ๆ","นำกิจกรรมต่าง ๆ",$line); +$line = str_replace("นาขยะ","นำขยะ",$line); +$line = str_replace("น่าข้อ","นำข้อ",$line); +$line = str_replace("นาข้อตรวจ","นำข้อตรวจ",$line); +$line = str_replace("นาข้อบกพร่อง","นำข้อบกพร่อง",$line); +$line = str_replace("นาข้อมูล","นำข้อมูล",$line); +$line = str_replace("นาข้อสอบ","นำข้อสอบ",$line); +$line = str_replace("นาขีเยอรมัน","นาซีเยอรมัน",$line); +$line = str_replace("น้าขึ้น","น้ำขึ้น",$line); +$line = str_replace("น้าขุ่น ","น้ำขุ่น ",$line); +$line = str_replace("น้่าแข็ง","น้ำแข็ง",$line); +$line = str_replace("นาครุภัณฑ์","นำครุภัณฑ์",$line); +$line = str_replace("นาความ","นำความ",$line); +$line = str_replace("นาค่า","นาคำ",$line); +$line = str_replace("นาคำใช้","นำคำใช้",$line); +$line = str_replace("น่าคู่","นำคู่",$line); +$line = str_replace("น้าเค็ม","น้ำเค็ม",$line); +$line = str_replace("นาโครงการ","นำโครงการ",$line); +$line = str_replace("นางบ","นำงบ",$line); +$line = str_replace("นาเงิน","นำเงิน",$line); +$line = str_replace("น่าเงิน","นำเงิน",$line); +$line = str_replace("น้้าชล","น้ำชล",$line); +$line = str_replace("น้าชะมูล","น้ำชะมูล",$line); +$line = str_replace("นาชื่อ","นำชื่อ",$line); +$line = str_replace("น้าใช้","น้ำใช้",$line); +$line = str_replace("นาฐานข้อมูล","นำฐานข้อมูล",$line); +$line = str_replace("น้้าด้วย","น้ำด้วย",$line); +$line = str_replace("น้าดอกไม้","น้ำดอกไม้",$line); +$line = str_replace("นาดาขั้นบันได","นาดำขั้นบันได",$line); +$line = str_replace("น้าดิบ","น้ำดิบ",$line); +$line = str_replace("นาดื่ม","น้ำดื่ม",$line); +$line = str_replace("น้าดื่ม","น้ำดื่ม",$line); +$line = str_replace("น้่าดื่ม","น้ำดื่ม",$line); +$line = str_replace("น้้าดื่ม","น้ำดื่ม",$line); +$line = str_replace("น้าตกคล","น้ำตกคล",$line); +$line = str_replace("น้าต้นทาง","น้ำต้นทาง",$line); +$line = str_replace("น้าต้นทุน","น้ำต้นทุน",$line); +$line = str_replace("นํ้าตาล อ่อน","นํ้าตาลอ่อน",$line); +$line = str_replace("น้าตาล","น้ำตาล",$line); +$line = str_replace("นํ้าตาลตำ","นํ้าตาลดำ",$line); +$line = str_replace("นํ้าตาลแตง","นํ้าตาลแดง",$line); +$line = str_replace("นํ้าตาลอมแตง","นํ้าตาลอมแดง",$line); +$line = str_replace("น้าใต้ดิน","น้ำใต้ดิน",$line); +$line = str_replace("น่าทรัพย์","นำทรัพย์",$line); +$line = str_replace("นาทรัพย์สิน","นำทรัพย์สิน",$line); +$line = str_replace("นาท่วม","น้ำท่วม",$line); +$line = str_replace("น้าท่วม","น้ำท่วม",$line); +$line = str_replace("น้้าท่วม","น้ำท่วม",$line); +$line = str_replace("น้าทิ้ง","น้ำทิ้ง",$line); +$line = str_replace("น้าที่กักเก็บ","น้ำที่กักเก็บ",$line); +$line = str_replace("นาที่ดิน","นำที่ดิน",$line); +$line = str_replace("น้้าที่มี","น้ำที่มี",$line); +$line = str_replace("น้าที่ไม่สะอาด","น้ำที่ไม่สะอาด",$line); +$line = str_replace("น้านม","น้ำนม",$line); +$line = str_replace("นานา ประเทศ","นานาประเทศ",$line); +$line = str_replace("นาน้า","นำน้ำ",$line); +$line = str_replace("น้าน้ำไป","นำน้ำไป",$line); +$line = str_replace("น้าเน่าเสีย","น้ำเน่าเสีย",$line); +$line = str_replace("น้้าเน่าเสีย","น้ำเน่าเสีย",$line); +$line = str_replace("นาแนว","นำแนว",$line); +$line = str_replace("นาแนวทาง","นำแนวทาง",$line); +$line = str_replace("น้าแนวทาง","นำแนวทาง",$line); +$line = str_replace("น้าในตู้","น้ำในตู้",$line); +$line = str_replace("นาบาดาล","น้ำบาดาล",$line); +$line = str_replace("น้าบาดาล","น้ำบาดาล",$line); +$line = str_replace("น้่าบาดาล","น้ำบาดาล",$line); +$line = str_replace("น้้าบาดาล","น้ำบาดาล",$line); +$line = str_replace("น้าประปา","น้ำประปา",$line); +$line = str_replace("น้่าประปา","น้ำประปา",$line); +$line = str_replace("น้้าประปา","น้ำประปา",$line); +$line = str_replace("นาปัญหา","นำปัญหา",$line); +$line = str_replace("น้าปาด","น้ำปาด",$line); +$line = str_replace("น่าปุ๋ย","นำปุ๋ย",$line); +$line = str_replace("นาไป","นำไป",$line); +$line = str_replace("น่าไป","นำไป",$line); +$line = str_replace("น้าไป","นำไป",$line); +$line = str_replace("น่าไปดำเนิน","นำไปดำเนิน",$line); +$line = str_replace("นาผล","นำผล",$line); +$line = str_replace("นาผ้า","นำผ้า",$line); +$line = str_replace("น้าผิวดิน","น้ำผิวดิน",$line); +$line = str_replace("น้าพลังงาน","น้ำพลังงาน",$line); +$line = str_replace("น้าพี้","น้ำพี้",$line); +$line = str_replace("น้าพุร้อน","น้ำพุร้อน",$line); +$line = str_replace("น่าภาษี","นำภาษี",$line); +$line = str_replace("น้ามัน","น้ำมัน",$line); +$line = str_replace("น้่ามัน","น้ำมัน",$line); +$line = str_replace("น้้ามัน","น้ำมัน",$line); +$line = str_replace("นํ๋ามัน","น้ำมัน",$line); +$line = str_replace("นามา","นำมา",$line); +$line = str_replace("น้ามา","นำมา",$line); +$line = str_replace("นาเมล็ดพันธุ์","นำเมล็ดพันธุ์",$line); +$line = str_replace("นาไม้ผล","นำไม้ผล",$line); +$line = str_replace("น้าไม่พอ","น้ำไม่พอ",$line); +$line = str_replace("น้าไม่สะอาด","น้ำไม่สะอาด",$line); +$line = str_replace("น้าไม่ไหล","น้ำไม่ไหล",$line); +$line = str_replace("นายพงษํ.สักติ","นายพงษ์ศักดิ์",$line); +$line = str_replace("น้ายังท่วม","น้ำยังท่วม",$line); +$line = str_replace("น้ายางสด","น้ำยางสด",$line); +$line = str_replace("นารถ","นำรถ",$line); +$line = str_replace("นาร่อง","นำร่อง",$line); +$line = str_replace("น้าร่อง","นำร่อง",$line); +$line = str_replace("น้้าระบาย","น้ำระบาย",$line); +$line = str_replace("น้าระเหย","น้ำระเหย",$line); +$line = str_replace("นารายการ","นำรายการ",$line); +$line = str_replace("น่ารายการ","นำรายการ",$line); +$line = str_replace("นารายได้","นำรายได้",$line); +$line = str_replace("น้าเรือตาม","นำเรือตาม",$line); +$line = str_replace("น้าแร่","น้ำแร่",$line); +$line = str_replace("น้าโรงกรอง","น้ำโรงกรอง",$line); +$line = str_replace("น้าลง","น้ำลง",$line); +$line = str_replace("น้าล้น","น้ำล้น",$line); +$line = str_replace("น้้าล้า","น้ำลำ",$line); +$line = str_replace("น้าเล็ก ๆ","น้ำเล็ก ๆ",$line); +$line = str_replace("นาวัสด","นำวัสด",$line); +$line = str_replace("น้าสกปรก","น้ำสกปรก",$line); +$line = str_replace("นาส่ง","นำส่ง",$line); +$line = str_replace("น่าส่ง","นำส่ง",$line); +$line = str_replace("นาส่งคืน","นำส่งคืน",$line); +$line = str_replace("น้าส่งทดสอบ","น้ำส่งทดสอบ",$line); +$line = str_replace("น้าสะอาด","น้ำสะอาด",$line); +$line = str_replace("น้้าสามารถ","น้ำสามารถ",$line); +$line = str_replace("น้าสำหรับบริโภค","น้ำสำหรับบริโภค",$line); +$line = str_replace("นาสินค้า","นำสินค้า",$line); +$line = str_replace("นาเสนอ","นำเสนอ",$line); +$line = str_replace("น้าเสีย","น้ำเสีย",$line); +$line = str_replace("น้้าเสีย","น้ำเสีย",$line); +$line = str_replace("นาหญ้า","นำหญ้า",$line); +$line = str_replace("น้าหนองทานบ","น้ำหนองทำนบ",$line); +$line = str_replace("น้าหนัก","น้ำหนัก",$line); +$line = str_replace("น้าหมัก","น้ำหมัก",$line); +$line = str_replace("น้าหมักชีวภาพ","น้ำหมักชีวภาพ",$line); +$line = str_replace("น้าหยด","น้ำหยด",$line); +$line = str_replace("นาหลัก","นำหลัก",$line); +$line = str_replace("น้าหลังกรอง","น้ำหลังกรอง",$line); +$line = str_replace("น้าหลาก","น้ำหลาก",$line); +$line = str_replace("น้าไหล","น้ำไหล",$line); +$line = str_replace("นาอาคาร","นำอาคาร",$line); +$line = str_replace("น้าอุปโภค","น้ำอุปโภค",$line); +$line = str_replace("นาเอกสาร","นำเอกสาร",$line); +$line = str_replace("น้าฯ","น้ำฯ",$line); +$line = str_replace("น้ำ ประปา","น้ำประปา",$line); +$line = str_replace("นำ้","น้ำ",$line); +$line = str_replace("น้ำข้อมูล","นำข้อมูล",$line); +$line = str_replace("นำเขามา","นำเข้ามา",$line); +$line = str_replace("นำเงินอ่อน","น้ำเงินอ่อน",$line); +$line = str_replace("น้ำจำกถัง","น้ำจากถัง",$line); +$line = str_replace("น้ำต่้า","น้ำต่ำ",$line); +$line = str_replace("นำตาลแตง","น้ำตาลแดง",$line); +$line = str_replace("น้ำตาลอมแตง","น้ำตาลอมแดง",$line); +$line = str_replace("น้ำทาได้","น้ำทำได้",$line); +$line = str_replace("นำที่สะอาด","น้ำที่สะอาด",$line); +$line = str_replace("นำที่สูบ","น้ำที่สูบ",$line); +$line = str_replace("นำนส่ง","นานส่ง",$line); +$line = str_replace("นำน้า","นำน้ำ",$line); +$line = str_replace("นำนำ","นำน้ำ",$line); +$line = str_replace("นำบาดาล","น้ำบาดาล",$line); +$line = str_replace("นำบำดำล","น้ำบาดาล",$line); +$line = str_replace("นำประปา","น้ำประปา",$line); +$line = str_replace("นำมา ป่น","นำมาป่น",$line); +$line = str_replace("นำมำ","นำมา",$line); +$line = str_replace("น้ำมำปรับปรุง","นำมาปรับปรุง",$line); +$line = str_replace("นำยก","นายก",$line); +$line = str_replace("นำยกเทศ","นายกเทศ",$line); +$line = str_replace("นำยกองค์","นายกองค์",$line); +$line = str_replace("นำยกองค์กร","นายกองค์กร",$line); +$line = str_replace("นำยจ้ำง","นายจ้าง",$line); +$line = str_replace("น้ำยำงนอน","น้ำยางนอน",$line); +$line = str_replace("นำล้นตลิ่ง","น้ำล้นตลิ่ง",$line); +$line = str_replace("นำเลี้ยง","น้ำเลี้ยง",$line); +$line = str_replace("นำ􀃊 ","น้ำ",$line); +$line = str_replace("นำ􀃊","น้ำ",$line); +$line = str_replace("นิ􀃊ว","นิ้ว",$line); +$line = str_replace("นี 􀃉 ","นี่",$line); +$line = str_replace("นี 􀃊","นี้",$line); +$line = str_replace("นี,􀃉","นี่,",$line); +$line = str_replace("นี,􀃉","นี้,",$line); +$line = str_replace("นีก􀃉 ","นี่ก",$line); +$line = str_replace("นีโคไล เชาเชสถู","นีโคไล เชาเชสกู",$line); +$line = str_replace("นีท􀃉 ","นี่ท",$line); +$line = str_replace("นีน􀃉 ","นี่น",$line); +$line = str_replace("นีเป็้ น","นี้เป็น",$line); +$line = str_replace("นีป􀃉 ","นี้ป",$line); +$line = str_replace("นีส􀃉 ","นี่ส",$line); +$line = str_replace("นีห􀃉 ","นี่ห",$line); +$line = str_replace("นี่าดื่ม","น้ำดื่ม",$line); +$line = str_replace("นี่าต้ม","น้ำต้ม",$line); +$line = str_replace("นี่าตาลแดง","น้ำตาลแดง",$line); +$line = str_replace("นี่าทะเล","น้ำทะเล",$line); +$line = str_replace("นีเ􀃉 ","นี่เ",$line); +$line = str_replace("นีไ􀃉 ","นี่ไ",$line); +$line = str_replace("นี􀃉","นี่",$line); +$line = str_replace("นี􀃊 ","นี้",$line); +$line = str_replace("นี้􀃊 ","นี้",$line); +$line = str_replace("นี􀃊","นี้",$line); +$line = str_replace("นึ่งนอนใจ","นิ่งนอนใจ",$line); +$line = str_replace("นื้าตาล","น้ำตาล",$line); +$line = str_replace("นื้าทะเล","น้ำทะเล",$line); +$line = str_replace("นื้ามันใล","น้ำมันใส",$line); +$line = str_replace("นื้ามันใส","น้ำมันใส",$line); +$line = str_replace("นื้าสีแดง","น้ำสีแดง",$line); +$line = str_replace("นูน้ ","นู้น",$line); +$line = str_replace("นูนโต้ง","นูนโค้ง",$line); +$line = str_replace("เนน้ ","เน้น",$line); +$line = str_replace("เนน้","เน้น",$line); +$line = str_replace("เน้นย้า","เน้นย้ำ",$line); +$line = str_replace("เนลสันฟรานซิส","เนลสัน ฟรานซิส",$line); +$line = str_replace("เนอบาง","เนื้อบาง",$line); +$line = str_replace("เน่อื ง","เนื่อง",$line); +$line = str_replace("เนี่อแข็ง","เนื้อแข็ง",$line); +$line = str_replace("เนี่อนุ่ม","เนื้อนุ่ม",$line); +$line = str_replace("เนี่อใบ","เนื้อใบ",$line); +$line = str_replace("เนี่อไม้","เนื้อไม้",$line); +$line = str_replace("เนี่อหนึ่ง","เนื้อหนึ่ง",$line); +$line = str_replace("เนึ่'อหนึ่ง","เนื้อหนึ่ง",$line); +$line = str_replace("เนึ๋อ","เนื้อ",$line); +$line = str_replace("เนึ่อแข็ง","เนื้อแข็ง",$line); +$line = str_replace("เนึ้อแข็ง","เนื้อแข็ง",$line); +$line = str_replace("เนึ้อหนึ่ง","เนื้อหนึ่ง",$line); +$line = str_replace("เนื่องจำก","เนื่องจาก",$line); +$line = str_replace("เนื้อสัตวี","เนื้อสัตว์",$line); +$line = str_replace("เนื้อหำ","เนื้อหา",$line); +$line = str_replace("เนือ􀃉 ","เนื่อ",$line); +$line = str_replace("เนื􀃉อง","เนื่อง",$line); +$line = str_replace("เนื􀃊อ","เนื้อ",$line); +$line = str_replace("แน่ซัด","แน่ชัด",$line); +$line = str_replace("แนบมำ","แนบมา",$line); +$line = str_replace("แนวเตียว","แนวเดียว",$line); +$line = str_replace("แนวทำง","แนวทาง",$line); +$line = str_replace("แนวโน้มชอง","แนวโน้มของ",$line); +$line = str_replace("แนะนา","แนะนำ",$line); +$line = str_replace("แนะน่า","แนะนำ",$line); +$line = str_replace("แนะน้า","แนะนำ",$line); +$line = str_replace("แนะน้ำ ","แนะนำ ",$line); +$line = str_replace("แนะน้ำ","แนะนำ",$line); +$line = str_replace("โนนจาปา","โนนจำปา",$line); +$line = str_replace("โนม้ ","โน้ม",$line); +$line = str_replace("ใน กฎ","ในกฎ",$line); +$line = str_replace("ใน กฎต่าง ๆ","ในกฎต่าง ๆ",$line); +$line = str_replace("ใน กรอบ","ในกรอบ",$line); +$line = str_replace("ใน กระถาง","ในกระถาง",$line); +$line = str_replace("ใน กระบวนการ","ในกระบวนการ",$line); +$line = str_replace("ใน กรุงเทพฯ","ในกรุงเทพฯ",$line); +$line = str_replace("ใน กล่องเสียง","ในกล่องเสียง",$line); +$line = str_replace("ใน กลุ่ม","ในกลุ่ม",$line); +$line = str_replace("ใน ขณะ","ในขณะ",$line); +$line = str_replace("ใน ขณะเดียวกัน","ในขณะเดียวกัน",$line); +$line = str_replace("ใน ข้อ","ในข้อ",$line); +$line = str_replace("ใน ขอบเขต","ในขอบเขต",$line); +$line = str_replace("ใน ขั้นตอน","ในขั้นตอน",$line); +$line = str_replace("ใน เขต","ในเขต",$line); +$line = str_replace("ใน แขนง","ในแขนง",$line); +$line = str_replace("ใน ครอบครัว","ในครอบครัว",$line); +$line = str_replace("ใน คริสต์ศตวรรษ","ในคริสต์ศตวรรษ",$line); +$line = str_replace("ใน คลัง","ในคลัง",$line); +$line = str_replace("ใน ความ","ในความ",$line); +$line = str_replace("ใน ความหมาย","ในความหมาย",$line); +$line = str_replace("ใน คำ","ในคำ",$line); +$line = str_replace("ใน คำว่า","ในคำว่า",$line); +$line = str_replace("ใน คู่","ในคู่",$line); +$line = str_replace("ใน เครื่องหมาย","ในเครื่องหมาย",$line); +$line = str_replace("ใน โครงร่าง","ในโครงร่าง",$line); +$line = str_replace("ใน โครงสร้าง","",$line); +$line = str_replace("ใน งาน","ในงาน",$line); +$line = str_replace("ใน แง่","ในแง่",$line); +$line = str_replace("ใน จมูก","ในจมูก",$line); +$line = str_replace("ใน จังหวัด","ในจังหวัด",$line); +$line = str_replace("ใน จำนวนนี้","ในจำนวนนี้",$line); +$line = str_replace("ใน จุดแรก","ในจุดแรก",$line); +$line = str_replace("ใน ชนบท","ในชนบท",$line); +$line = str_replace("ใน ช่วง","ในช่วง",$line); +$line = str_replace("ใน ช่วงทศวรรษ","ในช่วงทศวรรษ",$line); +$line = str_replace("ใน ช่วงเวลา","ในช่วงเวลา",$line); +$line = str_replace("ใน ช่อง","ในช่อง",$line); +$line = str_replace("ใน ชั้นเรียน","ในชั้นเรียน",$line); +$line = str_replace("ใน ชีวิต","ในชีวิต",$line); +$line = str_replace("ใน ชีวิตประจำวัน","ในชีวิตประจำวัน",$line); +$line = str_replace("ใน ชื่อว่า","ในชื่อว่า",$line); +$line = str_replace("ใน ชุด","ในชุด",$line); +$line = str_replace("ใน ชุมชน","ในชุมชน",$line); +$line = str_replace("ใน เชิง","ในเชิง",$line); +$line = str_replace("ใน ฐานข้อมูล","ในฐานข้อมูล",$line); +$line = str_replace("ใน ฐานที่เข้าใจ","ในฐานที่เข้าใจ",$line); +$line = str_replace("ใน ฐานะ","ในฐานะ",$line); +$line = str_replace("ใน ด้าน","ในด้าน",$line); +$line = str_replace("ใน ตระกูล","ในตระกูล",$line); +$line = str_replace("ใน ตอนใต้","ในตอนใต้",$line); +$line = str_replace("ใน ตอนสุดท้าย","ในตอนสุดท้าย",$line); +$line = str_replace("ใน ตัวเอง","ในตัวเอง",$line); +$line = str_replace("ใน ตาราง","ในตาราง",$line); +$line = str_replace("ใน ตำรา","ในตำรา",$line); +$line = str_replace("ใน ตำแหน่ง","ในตำแหน่ง",$line); +$line = str_replace("ใน แต่ละ","ในแต่ละ",$line); +$line = str_replace("ใน แถบ","ในแถบ",$line); +$line = str_replace("ใน แถว","ในแถว",$line); +$line = str_replace("ใน ทฤษฎี","ในทฤษฎี",$line); +$line = str_replace("ใน ทวีป","ในทวีป",$line); +$line = str_replace("ใน ทศวรรษ","ในทศวรรษ",$line); +$line = str_replace("ใน ทันที","ในทันที",$line); +$line = str_replace("ใน ทันทีทันใด","ในทันทีทันใด",$line); +$line = str_replace("ใน ที่นี้","ในที่นี้",$line); +$line = str_replace("ใน ที่ประชุม","ในที่ประชุม",$line); +$line = str_replace("ใน ที่ว่าง","ในที่ว่าง",$line); +$line = str_replace("ใน ที่สาธารณะ","ในที่สาธารณะ",$line); +$line = str_replace("ใน ที่สุด","ในที่สุด",$line); +$line = str_replace("ใน ที่อื่น","ในที่อื่น",$line); +$line = str_replace("ใน ทุกกรณี","ใน ทุกกรณี",$line); +$line = str_replace("ใน ทุกตำแหน่ง","ในทุกตำแหน่ง",$line); +$line = str_replace("ใน ทุกภาษา","ในทุกภาษา",$line); +$line = str_replace("ใน ทุกระดับ","ในทุกระดับ",$line); +$line = str_replace("ใน นวนิยาย","ในนวนิยาย",$line); +$line = str_replace("ใน นาม","ในนาม",$line); +$line = str_replace("ใน แนว","ในแนว",$line); +$line = str_replace("ใน บท","ในบท",$line); +$line = str_replace("ใน บรรดา","ในบรรดา",$line); +$line = str_replace("ใน บริเวณ","ในบริเวณ",$line); +$line = str_replace("ใน บ้าน","ในบ้าน",$line); +$line = str_replace("ใน ผนัง","ในผนัง",$line); +$line = str_replace("ใน ผู้พูด","ในผู้พูด",$line); +$line = str_replace("ใน แผน","ในแผน",$line); +$line = str_replace("ใน พยางค์","ในพยางค์",$line); +$line = str_replace("ใน พื้นที่","ในพื้นที่",$line); +$line = str_replace("ใน โพรง","ในโพรง",$line); +$line = str_replace("ใน ภาคต่าง ๆ","ในภาคต่าง ๆ",$line); +$line = str_replace("ใน ภาพ","ในภาพ",$line); +$line = str_replace("ใน ภายหลัง","ในภายหลัง",$line); +$line = str_replace("ใน มิต","ในมิต",$line); +$line = str_replace("ใน มุขยประโยค","ในมุขยประโยค",$line); +$line = str_replace("ใน ยุโรป","ในยุโรป",$line); +$line = str_replace("ใน ร้อยกรอง","ในร้อยกรอง",$line); +$line = str_replace("ใน ระบบ","ในระบบ",$line); +$line = str_replace("ใน ระยะ","ในระยะ",$line); +$line = str_replace("ใน ระหว่าง","ในระหว่าง",$line); +$line = str_replace("ใน รัง","ในรัง",$line); +$line = str_replace("ใน รัฐแคลิฟอร์เนีย","ในรัฐแคลิฟอร์เนีย",$line); +$line = str_replace("ใน รั้วหลังบ้าน","ในรั้วหลังบ้าน",$line); +$line = str_replace("ใน รายละเอียด","ในรายละเอียด",$line); +$line = str_replace("ใน รายวิชา","ในรายวิชา",$line); +$line = str_replace("ใน รูป","ในรูป",$line); +$line = str_replace("ใน เรขาคณิต","ในเรขาคณิต",$line); +$line = str_replace("ใน เรียงความ","ในเรียงความ",$line); +$line = str_replace("ใน ลักษณะ","ในลักษณะ",$line); +$line = str_replace("ใน ลำดับ","ในลำดับ",$line); +$line = str_replace("ใน โลก","ในโลก",$line); +$line = str_replace("ใน วง","ในวง",$line); +$line = str_replace("ใน วงกลม","ในวงกลม",$line); +$line = str_replace("ใน วรรณคดี","ในวรรณคดี",$line); +$line = str_replace("ใน วลี","ในวลี",$line); +$line = str_replace("ใน วัจน","ในวัจน",$line); +$line = str_replace("ใน วัฒนธรรม","ในวัฒนธรรม",$line); +$line = str_replace("ใน วิชา","ในวิชา",$line); +$line = str_replace("ใน เวลา","ในเวลา",$line); +$line = str_replace("ใน แวดวง","ในแวดวง",$line); +$line = str_replace("ใน ศรีลังกา","ในศรีลังกา",$line); +$line = str_replace("ใน ศาล","ในศาล",$line); +$line = str_replace("ใน สถานการณ์","ในสถานการณ์",$line); +$line = str_replace("ใน สนาม","ในสนาม",$line); +$line = str_replace("ใน สเปกตรัม","ในสเปกตรัม",$line); +$line = str_replace("ใน สภาพ","ในสภาพ",$line); +$line = str_replace("ใน สมอง","ในสมอง",$line); +$line = str_replace("ใน สมัย","ในสมัย",$line); +$line = str_replace("ใน ส่วน","ในส่วน",$line); +$line = str_replace("ใน สหรัฐอเมริกา","ในสหรัฐอเมริกา",$line); +$line = str_replace("ใน สังคม","ในสังคม",$line); +$line = str_replace("ใน สัทวิทยา","ในสัทวิทยา",$line); +$line = str_replace("ใน สาขา","ในสาขา",$line); +$line = str_replace("ใน สายตา","ในสายตา",$line); +$line = str_replace("ใน สิ่ง","ในสิ่ง",$line); +$line = str_replace("ใน สิ้นเดือน","ในสิ้นเดือน",$line); +$line = str_replace("ใน หน่วย","ในหน่วย",$line); +$line = str_replace("ใน หน่วยคำ","ในหน่วยคำ",$line); +$line = str_replace("ใน หนังสือ","ในหนังสือ",$line); +$line = str_replace("ใน หมวด","ในหมวด",$line); +$line = str_replace("ใน หมู่","ในหมู่",$line); +$line = str_replace("ใน หมู่เกาะ","ในหมู่เกาะ",$line); +$line = str_replace("ใน หลอดลม","ในหลอดลม",$line); +$line = str_replace("ใน หลักการ","ในหลักการ",$line); +$line = str_replace("ใน หลักภาษา","ในหลักภาษา",$line); +$line = str_replace("ใน หลายตำแหน่ง","ในหลายตำแหน่ง",$line); +$line = str_replace("ใน หลายภาษา","ในหลายภาษา",$line); +$line = str_replace("ใน ห้อง","ในห้อง",$line); +$line = str_replace("ใน หัวข้อ","ในหัวข้อ",$line); +$line = str_replace("ใน องค์ประกอบ","ในองค์ประกอบ",$line); +$line = str_replace("ใน อดีต","ในอดีต",$line); +$line = str_replace("ใน อนาคต","ในอนาคต",$line); +$line = str_replace("ใน อัตรา","ในอัตรา",$line); +$line = str_replace("ใน อากาศ","ในอากาศ",$line); +$line = str_replace("ใน อินเดีย","ในอินเดีย",$line); +$line = str_replace("ใน อีกถิ่น","ในอีกถิ่น",$line); +$line = str_replace("ใน อีกภาษา","ในอีกภาษา",$line); +$line = str_replace("ใน อีกระดับ","ในอีกระดับ",$line); +$line = str_replace("ใน อุดมคติ","ในอุดมคติ",$line); +$line = str_replace("ในกำร","ในการ",$line); +$line = str_replace("ในค.ศ.","ใน ค.ศ.",$line); +$line = str_replace("ในธรรมชาติ","ในธรรมชาติ",$line); +$line = str_replace("ในน้า","ในน้ำ",$line); +$line = str_replace("ในปัจจุบันคำว่า","ในปัจจุบัน คำว่า",$line); +$line = str_replace("ในมิดิที่","ในมิติที่",$line); +$line = str_replace("ในเวลา ต่อมา","ในเวลาต่อมา",$line); +$line = str_replace("ในหม บ้าน","ในหมู่บ้าน",$line); +$line = str_replace("ไนการ","ในการ",$line); +$line = str_replace("ไนหลาย ๆ","ในหลาย ๆ",$line); +$line = str_replace("นํ􀃊า","น้ำ",$line); +$line = str_replace("บงั ","บัง",$line); +$line = str_replace("บญั ","บัญ",$line); +$line = str_replace("บดั ","บัด",$line); +$line = str_replace("บตั ","บัต",$line); +$line = str_replace("บทบำท","บทบาท",$line); +$line = str_replace("บนเล้น","บนเส้น",$line); +$line = str_replace("บนั ","บัน",$line); +$line = str_replace("บนั􀃉","บั่น",$line); +$line = str_replace("บรรจุน้า","บรรจุน้ำ",$line); +$line = str_replace("บรรจุน้้า","บรรจุน้ำ",$line); +$line = str_replace("บรรจุน้าเชื้อ","บรรจุน้ำเชื้อ",$line); +$line = str_replace("บรรดาคักดี้","บรรดาศักดิ์",$line); +$line = str_replace("บรรดาดักดึ้","บรรดาศักดิ์",$line); +$line = str_replace("บรรดาศักด็","บรรดาศักดิ์",$line); +$line = str_replace("บรรดาศักดึ้","บรรดาศักดิ์",$line); +$line = str_replace("บรรเทำ","บรรเทา",$line); +$line = str_replace("บรรเทำความ","บรรเทาความ",$line); +$line = str_replace("บริกำร","บริการ",$line); +$line = str_replace("บริโภค น้้า","บริโภค น้ำ",$line); +$line = str_replace("บริเวณน้า","บริเวณน้ำ",$line); +$line = str_replace("บริสุทธิ้","บริสุทธิ์",$line); +$line = str_replace("บริสุทธี้","บริสุทธิ์",$line); +$line = str_replace("บริหาร ประเทศ","บริหารประเทศ",$line); +$line = str_replace("บริหารงำน","บริหารงาน",$line); +$line = str_replace("บริหารจัดการนำ","บริหารจัดการน้ำ",$line); +$line = str_replace("บริหำร","บริหาร",$line); +$line = str_replace("บลนอก","บล็อก",$line); +$line = str_replace("บลั ","บัล",$line); +$line = str_replace("บ่อน้า","บ่อน้ำ",$line); +$line = str_replace("บ่อนำ","บ่อน้ำ",$line); +$line = str_replace("บอลซ่าน","บอลข่าน",$line); +$line = str_replace("บังคับน้้า","บังคับน้ำ",$line); +$line = str_replace("บัญชา การตำรวจ","บัญชาการตำรวจ",$line); +$line = str_replace("บัญญ้ติ","บัญญัติ",$line); +$line = str_replace("บัญญัตื","บัญญัติ",$line); +$line = str_replace("บัดน้า","บัดน้ำ",$line); +$line = str_replace("บันทึกความจา","บันทึกความจำ",$line); +$line = str_replace("บัวล้าภู","บัวลำภู",$line); +$line = str_replace("บางครั้งในการสนทนา","บางครั้ง ในการสนทนา",$line); +$line = str_replace("บางนำงบวช","บางนางบวช",$line); +$line = str_replace("บางใล","บางใส",$line); +$line = str_replace("บ้านค่าบง","บ้านคำบง",$line); +$line = str_replace("บ้านซ้ำตาเรือง","บ้านซำตาเรือง",$line); +$line = str_replace("บ้านถ้า","บ้านถ้ำ",$line); +$line = str_replace("บ้านทำใหญ่ ","บ้านท่าใหญ่ ",$line); +$line = str_replace("บ้านน้าอ่าง","บ้านน้ำอ่าง",$line); +$line = str_replace("บ้านร่องสำน","บ้านร่องส้าน",$line); +$line = str_replace("บ้านลาใน","บ้านลำใน",$line); +$line = str_replace("บาบัด","บำบัด",$line); +$line = str_replace("บ้าบัด","บำบัด",$line); +$line = str_replace("บารุง","บำรุง",$line); +$line = str_replace("บ่ารุง","บำรุง",$line); +$line = str_replace("บ้ารุง","บำรุง",$line); +$line = str_replace("บาเหน็จ","บำเหน็จ",$line); +$line = str_replace("บำง","บาง",$line); +$line = str_replace("บำงกลุ่ม","บางกลุ่ม",$line); +$line = str_replace("บำงราย","บางราย",$line); +$line = str_replace("บำงรำย","บางราย",$line); +$line = str_replace("บำงส่วน","บางส่วน",$line); +$line = str_replace("บำงแห่ง","บางแห่ง",$line); +$line = str_replace("บำดำล","บาดาล",$line); +$line = str_replace("บ้ำน","บ้าน",$line); +$line = str_replace("บ้ำนพัก","บ้านพัก",$line); +$line = str_replace("บำบัดนาเสีย","บำบัดน้ำเสีย",$line); +$line = str_replace("บ้ำรุง","บำรุง",$line); +$line = str_replace("บิดเบี ยว","บิดเบี้ยว",$line); +$line = str_replace("บึงน่าจืด","บึงน้ำจืด",$line); +$line = str_replace("บึ􀃊ม","บึ้ม",$line); +$line = str_replace("บุคลำกร","บุคลากร",$line); +$line = str_replace("บุหลาบข้อน","กุหลาบซ้อน",$line); +$line = str_replace("บูรณากำร","บูรณาการ",$line); +$line = str_replace("บูรณำ","บูรณา",$line); +$line = str_replace("บูลย์นาต้น","บูลย์นำต้น",$line); +$line = str_replace("เบเนดิกด์","เบเนดิกต์",$line); +$line = str_replace("เบอ้ ","เบ้อ",$line); +$line = str_replace("เบีนผล","เป็นผล",$line); +$line = str_replace("เบียร์โวมาร์ตอฟชี","เปียร์โวมาร์ตอฟซี",$line); +$line = str_replace("เบี้ยวขอบเรียบ","เบี้ยว ขอบเรียบ",$line); +$line = str_replace("เบี�ย","เบี้ย",$line); +$line = str_replace("เบื องต้น","เบื้องต้น",$line); +$line = str_replace("เบือ􀃉 ","เบื่อ",$line); +$line = str_replace("เบือ􀃊 ","เบื้อ",$line); +$line = str_replace("เบื􀃊อง","เบื้อง",$line); +$line = str_replace("แบร้นชไตน์","แบร์นชไตน์",$line); +$line = str_replace("โบนืฟาโช","โบนีฟาโช",$line); +$line = str_replace("ใบ ประดับ","ใบประดับ",$line); +$line = str_replace("ใบเคี่ยว","ใบเดี่ยว",$line); +$line = str_replace("ใบช้างละ","ใบข้างละ",$line); +$line = str_replace("ใบเดี่ยวเรียง เวียน","ใบเดี่ยว เรียงเวียน",$line); +$line = str_replace("ใบเดี่ยวเรียงตรงข้าม","ใบเดี่ยว เรียงตรงข้าม",$line); +$line = str_replace("ใบเดี่ยวเรียงเวียน","ใบเดี่ยว เรียงเวียน",$line); +$line = str_replace("ใบเตียว","ใบเดียว",$line); +$line = str_replace("ใบเตี่ยว","ใบเดี่ยว",$line); +$line = str_replace("ใบป‘ริร;ตับ","ใบประดับ",$line); +$line = str_replace("ใบปร&ตับ","ใบประดับ",$line); +$line = str_replace("ใบปรร)กอบ","ใบประกอบ",$line); +$line = str_replace("ใบปรรเกอบ","ใบประกอบ",$line); +$line = str_replace("ใบประกฮบ","ใบประกอบ",$line); +$line = str_replace("ใบประคับ","ใบประดับ",$line); +$line = str_replace("ใบประตับ","ใบประดับ",$line); +$line = str_replace("ใบย่อยสันมาก","ใบย่อยสั้นมาก",$line); +$line = str_replace("ใบส้นมาก","ใบสั้นมาก",$line); +$line = str_replace("ไบแชนไทน์","ไบแซนไทน์",$line); +$line = str_replace("ป ี ","ปี",$line); +$line = str_replace("ปกคบุม","ปกคลุม",$line); +$line = str_replace("ปกตหิ ","ปกติห",$line); +$line = str_replace("ปกปัอง","ปกป้อง",$line); +$line = str_replace("ปจั ","ปัจ",$line); +$line = str_replace("ปฏิบตั ","ปฏิบัต",$line); +$line = str_replace("ปฏิบัตงิ าน","ปฏิบัติงาน",$line); +$line = str_replace("ปฏิบัติ การ","ปฏิบัติการ",$line); +$line = str_replace("ปฏิบัติกำร","ปฏิบัติการ",$line); +$line = str_replace("ปฏิบัติงำน","ปฏิบัติงาน",$line); +$line = str_replace("ปฏิบัติตำม","ปฏิบัติตาม",$line); +$line = str_replace("ปฏิป้ติ","ปฏิบัติ",$line); +$line = str_replace("ปฏิปีติ","ปฏิบัติ",$line); +$line = str_replace("ปฏิรูป การเมือง","ปฏิรูปการเมือง",$line); +$line = str_replace("ปฏิว้ดิ","ปฏิวัติ",$line); +$line = str_replace("ปฏิว้ติ","ปฏิวัติ",$line); +$line = str_replace("ปฏิวัติ โค่นอำนาจ","ปฏิวัติโค่นอำนาจ",$line); +$line = str_replace("ปฏีบ้ติ","ปฏิบัติ",$line); +$line = str_replace("ปร&กอบ","ประกอบ",$line); +$line = str_replace("ปร^กอบ","ประกอบ",$line); +$line = str_replace("ปรร;กอบ","ประกอบ",$line); +$line = str_replace("ปรร!กอบ","ประกอบ",$line); +$line = str_replace("ปรร!ตับ","ประดับ",$line); +$line = str_replace("ปรร1กอบ","ประกอบ",$line); +$line = str_replace("ปรรfกอบ","ประกอบ",$line); +$line = str_replace("ประกอบกำร","ประกอบการ",$line); +$line = str_replace("ประกอบต้วยข่อ","ประกอบด้วยช่อ",$line); +$line = str_replace("ประการหนง","ประการหนึ่ง",$line); +$line = str_replace("ประกาศ รัฐธรรมนูญ","ประกาศรัฐธรรมนูญ",$line); +$line = str_replace("ประขุมสภา","ประชุมสภา",$line); +$line = str_replace("ประจา","ประจำ",$line); +$line = str_replace("ประจ่า","ประจำ",$line); +$line = str_replace("ประจ้า","ประจำ",$line); +$line = str_replace("ประจาเดือน","ประจำเดือน",$line); +$line = str_replace("ประจาตัว","ประจำตัว",$line); +$line = str_replace("ประจาปี","ประจำปี",$line); +$line = str_replace("ประจำวนั","ประจำวัน",$line); +$line = str_replace("ประชาขน","ประชาชน",$line); +$line = str_replace("ประชำชน","ประชาชน",$line); +$line = str_replace("ประชำชำชน","ประชาชาชน",$line); +$line = str_replace("ประชำสัมพันธ์","ประชาสัมพันธ์",$line); +$line = str_replace("ประดิษฐ์ชิ้น","ประดิษฐ์ขึ้น",$line); +$line = str_replace("ประเดนน","ประเด็น",$line); +$line = str_replace("ประตูน้้า","ประตูน้ำ",$line); +$line = str_replace("ประเทศ ไทย","ประเทศไทย",$line); +$line = str_replace("ประเทศ เอกราช","ประเทศเอกราช",$line); +$line = str_replace("ประธำน","ประธาน",$line); +$line = str_replace("ประนิประนอม","ประนีประนอม",$line); +$line = str_replace("ประนืประนอม","ประนีประนอม",$line); +$line = str_replace("ประปำ","ประปา",$line); +$line = str_replace("ประมำณ","ประมาณ",$line); +$line = str_replace("ประโยชน ","ประโยชน์ ",$line); +$line = str_replace("ประโยชน","ประโยชน์",$line); +$line = str_replace("ประโยชน์์","ประโยชน์",$line); +$line = str_replace("ประโยชนส์ ำหรับ","ประโยชน์สำหรับ",$line); +$line = str_replace("ประลับ","ประดับ",$line); +$line = str_replace("ประสบ ความสำเร็จ","ประสบความสำเร็จ",$line); +$line = str_replace("ประสานชี ","ประสานชี้",$line); +$line = str_replace("ประสำน","ประสาน",$line); +$line = str_replace("ประสิทธิภำพ","ประสิทธิภาพ",$line); +$line = str_replace("ประหารจีวิต","ประหารชีวิต",$line); +$line = str_replace("ปรับแกคื้อ","ปรับแก้คือ",$line); +$line = str_replace("ปราสาท ของ","ปราสาทของ",$line); +$line = str_replace("ปรำกฏ","ปรากฏ",$line); +$line = str_replace("ปรำกฏว่ำ","ปรากฏว่า",$line); +$line = str_replace("ปริญญำ","ปริญญา",$line); +$line = str_replace("ปริมาณของน้า","ปริมาณของน้ำ",$line); +$line = str_replace("ปริมาณน้า","ปริมาณน้ำ",$line); +$line = str_replace("ปริมาณน้้า","ปริมาณน้ำ",$line); +$line = str_replace("ปริมาณนาจาก","ปริมาณน้ำจาก",$line); +$line = str_replace("ปริมาณนาดิบ","ปริมาณน้ำดิบ",$line); +$line = str_replace("ปริมาณน้้าดิบ","ปริมาณน้ำดิบ",$line); +$line = str_replace("ปริมาณนามี","ปริมาณน้ำมี",$line); +$line = str_replace("ปริมาณน้าหนัก","ปริมาณน้ำหนัก",$line); +$line = str_replace("ปริมาณนำไม่","ปริมาณน้ำไม่",$line); +$line = str_replace("ปริมาณนำหรือ","ปริมาณน้ำหรือ",$line); +$line = str_replace("ปริมำณ","ปริมาณ",$line); +$line = str_replace("ปริมำณน้ำ","ปริมาณน้ำ",$line); +$line = str_replace("ปรึกษำ","ปรึกษา",$line); +$line = str_replace("ปลด ปล่อย","ปลดปล่อย",$line); +$line = str_replace("ปลอกลันหุ้ม","ปลอกสั้นหุ้ม",$line); +$line = str_replace("ปล่อยเช่ำ","ปล่อยเช่า",$line); +$line = str_replace("ปลักไม้ลำย","ปลักไม้ลาย",$line); +$line = str_replace("ปลายกิง","ปลายกิ่ง",$line); +$line = str_replace("ปลายกึ่ง","ปลายกิ่ง",$line); +$line = str_replace("ปลายซีวิด","ปลายชีวิต",$line); +$line = str_replace("ปลายต้าน","ปลายด้าน",$line); +$line = str_replace("ปลายน้า","ปลายน้ำ",$line); +$line = str_replace("ปลายยอต","ปลายยอด",$line); +$line = str_replace("ปลายล้านใบ","ปลายก้านใบ",$line); +$line = str_replace("ปลายลิ่ ","ปลายคู่",$line); +$line = str_replace("ปลายเว้าตื่น","ปลายเว้าตื้น",$line); +$line = str_replace("ปลูกสร้ำง","ปลูกสร้าง",$line); +$line = str_replace("ป้องกน","ป้องกัน",$line); +$line = str_replace("ปัจจุบนั","ปัจจุบัน",$line); +$line = str_replace("ปัญหาน้า","ปัญหาน้ำ",$line); +$line = str_replace("ปัญหำ","ปัญหา",$line); +$line = str_replace("ปันสีทธิ","บันสิทธิ",$line); +$line = str_replace("ปัน􀃉","ปั่น",$line); +$line = str_replace("ปั๊มน้า","ปั๊มน้ำ",$line); +$line = str_replace("ปัม􀃋","ปั๊ม",$line); +$line = str_replace("ป่าดิบขึ้น","ป่าดิบชื้น",$line); +$line = str_replace("ป่าดิบชื่น","ป่าดิบชื้น",$line); +$line = str_replace("ป่าดิบซ้น","ป่าดิบซื้น",$line); +$line = str_replace("ป่าดิบซื้น","ป่าดิบชื้น",$line); +$line = str_replace("ป่าเบญจพรรณขึ้น","ป่าเบญจพรรณชื้น",$line); +$line = str_replace("ป้ำย","ป้าย",$line); +$line = str_replace("ปิดน้าประจำปี","ปิดน้ำประจำปี",$line); +$line = str_replace("ปิดมอนต์","ปีดมอนต์",$line); +$line = str_replace("ปิิบัติ","ปฏิบัติ",$line); +$line = str_replace("ปิิบัติงาน","ปฏิบัติงาน",$line); +$line = str_replace("ปิ􀃊ง","ปิ้ง",$line); +$line = str_replace("ปีกสัน","ปีกสั้น",$line); +$line = str_replace("ปียซาติ","ปิยชาติ",$line); +$line = str_replace("ปึเดียว","ปีเดียว",$line); +$line = str_replace("ปืเดียว","ปีเดียว",$line); +$line = str_replace("ปุยพืช","ปุ๋ยพืช",$line); +$line = str_replace("ปุวย","ป่วย",$line); +$line = str_replace("ปุา","ป่า",$line); +$line = str_replace("ปุาไม้","ป่าไม้",$line); +$line = str_replace("ปุาสงวน","ป่าสงวน",$line); +$line = str_replace("ปูองกัน","ป้องกัน",$line); +$line = str_replace("ปูองปราม","ป้องปราม",$line); +$line = str_replace("ปูาย","ป้าย",$line); +$line = str_replace("ปูายติดประกาศ","ป้ายติดประกาศ",$line); +$line = str_replace("เป็'นเม้พุ่ม","เป็นไม้พุ่ม",$line); +$line = str_replace("เปเตอฟิ","เปเตอฟี",$line); +$line = str_replace("เปเตอฟื","เปเตอฟี",$line); +$line = str_replace("เป็น นักปฏิวัติ","เป็นนักปฏิวัติ",$line); +$line = str_replace("เป็น๑","เป็น ๑",$line); +$line = str_replace("เป็น๒","เป็น ๒",$line); +$line = str_replace("เป็น๓","เป็น ๓",$line); +$line = str_replace("เป็น๔","เป็น ๔",$line); +$line = str_replace("เป็นเช่น ไร","เป็นเช่นไร",$line); +$line = str_replace("เป็นตน้","เป็นต้น",$line); +$line = str_replace("เป็นนาเค็ม","เป็นน้ำเค็ม",$line); +$line = str_replace("เป็นน้าใต","เป็นน้ำใต",$line); +$line = str_replace("เป็นน้ายาง","เป็นน้ำยาง",$line); +$line = str_replace("เป็นปีกแผ่น","เป็นปึกแผ่น",$line); +$line = str_replace("เป็นปุมปม","เป็นปุ่มปม",$line); +$line = str_replace("เป็นไปตำม","เป็นไปตาม",$line); +$line = str_replace("เป็นฝ็ก","เป็นฝัก",$line); +$line = str_replace("เป็นฝืกแบน","เป็นฝักแบน",$line); +$line = str_replace("เป็นฝืกรูป","เป็นฝักรูป",$line); +$line = str_replace("เป็นมีกคอต","เป็นฝักคอด",$line); +$line = str_replace("เป็นมีกเรียว","เป็นฝักเรียว",$line); +$line = str_replace("เป็น์โม้ต้น","เป็นไม้ต้น",$line); +$line = str_replace("เป็น่ใม้","เป็นไม้",$line); +$line = str_replace("เปนลายลักษณอักษร","เป็นลายลักษณ์อักษร",$line); +$line = str_replace("เป็นเลียว","เป็นเสี้ยว",$line); +$line = str_replace("เป็นเลี้ยว","เป็นเสี้ยว",$line); +$line = str_replace("เป็นสกฝ่าย","เป็นฝักฝ่าย",$line); +$line = str_replace("เป็นส่วน ที่","เป็นส่วนที่",$line); +$line = str_replace("เป็นสันใต้ง","เป็นสันโค้ง",$line); +$line = str_replace("เป็นเสัน","เป็นเส้น",$line); +$line = str_replace("เป็นเสั้น","เป็นเส้น",$line); +$line = str_replace("เปรี􀃊ยว","เปรี้ยว",$line); +$line = str_replace("เปลฮานอพ่","เปลฮานอฟ",$line); +$line = str_replace("เปลีย􀃉 ","เปลี่ย",$line); +$line = str_replace("เปลีอก สี","เปลือกสี",$line); +$line = str_replace("เปลีอก","เปลือก",$line); +$line = str_replace("เปลี􀃉ยน","เปลี่ยน",$line); +$line = str_replace("เปลือก บาง","เปลือกบาง",$line); +$line = str_replace("เปลือกกิเหาคลำ","เปลือกสีเทาคล้ำ",$line); +$line = str_replace("เปลือกต้นึ่าตาล","เปลือกสีน้ำตาล",$line); +$line = str_replace("เป้ำหมำย","เป้าหมาย",$line); +$line = str_replace("เปิดน้า","เปิดน้ำ",$line); +$line = str_replace("เปีน","เป็น",$line); +$line = str_replace("เปีนไม้พุ่ม","เป็นไม้พุ่ม",$line); +$line = str_replace("เปีนสีแดง","เป็นสีแดง",$line); +$line = str_replace("เปีนเหง้า","เป็นเหง้า",$line); +$line = str_replace("เปีนเหลี่ยม","เป็นเหลี่ยม",$line); +$line = str_replace("เปี􀃉","เปี่",$line); +$line = str_replace("เปูาหมาย","เป้าหมาย",$line); +$line = str_replace("แปลงน้า ","แปลงน้ำ ",$line); +$line = str_replace("โปงพอง","โป่งพอง",$line); +$line = str_replace("โปดอลสฅ์","โปดอลสค์",$line); +$line = str_replace("โปร่งแตง","โปร่งแสง",$line); +$line = str_replace("โปร่งแลง","โปร่งแสง",$line); +$line = str_replace("ไป บัญชาการ","ไปบัญชาการ",$line); +$line = str_replace("ผทูี้่","ผู้ที่",$line); +$line = str_replace("ผนังข้นใน","ผนังชั้นใน",$line); +$line = str_replace("ผนังขั้นใน","ผนังชั้นใน",$line); +$line = str_replace("ผนังช้นใน","ผนังชั้นใน",$line); +$line = str_replace("ผนังชันใน","ผนังชั้นใน",$line); +$line = str_replace("ผนังชื่นใน","ผนังชั้นใน",$line); +$line = str_replace("ผนังซันใน","ผนังชั้นใน",$line); +$line = str_replace("ผนังตั้นใน","ผนังชั้นใน",$line); +$line = str_replace("ผนังสันในแข้ง","ผนังชั้นในแข็ง",$line); +$line = str_replace("ผลกาไร","ผลกำไร",$line); +$line = str_replace("ผลผนังข็น่ในแข็ง","ผลผนังชั้นในแข็ง",$line); +$line = str_replace("ผลมืเบี้อ","ผลมีเนื้อ",$line); +$line = str_replace("ผลักดันน้า","ผลักดันน้ำ",$line); +$line = str_replace("ผลัตใบ","ผลัดใบ",$line); +$line = str_replace("ผลัต่ใบ","ผลัดใบ",$line); +$line = str_replace("ผลิตน้า","ผลิตน้ำ",$line); +$line = str_replace("ผลิตน้้า","ผลิตน้ำ",$line); +$line = str_replace("ผลิตน้าแข็ง","ผลิตน้ำแข็ง",$line); +$line = str_replace("ผลิตน้าเฉลี่ย","ผลิตน้ำเฉลี่ย",$line); +$line = str_replace("ผลิตน้าเชื้อ","ผลิตน้ำเชื้อ",$line); +$line = str_replace("ผลิตนำน้อย","ผลิตน้ำน้อย",$line); +$line = str_replace("ผลิตภัณฑ","ผลิตภัณฑ์",$line); +$line = str_replace("ผลิตภัณฑ์์","ผลิตภัณฑ์",$line); +$line = str_replace("ผลีใบใหม่","ผลิใบใหม่",$line); +$line = str_replace("ผสัตใบ","ผลัดใบ",$line); +$line = str_replace("ผสัต่ใบ","ผลัดใบ",$line); +$line = str_replace("ผันน้า","ผันน้ำ",$line); +$line = str_replace("ผ่ำน","ผ่าน",$line); +$line = str_replace("ผ่ำนมำ ","ผ่านมา ",$line); +$line = str_replace("ผ่ำนระบบ","ผ่านระบบ",$line); +$line = str_replace("ผู ้","ผู้",$line); +$line = str_replace("ผู้ มี อิทธิ","ผู้มีอิทธิ",$line); +$line = str_replace("ผู,้","ผู้,",$line); +$line = str_replace("ผูก้ ","ผู้ก",$line); +$line = str_replace("ผูก่้ อตั้ง","ผู้ก่อตั้ง",$line); +$line = str_replace("ผู้เข้แรงงาน","ผู้ใช้แรงงาน",$line); +$line = str_replace("ผู้เข้ำ","ผู้เข้า",$line); +$line = str_replace("ผู้ใข้","ผู้ใช้",$line); +$line = str_replace("ผูค้ ","ผู้ค",$line); +$line = str_replace("ผูคนที่้ ","ผู้คนที่",$line); +$line = str_replace("ผูครองเมื้ อง","ผู้ครองเมือง",$line); +$line = str_replace("ผูครอบครอง","ผู้ครอบครอง",$line); +$line = str_replace("ผู้ค้่าประกัน","ผู้ค้ำประกัน",$line); +$line = str_replace("ผูช้ ","ผู้ช",$line); +$line = str_replace("ผู้ช้านาญ","ผู้ชำนาญ",$line); +$line = str_replace("ผู้เช้าประชุม","ผู้เข้าประชุม",$line); +$line = str_replace("ผู้เช้าร่วม","ผู้เข้าร่วม",$line); +$line = str_replace("ผู้ใช้นำจำนวน","ผู้ใช้น้ำจำนวน",$line); +$line = str_replace("ผู้ใช้นำตำม","ผู้ใช้น้ำตาม",$line); +$line = str_replace("ผู้ใช้นำที่","ผู้ใช้น้ำที่",$line); +$line = str_replace("ผู้ใช้นำที่เข้าร่วม","ผู้ใช้น้ำที่เข้าร่วม",$line); +$line = str_replace("ผู้ใช้น้ำนา","ผู้ใช้น้ำนำ",$line); +$line = str_replace("ผู้ใช้นำบาง","ผู้ใช้น้ำบาง",$line); +$line = str_replace("ผู้ใช้นำเพื่อ","ผู้ใช้น้ำเพื่อ",$line); +$line = str_replace("ผู้ใช้นำไม่","ผู้ใช้น้ำไม่",$line); +$line = str_replace("ผู้ใซั แรงงาน","ผู้ใช้แรงงาน",$line); +$line = str_replace("ผู้ดีงดูด","ผู้ดึงดูด",$line); +$line = str_replace("ผูโดยสารและโรงเก็้ บ","ผู้โดยสารและโรงเก็บ",$line); +$line = str_replace("ผูต้","ผู้ต",$line); +$line = str_replace("ผูถ้ ","ผู้ถ",$line); +$line = str_replace("ผูท้ ","ผู้ท",$line); +$line = str_replace("ผูทั้ก","ผู้ทัก",$line); +$line = str_replace("ผู้ทาสวน","ผู้ทำสวน",$line); +$line = str_replace("ผูที่้","ผู้ที่",$line); +$line = str_replace("ผูที้","ผู้ที",$line); +$line = str_replace("ผูที้เ􀃉 ","ผู้ที่เ",$line); +$line = str_replace("ผู้ทึ่ไม่เจริญ","ผู็ที่ไม่เจริญ",$line); +$line = str_replace("ผูน้ ","ผู้น",$line); +$line = str_replace("ผูนั้ บ","ผู้นับ",$line); +$line = str_replace("ผูนั้","ผู้นั",$line); +$line = str_replace("ผู้นา","ผู้นำ",$line); +$line = str_replace("ผู้น้า","ผู้นำ",$line); +$line = str_replace("ผู้นาท้องถิ่น","ผู้นำท้องถิ่น",$line); +$line = str_replace("ผู้นำนาฃี","ผู้นำนาซี",$line); +$line = str_replace("ผูนี้","ผู้นี",$line); +$line = str_replace("ผูบ้ ","ผู้บ",$line); +$line = str_replace("ผูบั้นทึก","ผู้บันทึก",$line); +$line = str_replace("ผูป้ ","ผู้ป",$line); +$line = str_replace("ผูปกป้้ อง","ผู้ปกป้อง",$line); +$line = str_replace("ผู้ปุวย","ผู้ป่วย",$line); +$line = str_replace("ผูพิ้พากษา","ผู้พิพากษา",$line); +$line = str_replace("ผูพู้","ผู้พู",$line); +$line = str_replace("ผูฟ้ ","ผู้ฟ",$line); +$line = str_replace("ผู้ฟ้ง","ผู้ฟัง",$line); +$line = str_replace("ผูฟั้","ผู้ฟั",$line); +$line = str_replace("ผูม้ ","ผู้ม",$line); +$line = str_replace("ผูมั่้ ง","ผู้มั่ง",$line); +$line = str_replace("ผูมาร่้ วม","ผู้มาร่วม",$line); +$line = str_replace("ผูมี้ ","ผู้มี",$line); +$line = str_replace("ผูมี้","ผู้มี",$line); +$line = str_replace("ผูยั้ง","ผู้ยัง",$line); +$line = str_replace("ผูยื้ม","ผู้ยืม",$line); +$line = str_replace("ผูร้ ","ผู้ร",$line); +$line = str_replace("ผูร่้วม","ผู้ร่วม",$line); +$line = str_replace("ผูรั้","ผู้รั",$line); +$line = str_replace("ผูรั้บ","ผู้รับ",$line); +$line = str_replace("ผูรู้","ผู้รู",$line); +$line = str_replace("ผูเริ่้ ม","ผู้เริ่ม",$line); +$line = str_replace("ผู้เริ่ม ความคิด","ผู้เริ่มความคิด",$line); +$line = str_replace("ผูล้ ","ผู้ล",$line); +$line = str_replace("ผู้ว่ำ","ผู้ว่า",$line); +$line = str_replace("ผู้ว่ำรำชกำร","ผู้ว่าราชการ",$line); +$line = str_replace("ผูวิ้","ผู้วิ",$line); +$line = str_replace("ผูศึ้กษา","ผู้ศึกษา",$line); +$line = str_replace("ผูส้ ","ผู้ส",$line); +$line = str_replace("ผูสร้้ าง","ผู้สร้าง",$line); +$line = str_replace("ผูสั้มภาษณ์","ผู้สัมภาษณ์",$line); +$line = str_replace("ผูสื้","ผู้สื",$line); +$line = str_replace("ผูสู้ ง","ผู้สูง",$line); +$line = str_replace("ผูสู้งอาย","ผู้สูงอาย",$line); +$line = str_replace("ผูห้ ","ผู้ห",$line); +$line = str_replace("ผูอ้ ","ผู้อ",$line); +$line = str_replace("ผู้อ้ ","ผู้อ",$line); +$line = str_replace("ผูออกแบบคื้ อ","ผู้ออกแบบคือ",$line); +$line = str_replace("ผู้อ่านวย","ผู้อำนวย",$line); +$line = str_replace("ผูอื้","ผู้อื",$line); +$line = str_replace("ผูอื้น􀃉","ผู้อื่น",$line); +$line = str_replace("ผูเ้","ผู้เ",$line); +$line = str_replace("ผูแ้ ","ผู้แ",$line); +$line = str_replace("ผูโ้","ผู้โ",$line); +$line = str_replace("เผฃิญ","เผชิญ",$line); +$line = str_replace("แผ่นคอรัก","แผ่นคอร์ก",$line); +$line = str_replace("แผนงำน","แผนงาน",$line); +$line = str_replace("แผนต่อต้าน การจู่โจม","แผนต่อต้านการจู่โจม",$line); +$line = str_replace("แผนที่ทำงทะเล","แผนที่ทางทะเล",$line); +$line = str_replace("ฝ่น","ฝุ่น",$line); +$line = str_replace("ฝนตกน้้า","ฝนตกน้ำ",$line); +$line = str_replace("ฝรงั􀃉 ","ฝรั่ง",$line); +$line = str_replace("ฝรั่งเศส เข้ายึด","ฝรั่งเศสเข้ายึด",$line); +$line = str_replace("ฝรัง􀃉 ","ฝรั่ง",$line); +$line = str_replace("ฝรัน􀃉 ","ฝรั่น",$line); +$line = str_replace("ฝรั􀃉","ฝรั่",$line); +$line = str_replace("ฝั่งซ้ำย-","ฝั่งซ้าย-",$line); +$line = str_replace("ฝังทะเล","ฝั่งทะเล",$line); +$line = str_replace("ฝังแม่่ น้ำ","ฝั่งแม่น้ำ",$line); +$line = str_replace("ฝัง􀃉 ","ฝั่ง",$line); +$line = str_replace("ฝ่ำยเลขำ","ฝ่ายเลขา",$line); +$line = str_replace("ฝึกงำน","ฝึกงาน",$line); +$line = str_replace("ฝืกยาว","ฝักยาว",$line); +$line = str_replace("ฝุาฝืน","ฝ่าฝืน",$line); +$line = str_replace("ฝุาย","ฝ่าย",$line); +$line = str_replace("ฝุายปกครอง","ฝ่ายปกครอง",$line); +$line = str_replace("เฝูา","เฝ้า",$line); +$line = str_replace("พกั ","พัก",$line); +$line = str_replace("พจมานพจนีย์","พจมาน พจนีย์",$line); +$line = str_replace("พน้ ","พ้น",$line); +$line = str_replace("พนั ","พัน",$line); +$line = str_replace("พ้นื ","พื้น",$line); +$line = str_replace("พบในปา","พบในป่า",$line); +$line = str_replace("พบว่ำ","พบว่า",$line); +$line = str_replace("พมิ พ์","พิมพ์",$line); +$line = str_replace("พยายามทาทุก","พยายามทำทุก",$line); +$line = str_replace("พรรค คอมมิวนิสต์","พรรคคอมมิวนิสต์",$line); +$line = str_replace("พรรค แนวร่วม","พรรคแนวร่วม",$line); +$line = str_replace("พรรคคอมมิวบิสต้","พรรคคอมมิวนิสต์",$line); +$line = str_replace("พรรคนาฃี","พรรคนาซี",$line); +$line = str_replace("พรอ้ ","พร้อ",$line); +$line = str_replace("พระราชโอรสองศ์","พระราชโอรสองค์",$line); +$line = str_replace("พระองศ์","พระองค์",$line); +$line = str_replace("พรัง􀃉","พรั่ง",$line); +$line = str_replace("พลงั􀃊 ","พลั้ง",$line); +$line = str_replace("พลังงำน","พลังงาน",$line); +$line = str_replace("พลังน้้า ","พลังน้ำ ",$line); +$line = str_replace("พลังน้า","พลังน้ำ",$line); +$line = str_replace("พวกเชิร์บ","พวกเซิร์บ",$line); +$line = str_replace("พวกเซ็ก","พวกเช็ก",$line); +$line = str_replace("พวกเดิร์ก","พวกเติร์ก",$line); +$line = str_replace("พวกปาล้ม","พวกปาล์ม",$line); +$line = str_replace("พอ้ ","พ้อ",$line); +$line = str_replace("พ่อกซ์","ฟอกซ์",$line); +$line = str_replace("พักน้า","พักน้ำ",$line); +$line = str_replace("พักฟิน","พักฟื้น",$line); +$line = str_replace("พัฒนางำน","พัฒนางาน",$line); +$line = str_replace("พัฒนาทำง","พัฒนาทาง",$line); +$line = str_replace("พัฒนำ","พัฒนา",$line); +$line = str_replace("พันธุ!,น","พันธุ์ใน",$line); +$line = str_replace("พันธุ!.น","พันธุ์ใน",$line); +$line = str_replace("พันธุ!ด้","พันธุ์ได้",$line); +$line = str_replace("พันธุ!นประเทศ ","พันธุ์ในประเทศ",$line); +$line = str_replace("พันธุ!นประเทศไทย","พันธุ์ในประเทศไทย",$line); +$line = str_replace("พันธุ่","พันธุ์",$line); +$line = str_replace("พันธุ๊","พันธุ์",$line); +$line = str_replace("พันธ์ุ","พันธุ์",$line); +$line = str_replace("พันธุ(นประเทศ","พันธุ์ในประเทศ",$line); +$line = str_replace("พันธุ[น","พันธุ์ใน",$line); +$line = str_replace("พันธุIนประเทศ","พันธุ์ในประเทศ",$line); +$line = str_replace("พันธุLน","พันธุ์ใน",$line); +$line = str_replace("พันธุทาง","พันธุ์ทาง",$line); +$line = str_replace("พันธุใน","พันธุ์ใน",$line); +$line = str_replace("พันธุไน","พันธุ์ใน",$line); +$line = str_replace("พันสุ,นประเทศ","พันธุ์ในประเทศ",$line); +$line = str_replace("พัสดุนั น","พัสดุนั้น",$line); +$line = str_replace("พาตเลื้อย","พาดเลื้อย",$line); +$line = str_replace("พาเทิน","พาเพิน",$line); +$line = str_replace("พาเฟิน","พาเพิน",$line); +$line = str_replace("พาร์เนลล้","พาร์เนลล์",$line); +$line = str_replace("พาร์เนลส์","พาร์เนลล์",$line); +$line = str_replace("พาร์เนลสํ","พาร์เนลล์",$line); +$line = str_replace("พาหะนาโรค","พาหะนำโรค",$line); +$line = str_replace("พิ ธี","พิธี",$line); +$line = str_replace("พิจารณา คดี","พิจารณาคดี",$line); +$line = str_replace("พิจารณานา","พิจารณานำ",$line); +$line = str_replace("พิจำรณำ","พิจารณา",$line); +$line = str_replace("พิตฅ์","พิตต์",$line); +$line = str_replace("พิตด์","พิตต์",$line); +$line = str_replace("พิตตํ","พิตต์",$line); +$line = str_replace("พี 􀃉","พี่",$line); +$line = str_replace("พี,􀃉","พี่,",$line); +$line = str_replace("พี’􀃉","พี่’",$line); +$line = str_replace("พี~􀃉 ","พี่~",$line); +$line = str_replace("พีข􀃉 ","พี่ข",$line); +$line = str_replace("พีช􀃉 ","พี่ช",$line); +$line = str_replace("พีนฟู","ฟื้นฟู",$line); +$line = str_replace("พีน􀃉 ","พี่น",$line); +$line = str_replace("พีระมีต","พีระมิด",$line); +$line = str_replace("พีส􀃉 ","พี่ส",$line); +$line = str_replace("พีห􀃉 ","พี่ห",$line); +$line = str_replace("พีแ􀃉 ","พี่แ",$line); +$line = str_replace("พี􀃉","พี่",$line); +$line = str_replace("พึง􀃉 ","พึ่ง",$line); +$line = str_replace("พึ่นสีเขียว","พื้นสีเขียว",$line); +$line = str_replace("พึ􀃉ง","พึ่ง",$line); +$line = str_replace("พื น","พื้น",$line); +$line = str_replace("พืๆรทนนํ้า","พืชทนนํ้า",$line); +$line = str_replace("พืชทนนี่า","พืชทนน้ำ",$line); +$line = str_replace("พื่นตัว","ฟื้นตัว",$line); +$line = str_replace("พื้นที่สุ่มนํ้า","พื้นที่ลุ่มนํ้า",$line); +$line = str_replace("พื่นฟู","ฟื้นฟู",$line); +$line = str_replace("พื่นสีเขียว","พื้นสีเขียว",$line); +$line = str_replace("พื่น้อง","พี่น้อง",$line); +$line = str_replace("พื้เนพ่ระบอบ","ฟื้นฟูระบอบ",$line); +$line = str_replace("พืน􀃊 ","พื้น",$line); +$line = str_replace("พือ􀃉 ","พื่อ",$line); +$line = str_replace("พื􀃊น","พื้น",$line); +$line = str_replace("พู้เขียน","ผู้เขียน",$line); +$line = str_replace("พูดโตต้อบ","พูดโต้ตอบ",$line); +$line = str_replace("พูดใน สถานการณ์","พูดในสถานการณ์",$line); +$line = str_replace("พู่มีขาว","พู่สีขาว",$line); +$line = str_replace("เพนใซัชีวิต","เพนใช้ชีวิต",$line); +$line = str_replace("เพยงวีัน","เพียงวัน",$line); +$line = str_replace("เพราะถึอว่า","เพราะถือว่า",$line); +$line = str_replace("เพราะน้าไม่","เพราะน้ำไม่",$line); +$line = str_replace("เพลง้ ","เพล้ง",$line); +$line = str_replace("เพศ เมีย","เพศเมีย",$line); +$line = str_replace("เพศเมียสัน","เพศเมียสั้น",$line); +$line = str_replace("เพ้อฝืน","เพ้อฝัน",$line); +$line = str_replace("เพอให้","เพื่อให้",$line); +$line = str_replace("เพาเคอร็","เพาเคอร์",$line); +$line = str_replace("เพาเคอรั","เพาเคอร์",$line); +$line = str_replace("เพาเคอรี","เพาเคอร์",$line); +$line = str_replace("เพาะชา","เพาะชำ",$line); +$line = str_replace("เพำะ","เพาะ",$line); +$line = str_replace("เพิง􀃉 ","เพิ่ง",$line); +$line = str_replace("เพิ่มเดิม","เพิ่มเติม",$line); +$line = str_replace("เพิม􀃉 ","เพิ่ม",$line); +$line = str_replace("เพิ􀃉ม","เพิ่ม",$line); +$line = str_replace("เพื่อชี แจง","เพื่อชี้แจง",$line); +$line = str_replace("เพื่อทา","เพื่อทำ",$line); +$line = str_replace("เพื่อท้า","เพื่อทำ",$line); +$line = str_replace("เพื่อนา","เพื่อนำ",$line); +$line = str_replace("เพื่อน่า","เพื่อนำ",$line); +$line = str_replace("เพื่อน้า","เพื่อนำ",$line); +$line = str_replace("เพื่อน้าข้อมูล","เพื่อนำข้อมูล",$line); +$line = str_replace("เพื่อน้าผล","เพื่อนำผล",$line); +$line = str_replace("เพื่อน้ารวบ","เพื่อนำรวบ",$line); +$line = str_replace("เพื่อน้าส่ง","เพื่อนำส่ง",$line); +$line = str_replace("เพื่อน้าเสนอ","เพื่อนำเสนอ",$line); +$line = str_replace("เพื่อน้ำมำประกอบ","เพื่อนำมาประกอบ",$line); +$line = str_replace("เพื่อเฝ็าระวัง","เพื่อเฝ้าระวัง",$line); +$line = str_replace("เพือ􀃉 ","เพื่อ",$line); +$line = str_replace("เพือ􀃉","เพื่อ",$line); +$line = str_replace("เพืื่่อ","เพื่อ",$line); +$line = str_replace("เพื􀃉อ","เพื่อ",$line); +$line = str_replace("แพง้ ","แพ้ง",$line); +$line = str_replace("แพงกัเฮิสต์","แพงก์เฮิสต์",$line); +$line = str_replace("แพงถ์เฮิสต‘","แพงก์เฮิสต์",$line); +$line = str_replace("แพห้ ","แพ้ห",$line); +$line = str_replace("ฟ้ า","ฟ้า",$line); +$line = str_replace("ฟกฝน","ฝึกฝน",$line); +$line = str_replace("ฟรานซิสกาตัมบา","ฟรานซิส กาตัมบา",$line); +$line = str_replace("ฟองน้า","ฟองน้ำ",$line); +$line = str_replace("ฟอนชเลเกิล","ฟอน ชเลเกิล",$line); +$line = str_replace("ฟังรูกั้น","ฟังรู้กัน",$line); +$line = str_replace("ฟาสฃิสต์","ฟาสซิสต์",$line); +$line = str_replace("ฟินพ่ระบอบ","ฟื้นฟูระบอบ",$line); +$line = str_replace("ฟินฟู","ฟื้นฟู",$line); +$line = str_replace("ฟิลาเดลเพีเย","ฟิลาเดลเฟีย",$line); +$line = str_replace("ฟิสิป เคานต์","ฟิลิป เคานต์",$line); +$line = str_replace("ฟิสิปปีนสั","ฟิลิปปินส์",$line); +$line = str_replace("ฟืนฟู","ฟื้นฟู",$line); +$line = str_replace("ฟืนฟู้","ฟื้นฟู",$line); +$line = str_replace("ฟื􀃊","ฟื้",$line); +$line = str_replace("ฟุมเฟิยิย","ฟุ่มเฟือย",$line); +$line = str_replace("ฟูสีขาว","พู่สีขาว",$line); +$line = str_replace("ฟูอง","ฟ้อง",$line); +$line = str_replace("เฟอร์ดินานเดอ โซซูร์","เฟอร์ดินาน เดอ โซซูร์",$line); +$line = str_replace("เฟื􀃉","เฟื่",$line); +$line = str_replace("เฟื􀃊 ","เฟื้",$line); +$line = str_replace("เฟื􀃊อ","เฟื้อ",$line); +$line = str_replace("ไฟฟ้ำ","ไฟฟ้า",$line); +$line = str_replace("ไฟฟูา","ไฟฟ้า",$line); +$line = str_replace("ภตั ","ภัต",$line); +$line = str_replace("ภราไตย","ภราไดย",$line); +$line = str_replace("ภราไลย","ภราไดย",$line); +$line = str_replace("ภาค ","ภาค",$line); +$line = str_replace("ภาคใต้ส่งอ่าวไทย","ภาคใต้ฝั่งอ่าวไทย",$line); +$line = str_replace("ภาษา ละดิน","ภาษาละติน",$line); +$line = str_replace("ภาษาธีบรู","ภาษาฮีบรู",$line); +$line = str_replace("ภาษามาลายาลมั","ภาษามาลายาลัม",$line); +$line = str_replace("ภาษาละดิน","ภาษาละติน",$line); +$line = str_replace("ภาษาละตินภาษาบาลี","ภาษาละติน ภาษาบาลี",$line); +$line = str_replace("ภำค","ภาค",$line); +$line = str_replace("ภำคกลำง","ภาคกลาง",$line); +$line = str_replace("ภำคการ","ภาคการ",$line); +$line = str_replace("ภำคครัว","ภาคครัว",$line); +$line = str_replace("ภำคบริกำร","ภาคบริการ",$line); +$line = str_replace("ภำครัฐ","ภาครัฐ",$line); +$line = str_replace("ภำคอุต","ภาคอุต",$line); +$line = str_replace("ภำพถ่ำย","ภาพถ่าย",$line); +$line = str_replace("ภำพรวม","ภาพรวม",$line); +$line = str_replace("ภำพลักษณ์","ภาพลักษณ์",$line); +$line = str_replace("ภำยใต้","ภายใต้",$line); +$line = str_replace("ภำยใน","ภายใน",$line); +$line = str_replace("ภำยหลัง","ภายหลัง",$line); +$line = str_replace("ภำรกิจ","ภารกิจ",$line); +$line = str_replace("ภำระ","ภาระ",$line); +$line = str_replace("ภำษำ","ภาษา",$line); +$line = str_replace("ภำษี","ภาษี",$line); +$line = str_replace("ภูมิลาเนา","ภูมิลำเนา",$line); +$line = str_replace("ม!บย่อย","มีใบย่อย",$line); +$line = str_replace("มกั ","มัก",$line); +$line = str_replace("มงทุฎ","มงกุฎ",$line); +$line = str_replace("มญั ","มัญ",$line); +$line = str_replace("มดั ","มัด",$line); +$line = str_replace("มตั ","มัต",$line); +$line = str_replace("มนั ","มัน",$line); +$line = str_replace("มนั􀃉 ","มั่น",$line); +$line = str_replace("มว้ น","ม้วน",$line); +$line = str_replace("ม่วงคลำ","ม่วงคล้ำ",$line); +$line = str_replace("ม่วงแตง","ม่วงแดง",$line); +$line = str_replace("ม้สชา","มัสซา",$line); +$line = str_replace("มหา อำนาจ","มหาอำนาจ",$line); +$line = str_replace("มอบงำน","มอบงาน",$line); +$line = str_replace("มอร์ริสฮัลลี","มอร์ริส ฮัลลี",$line); +$line = str_replace("มอลเดเวิย","มอลเดเวีย",$line); +$line = str_replace("มะม่วงน้าดอกไม้","มะม่วงน้ำดอกไม้",$line); +$line = str_replace("มักฅตงอ","มักคดงอ",$line); +$line = str_replace("มักซีมีเสียง","มักซีมีเลียง",$line); +$line = str_replace("มักมิสีแดง","มักมีสีแดง",$line); +$line = str_replace("มั่นว่ำ","มั่นว่า",$line); +$line = str_replace("มันสาปะหลัง","มันสำปะหลัง",$line); +$line = str_replace("มากชื้น","มากขึ้น",$line); +$line = str_replace("มาตรวัดนา","มาตรวัดน้ำ",$line); +$line = str_replace("มาตรวัดน้า","มาตรวัดน้ำ",$line); +$line = str_replace("ม้าน่งั ","ม้านั่ง",$line); +$line = str_replace("มาร์ตินโจส","มาร์ติน โจส",$line); +$line = str_replace("มาเสเชีย","มาเลเซีย",$line); +$line = str_replace("มำก","มาก",$line); +$line = str_replace("มำกกว่ำ","มากกว่า",$line); +$line = str_replace("มำกยิ่ง","มากยิ่ง",$line); +$line = str_replace("มำกระบบ","มากระบบ",$line); +$line = str_replace("มำช่วย","มาช่วย",$line); +$line = str_replace("มำใช้","มาใช้",$line); +$line = str_replace("มำตรฐำน","มาตรฐาน",$line); +$line = str_replace("มำต่อ","มาต่อ",$line); +$line = str_replace("มำติด","มาติด",$line); +$line = str_replace("มำนำน","มานาน",$line); +$line = str_replace("มำประกอบ","มาประกอบ",$line); +$line = str_replace("มำปรับ","มาปรับ",$line); +$line = str_replace("มำแล้ว","มาแล้ว",$line); +$line = str_replace("มิดีใหม่","มิติใหม่",$line); +$line = str_replace("มิธุนายน","มิถุนายน",$line); +$line = str_replace("มิลุนายน","มิถุนายน",$line); +$line = str_replace("มิสุนายน","มิถุนายน",$line); +$line = str_replace("มี ชีวิต","มีชีวิต",$line); +$line = str_replace("มี บทบาท","มีบทบาท",$line); +$line = str_replace("มี หนี้สิน","มีหนี้สิน",$line); +$line = str_replace("มีกลีนคาว","มีกลิ่นคาว",$line); +$line = str_replace("มีก้านส์น","มีก้านสั้น",$line); +$line = str_replace("มีกำร","มีการ",$line); +$line = str_replace("มีขนลี้น","มีขนสั้น",$line); +$line = str_replace("มีขนำด","มีขนาด",$line); +$line = str_replace("มีข่อง อากาศ","มีช่องอากาศ",$line); +$line = str_replace("มีเขด","มีเขต",$line); +$line = str_replace("มีฃ้ออยู่","มีข้ออยู่",$line); +$line = str_replace("มีควำม","มีความ",$line); +$line = str_replace("มีคี่ง","มีติ่ง",$line); +$line = str_replace("มีงำนทำ","มีงานทำ",$line); +$line = str_replace("มีดี่งหนาม","มีติ่งหนาม",$line); +$line = str_replace("มีดุ่มใบ","มีตุ่มใบ",$line); +$line = str_replace("มีตอกเรียง ลลับ","มีดอกเรียงสลับ",$line); +$line = str_replace("มีน้า","มีน้ำ",$line); +$line = str_replace("มีน้้า","มีน้ำ",$line); +$line = str_replace("มีนี่าเลี้ยง","มีน้ำเลี้ยง",$line); +$line = str_replace("มีเนึ่อ","มีเนื้อ",$line); +$line = str_replace("มีไบย่อย","มีใบย่อย",$line); +$line = str_replace("มีผลท้า","มีผลทำ",$line); +$line = str_replace("มีมีอจับ","มีมือจับ",$line); +$line = str_replace("มีลันตามยาว","มีสันตามยาว",$line); +$line = str_replace("มีเลียงโห่","มีเสียงโห่",$line); +$line = str_replace("มีเสียงช้างมาก","มีเสียงข้างมาก",$line); +$line = str_replace("มีเหลือง","สีเหลือง",$line); +$line = str_replace("มึใบ","มีใบ",$line); +$line = str_replace("มืขน","มีขน",$line); +$line = str_replace("มืขนประปราย","มีขนประปราย",$line); +$line = str_replace("มืขนสั้น","มีขนสั้น",$line); +$line = str_replace("มืเขต","มีเขต",$line); +$line = str_replace("มื่เขต","มีเขต",$line); +$line = str_replace("มืช่อย่อย","มีช่อย่อย",$line); +$line = str_replace("มืดวามผันแปร","มีความผันแปร",$line); +$line = str_replace("มืดี่งโค้ง","มีติ่งโค้ง",$line); +$line = str_replace("มืต่อม","มีต่อม",$line); +$line = str_replace("มืติ่ง","มีติ่ง",$line); +$line = str_replace("มืตุ่ม","มีตุ่ม",$line); +$line = str_replace("มืถิ่นกำเนิด","มีถิ่นกำเนิด",$line); +$line = str_replace("มืถี่น","มีถิ่น",$line); +$line = str_replace("มืถุงเล็ก","มีถุงเล็ก",$line); +$line = str_replace("มืเนิ้อ","มีเนื้อ",$line); +$line = str_replace("มืเนี่อใน","มีเนื้อใน",$line); +$line = str_replace("มืเนื้อ","มีเนื้อ",$line); +$line = str_replace("มืใบ","มีใบ",$line); +$line = str_replace("มืมือ","มีมือ",$line); +$line = str_replace("มืลักษณะ","มีลักษณะ",$line); +$line = str_replace("มืสีเหลือง","มีสีเหลือง",$line); +$line = str_replace("มืเส้น","มีเส้น",$line); +$line = str_replace("มืหนาม","มีหนาม",$line); +$line = str_replace("มืออวุล","มีออวุล",$line); +$line = str_replace("มือ􀃊 ","มื้อ",$line); +$line = str_replace("มูลค่ำ","มูลค่า",$line); +$line = str_replace("เม็กซีโก","เม็กซิโก",$line); +$line = str_replace("เมค็ต","เมล็ด",$line); +$line = str_replace("เมด็ด","เมล็ด",$line); +$line = str_replace("เมด็ต","เมล็ด",$line); +$line = str_replace("เมดิเตอร์ เรเนียน","เมดิเตอร์เรเนียน",$line); +$line = str_replace("เมล ","เมล",$line); +$line = str_replace("เมล็ค","เมล็ด",$line); +$line = str_replace("เมล็คเด็ก","เมล็ดเล็ก",$line); +$line = str_replace("เมล็ดเด็ก","เมล็ดเล็ก",$line); +$line = str_replace("เมล็ดเตียว","เมล็ดเดียว",$line); +$line = str_replace("เมล็ดรู!ไข่","เมล็ดรูปไข่",$line); +$line = str_replace("เมล็ดเล์ก","เมล็ดเล็ก",$line); +$line = str_replace("เมล็ดสี'ตำ","เมล็ดสีดำ",$line); +$line = str_replace("เมล็ต","เมล็ด",$line); +$line = str_replace("เมล้ต","เมล็ด",$line); +$line = str_replace("เมล์ต","เมล็ต",$line); +$line = str_replace("เมล็ตรูป ไข่กลับ","เมล็ดรูปไข่กลับ",$line); +$line = str_replace("เมล์ตรูป","เมล็ดรูป",$line); +$line = str_replace("เมลํตรูปใต้ง","เมล็ดรูปโค้ง",$line); +$line = str_replace("เมล้ตเล็ก","เมล็ดเล็ก",$line); +$line = str_replace("เมล็ลเล็ก","เมล็ดเล็ก",$line); +$line = str_replace("เมลัต","เมล็ด",$line); +$line = str_replace("เมลัตเลัก","เมล็ดเล็ก",$line); +$line = str_replace("เมลิต","เมล็ด",$line); +$line = str_replace("เมลีต","เมล็ด",$line); +$line = str_replace("เมลึต","เมล็ด",$line); +$line = str_replace("เมลืต","เมล็ด",$line); +$line = str_replace("เมื่อค.ศ.","เมื่อ ค.ศ.",$line); +$line = str_replace("เมืองที่เกิดชื้น","เมืองที่เกิดขึ้น",$line); +$line = str_replace("เมืองโพ่รสดอร์พ่","เมืองโฟรสดอร์ฟ",$line); +$line = str_replace("เมื่อนาคำ","เมื่อนำคำ",$line); +$line = str_replace("เมือ􀃉 ","เมื่อ",$line); +$line = str_replace("เมือ􀃉","เมื่อ",$line); +$line = str_replace("เมื􀃉อ","เมื่อ",$line); +$line = str_replace("เมื�อ","เมื่อ",$line); +$line = str_replace("แม,้","แม้ ,",$line); +$line = str_replace("แมกู้","แม้กู",$line); +$line = str_replace("แม่คามี","แม่คำมี",$line); +$line = str_replace("แมจ้ ","แม้จ",$line); +$line = str_replace("แมน้ ","แม้น",$line); +$line = str_replace("แม่นยา","แม่นยำ",$line); +$line = str_replace("แม่นย้า","แม่นยำ",$line); +$line = str_replace("แม่น้า","แม่น้ำ",$line); +$line = str_replace("แม่น้้า","แม่น้ำ",$line); +$line = str_replace("แม่น้ำ ไนส์","แม่น้ำไนส์",$line); +$line = str_replace("แมพ้ ","แม้พ",$line); +$line = str_replace("แมภ้ ","แม้ภ",$line); +$line = str_replace("แมม้ ","แม้ม",$line); +$line = str_replace("แมว้ ","แม้ว",$line); +$line = str_replace("แม้ว่ำ","แม้ว่า",$line); +$line = str_replace("มโ้ ","ม้โ",$line); +$line = str_replace("ใม่เจริญ","ไม่เจริญ",$line); +$line = str_replace("ใม้ต้น","ไม้ต้น",$line); +$line = str_replace("มไ้ ","ม้ไ",$line); +$line = str_replace("ไม’้ ","ไม้'",$line); +$line = str_replace("ไม’้","ไม้’",$line); +$line = str_replace("ไม)้","ไม้)",$line); +$line = str_replace("ไมก้ ","ไม้ก",$line); +$line = str_replace("ไมข้ ","ไม้ข",$line); +$line = str_replace("ไมค้ ","ไม้ค",$line); +$line = str_replace("ไมจ้ ","ไม้จ",$line); +$line = str_replace("ไม้เจุ่มเตี้ย","ไม้พุ่มเตี้ย",$line); +$line = str_replace("ไม้ใจุ่1ม","ไม้พุ่ม",$line); +$line = str_replace("ไมช้ ","ไม้ช",$line); +$line = str_replace("ไมใช่","ไม่ใช่",$line); +$line = str_replace("ไมด้ ","ไม้ด",$line); +$line = str_replace("ไม้ด้นผลัดใบ","ไม้ต้น ผลัดใบ",$line); +$line = str_replace("ไมได้","ไม่ได้",$line); +$line = str_replace("ไม่ได้นา","ไม่ได้นำ",$line); +$line = str_replace("ไมต้่","ไม้ต่",$line); +$line = str_replace("ไม็ต้น","ไม้ต้น",$line); +$line = str_replace("ไม่ทา","ไม่ทำ",$line); +$line = str_replace("ไมที้","ไม้ที",$line); +$line = str_replace("ไม่นา","ไม่นำ",$line); +$line = str_replace("ไม้นาล้มลุก","ไม้น้ำล้มลุก",$line); +$line = str_replace("ไม่นำน","ไม่นาน",$line); +$line = str_replace("ไมนี้","ไม้นี",$line); +$line = str_replace("ไมนี้􀃊 ","ไม้นี้",$line); +$line = str_replace("ไมบ้ ","ไม้บ",$line); +$line = str_replace("ไม้ผู้ม","ไม้พุ่ม",$line); +$line = str_replace("ไมฝ้ ","ไม้ฝ",$line); +$line = str_replace("ไม้พ็ม","ไม้พุ่ม",$line); +$line = str_replace("ไมพุ่ม","ไม้พุ่ม",$line); +$line = str_replace("ไม้พุ่มรอเนื้อย","ไม้พุ่มรอเลื้อย",$line); +$line = str_replace("ไม้ฟุม","ไม้พุ่ม",$line); +$line = str_replace("ไม่มำก","ไม่มาก",$line); +$line = str_replace("ไม่มีกำร","ไม่มีการ",$line); +$line = str_replace("ไม่มื","ไม่มี",$line); +$line = str_replace("ไมล้มลุกป็เติย่ว","ไม้ล้มลุกปีเดียว",$line); +$line = str_replace("ไม้ลืมลุก","ไม้ล้มลุก",$line); +$line = str_replace("ไมสั้ก","ไม้สัก",$line); +$line = str_replace("ไม้สุ่มเตี้ย","ไม้พุ่มเตี้ย",$line); +$line = str_replace("ไมใสใจ","ไม่ใส่ใจ",$line); +$line = str_replace("ไมห้ ","ไม้ห",$line); +$line = str_replace("ไมอ้ ","ไม้อ",$line); +$line = str_replace("ไม่อาจฟันตัว","ไม่อาจฟื้นตัว",$line); +$line = str_replace("ไมีต้น","ไม้ต้น",$line); +$line = str_replace("ไมีต้นเปลือกสีตำ","ไม้ต้นเปลือกสีดำ",$line); +$line = str_replace("ไมเ้","ไม้เ",$line); +$line = str_replace("ไมแ้ ","ไม้แ",$line); +$line = str_replace("ย ัง","ยัง",$line); +$line = str_replace("ย ืน","ยืน",$line); +$line = str_replace("ยงั ","ยัง",$line); +$line = str_replace("ย่งั ยน","ยั่งยืน",$line); +$line = str_replace("ยจ์ ","ย์จ",$line); +$line = str_replace("ยญั ","ยัญ",$line); +$line = str_replace("ยดื ","ยืด",$line); +$line = str_replace("ยนั ","ยัน",$line); +$line = str_replace("ยน้าผล","ยนำผล",$line); +$line = str_replace("ยบุ ตวั ","ยุบตัว",$line); +$line = str_replace("ยอ้ ","ย้อ",$line); +$line = str_replace("ยอคเกสร","ยอดเกสร",$line); +$line = str_replace("ยอคอ่อน","ยอดอ่อน",$line); +$line = str_replace("ยอตเกลร","ยอดเกสร",$line); +$line = str_replace("ยอตหรือปลายกิ่ง","ยอดหรือปลายกิ่ง",$line); +$line = str_replace("ยอตอ่อน","ยอดอ่อน",$line); +$line = str_replace("ยังทาได้","ยังทำได้",$line); +$line = str_replace("ยังนาเครื่อง","ยังนำเครื่อง",$line); +$line = str_replace("ยั่งยืนื","ยั่งยืน",$line); +$line = str_replace("ยากลาบาก","ยากลำบาก",$line); +$line = str_replace("ยาแก้!ฃ้","ยาแก้ไข้",$line); +$line = str_replace("ย่านตูด","ย่านตุด",$line); +$line = str_replace("ยาวไต้ถึง","ยาวได้ถึง",$line); +$line = str_replace("ยำ􀃊 ","ย้ำ",$line); +$line = str_replace("ยิง􀃉 ","ยิ่ง",$line); +$line = str_replace("ยิง􀃉","ยิ่ง",$line); +$line = str_replace("ยิ􀃊ม","ยิ้ม",$line); +$line = str_replace("ยีนยัน","ยืนยัน",$line); +$line = str_replace("ยีส􀃉 ","ยี่ส",$line); +$line = str_replace("ยีห􀃉 ","ยี่ห",$line); +$line = str_replace("ยึด ทรัพย์สิน","ยึดทรัพย์สิน",$line); +$line = str_replace("ยื่นคาร้อง","ยื่นคำร้อง",$line); +$line = str_replace("ยืน􀃉 ","ยื่น",$line); +$line = str_replace("ยุทธศำสตร์","ยุทธศาสตร์",$line); +$line = str_replace("ยูนิตทาฟัน","ยูนิตทำฟัน",$line); +$line = str_replace("เยีย􀃉 ","เยี่ย",$line); +$line = str_replace("เยื่องกัน","เยื้องกัน",$line); +$line = str_replace("เยื่อที่มเมล็ด","เยื่อหุ้มเมล็ด",$line); +$line = str_replace("เยื่อทุ้มเมล็ด","เยื่อหุ้มเมล็ด",$line); +$line = str_replace("เยื่อลิ่มเมล็ต","เยื่อหุ้มเมล็ด",$line); +$line = str_replace("แยก แขนง","แยกแขนง",$line); +$line = str_replace("แยกกันทา","แยกกันทำ",$line); +$line = str_replace("แยง้ ","แย้ง",$line); +$line = str_replace("โยกย้ำย","โยกย้าย",$line); +$line = str_replace("โยชนก์ ับ","โยชน์กับ",$line); +$line = str_replace("รค.บุคบรรณ","",$line); +$line = str_replace("รดน้า","รดน้ำ",$line); +$line = str_replace("รถดานา","รถดำนา",$line); +$line = str_replace("รบั ","รับ",$line); +$line = str_replace("รร)เป็ยบ","ระเบียบ",$line); +$line = str_replace("รรเหว่าง","ระหว่าง",$line); +$line = str_replace("ร่วมกันท้า ","ร่วมกันทำ ",$line); +$line = str_replace("รวมทั่ง","รวมทั้ง",$line); +$line = str_replace("ร่วมทา ","ร่วมทำ ",$line); +$line = str_replace("รวมน้าเสีย","รวมน้ำเสีย",$line); +$line = str_replace("ร่วมมือ กับ","ร่วมมือกับ",$line); +$line = str_replace("รว่ำ","รว่า",$line); +$line = str_replace("ร้สเชีย","รัสเซีย",$line); +$line = str_replace("รแหว่าง","ระหว่าง",$line); +$line = str_replace("รอ้ ","ร้อ",$line); +$line = str_replace("รอ้ ง","ร้อง",$line); +$line = str_replace("รอง ผู้อำนวยการ","รองผู้อำนวยการ",$line); +$line = str_replace("ร่องน้้า","ร่องน้ำ",$line); +$line = str_replace("รอจ้าหน่าย","รอจำหน่าย",$line); +$line = str_replace("ร้อนซ์น","ร้อนชื้น",$line); +$line = str_replace("รอยน้าขัง","รอยน้ำขัง",$line); +$line = str_replace("รอยนารั่ว","รอยน้ำรั่ว",$line); +$line = str_replace("รอเลื่อย","รอเลื้อย",$line); +$line = str_replace("ระดบั","ระดับ",$line); +$line = str_replace("ระดับ นาทะเล","ระดับน้ำทะเล",$line); +$line = str_replace("ระดับ นี่าทะเล","ระดับน้ำทะเล",$line); +$line = str_replace("ระดับ'นาทะเล","ระดับน้ำทะเล",$line); +$line = str_replace("ระดับกลางนา ","ระดับกลางน้ำ ",$line); +$line = str_replace("ระดับกลางนา","ระดับกลางน้ำ",$line); +$line = str_replace("ระดับต้นนา กลางนา และปลายนา ","ระดับต้นน้ำ กลางน้ำ และปลายน้ำ ",$line); +$line = str_replace("ระดับต้นนา กลางนา และปลายนา","ระดับต้นน้ำ กลางน้ำ และปลายน้ำ",$line); +$line = str_replace("ระดับต่ำง ๆ","ระดับต่าง ๆ",$line); +$line = str_replace("ระดับท้องลิ่น","ระดับท้องถิ่น",$line); +$line = str_replace("ระดับน้า","ระดับน้ำ",$line); +$line = str_replace("ระดับนํ๋า","ระดับน้ำ",$line); +$line = str_replace("ระดับนาทะเล","",$line); +$line = str_replace("ระดับนิ้าทะเล","",$line); +$line = str_replace("ระดับปลายนา ","ระดับปลายน้ำ ",$line); +$line = str_replace("ระดับปลายนา","ระดับปลายน้ำ",$line); +$line = str_replace("ระนาบเตียว","ระนาบเดียว",$line); +$line = str_replace("ระบบงำน","ระบบงาน",$line); +$line = str_replace("ระบบน้า","ระบบน้ำ",$line); +$line = str_replace("ระบบน้้า","ระบบน้ำ",$line); +$line = str_replace("ระบบสูบนา","ระบบสูบน้ำ",$line); +$line = str_replace("ระบบไอน้า","ระบบไอน้ำ",$line); +$line = str_replace("ระบอบ ศักดินา","ระบอบศักดินา",$line); +$line = str_replace("ระบายนา","ระบายน้ำ",$line); +$line = str_replace("ระบายน้า","ระบายน้ำ",$line); +$line = str_replace("ระบายน้้า","ระบายน้ำ",$line); +$line = str_replace("ระบายนำ","ระบายน้ำ",$line); +$line = str_replace("ระบำยอำกำศ","ระบายอากาศ",$line); +$line = str_replace("ระบุใน รูป","ระบุในรูป",$line); +$line = str_replace("ระลับนํ้า","ระดับนํ้า",$line); +$line = str_replace("ระลับน้ำทะเล","ระดับน้ำทะเล",$line); +$line = str_replace("ระหว่าง ประเทศ","ระหว่างประเทศ",$line); +$line = str_replace("ระหว่างเซ็ก","ระหว่างเช็ก",$line); +$line = str_replace("ระหว่ำง","ระหว่าง",$line); +$line = str_replace("รั ว","รั้ว",$line); +$line = str_replace("รักษำ","รักษา",$line); +$line = str_replace("รัฐธรรมนูญ ฉบับใหม่","รัฐธรรมนูญฉบับใหม่",$line); +$line = str_replace("รัฐบาลวีชี","รัฐบาลวิชี",$line); +$line = str_replace("รับการ เลื่อนยศ","รับการเลื่อนยศ",$line); +$line = str_replace("รับค้า","รับคำ",$line); +$line = str_replace("รับทรำบ","รับทราบ",$line); +$line = str_replace("รับน้า","รับน้ำ",$line); +$line = str_replace("รับน้้า","รับน้ำ",$line); +$line = str_replace("รับน้าเชื้อ","รับน้ำเชื้อ",$line); +$line = str_replace("รับพิง","รับฟัง",$line); +$line = str_replace("รับฟ้ง","รับฟัง",$line); +$line = str_replace("รัว􀃉","รั่ว",$line); +$line = str_replace("รัว􀃊 ","รั้ว",$line); +$line = str_replace("รัษฎำก","รัษฎาก",$line); +$line = str_replace("รัสเขีย","รัสเซีย",$line); +$line = str_replace("รัสเฃีย","รัสเซีย",$line); +$line = str_replace("รัสเชลล์สแควร์","รัสเซลล์สแควร์",$line); +$line = str_replace("รัสเชีย","รัสเซีย",$line); +$line = str_replace("รากยึตเกา^","รากยึดเกาะ",$line); +$line = str_replace("ราคาญ","รำคาญ",$line); +$line = str_replace("ราคาต่้า","ราคาต่ำ",$line); +$line = str_replace("ราคาต่าสุด","ราคาต่ำสุด",$line); +$line = str_replace("ราคาล้าละ","ราคาลำละ",$line); +$line = str_replace("ราคำ","ราคา",$line); +$line = str_replace("ราชวงส์","ราชวงศ์",$line); +$line = str_replace("ราชอาณาชักร","ราชอาณาจักร",$line); +$line = str_replace("รายได้ เสริม","รายได้เสริม",$line); +$line = str_replace("รายนาโครง","รายนำโครง",$line); +$line = str_replace("รายนายาง","รายนำยาง",$line); +$line = str_replace("รายละอียด","รายละเอียด",$line); +$line = str_replace("รำคำสินค้า","ราคาสินค้า",$line); +$line = str_replace("รำชบั","ราชบั",$line); +$line = str_replace("รำย","ราย",$line); +$line = str_replace("รำยกลุ่ม","รายกลุ่ม",$line); +$line = str_replace("รำยงำน","รายงาน",$line); +$line = str_replace("รำยจ่ำย","รายจ่าย",$line); +$line = str_replace("รำยเดียว","รายเดียว",$line); +$line = str_replace("รำยได้","รายได้",$line); +$line = str_replace("รำยทำ","รายทำ",$line); +$line = str_replace("รำยละเอียด","รายละเอียด",$line); +$line = str_replace("รำยวิชา","รายวิชา",$line); +$line = str_replace("รำษฎร","ราษฎร",$line); +$line = str_replace("ริชารีด พิกอตต์","ริชาร์ด พิกอตต์",$line); +$line = str_replace("ริมน้า","ริมน้ำ",$line); +$line = str_replace("ริมน้้า","ริมน้ำ",$line); +$line = str_replace("ริมนี่า","ริมน้ำ",$line); +$line = str_replace("ริมนื้าลำธาร","ริมน้ำลำธาร",$line); +$line = str_replace("รืน􀃉 ","รื่น",$line); +$line = str_replace("รื􀃉น","รื่น",$line); +$line = str_replace("รื􀃊","รื้",$line); +$line = str_replace("รุกลา","รุกล้ำ",$line); +$line = str_replace("รุกล้้า","รุกล้ำ",$line); +$line = str_replace("รุกล้าพื้นที่","รุกล้ำพื้นที่",$line); +$line = str_replace("รุงเรื่ อง","รุ่งเรือง",$line); +$line = str_replace("รู ้","รู้",$line); +$line = str_replace("รู,้","รู้,",$line); +$line = str_replace("รู!/!ข่","รูปไข่",$line); +$line = str_replace("รู!/!บ","รูปใบ",$line); +$line = str_replace("รู!/?ช'","รูปไข่",$line); +$line = str_replace("รู!ไข่","รูปไข่",$line); +$line = str_replace("รู'ป!ข่","รูปไข่",$line); +$line = str_replace("รู'ปใช่","รูปไข่",$line); +$line = str_replace("รูก้ ","รู้ก",$line); +$line = str_replace("รูข้ ","รู้ข",$line); +$line = str_replace("รูค้ ","รู้ค",$line); +$line = str_replace("รูจ้ ","รู้จ",$line); +$line = str_replace("รูจั้ ก","รู้จัก",$line); +$line = str_replace("รูจั้","รู้จั",$line); +$line = str_replace("รูซึ้","รู้ซึ",$line); +$line = str_replace("รูด้ ","รู้ด",$line); +$line = str_replace("รูต้ ","รู้ต",$line); +$line = str_replace("รูตั้ว","รู้ตัว",$line); +$line = str_replace("รูท้ ","รู้ท",$line); +$line = str_replace("รูที้","รู้ที",$line); +$line = str_replace("รูป ใบหอก","รูปใบหอก",$line); +$line = str_replace("รูป!1ข่","รูปไข่",$line); +$line = str_replace("รูป!ข่ ","รูปไข่ ",$line); +$line = str_replace("รูป!ข่","รูปไข่",$line); +$line = str_replace("รูป!ข้","รูปไข่",$line); +$line = str_replace("รูป!ช่","รูปไข่",$line); +$line = str_replace("รูป!ต","รูปไต",$line); +$line = str_replace("รูป'เซ่","รูปไข่",$line); +$line = str_replace("รูปกรร!ลวย","รูปกระสวย",$line); +$line = str_replace("รูปกรร1ลวย","รูปกระสวย",$line); +$line = str_replace("รูปกรวยส้น","รูปกรวยสั้น",$line); +$line = str_replace("รูปก้วย","รูปถ้วย",$line); +$line = str_replace("รูปโข่","รูปไข่",$line); +$line = str_replace("รูปใข่","รูปไข่",$line); +$line = str_replace("รูปไข้","รูปไข่",$line); +$line = str_replace("รูปใฃ่","รูปไข่",$line); +$line = str_replace("รูปคี่เหลี่ยม ผืนผ้า","รูปสี่เหลี่ยมผืนผ้า",$line); +$line = str_replace("รูปโช่","รูปไข่",$line); +$line = str_replace("รูปใช่ ","รูปใข่",$line); +$line = str_replace("รูปใช่","รูปไข่",$line); +$line = str_replace("รูปตี่งหู","รูปติ่งหู",$line); +$line = str_replace("รูปใต","รูปไต",$line); +$line = str_replace("รูปทรงรื","รูปทรงรี",$line); +$line = str_replace("รูปไบตาบ","รูปใบดาบ",$line); +$line = str_replace("รูปไบหอก","รูปใบหอก",$line); +$line = str_replace("รูปฝ่ามีอ","รูปฝ่ามือ",$line); +$line = str_replace("รูปรื ","รูปรี ",$line); +$line = str_replace("รูปรื","รูปรี",$line); +$line = str_replace("รูปรืแกม","รูปรีแกม",$line); +$line = str_replace("รูปลามเหลี่ยม","รูปสามเหลี่ยม",$line); +$line = str_replace("รูปลี'เหลี่ยม","รูปสี่เหลี่ยม",$line); +$line = str_replace("รูปั1ข่","รูปไข่",$line); +$line = str_replace("รูปัไข่","รูปไข่",$line); +$line = str_replace("รูผ้ ","รู้ผ",$line); +$line = str_replace("รูพ้ ","รู้พ",$line); +$line = str_replace("รูพื้","รู้พื",$line); +$line = str_replace("รูภ้ ","รู้ภ",$line); +$line = str_replace("รูม้ ","รู้ม",$line); +$line = str_replace("รู้มำ","รู้มา",$line); +$line = str_replace("รูย้ ","รู้ย",$line); +$line = str_replace("รูร้ ","รู้ร",$line); +$line = str_replace("รูเรื่้ อง","รู้เรื่อง",$line); +$line = str_replace("รูลั้กษณะ","รู้ลักษณะ",$line); +$line = str_replace("รูและเทคโนโลยี้","รู้และเทคโนโลยี",$line); +$line = str_replace("รูว้ ","รู้ว",$line); +$line = str_replace("รูส้ ","รู้ส",$line); +$line = str_replace("รูสิ้","รู้สิ",$line); +$line = str_replace("รูสึ้ ก","รู้สึก",$line); +$line = str_replace("รูห้ ","รู้ห",$line); +$line = str_replace("รูอ้ ","รู้อ",$line); +$line = str_replace("รูเ้","รู้เ",$line); +$line = str_replace("รูแ้ ","รู้แ",$line); +$line = str_replace("รูใ.มีข่","รูปไข่",$line); +$line = str_replace("รูใ}ไข่","รูปไข่",$line); +$line = str_replace("รู้ ","รู้o",$line); +$line = str_replace("เรณูสัน","เรณูสั้น",$line); +$line = str_replace("เริน􀃉","เริ่น",$line); +$line = str_replace("เริ่ม สงคราม","เริ่มสงคราม",$line); +$line = str_replace("เริม􀃉 ","เริ่ม",$line); +$line = str_replace("เริม􀃉","เริ่ม",$line); +$line = str_replace("เริ􀃉ม","เริ่ม",$line); +$line = str_replace("เรียกร้อง การปฏิรูป","เรียกร้องการปฏิรูป",$line); +$line = str_replace("เรียง สลับ","เรียงสลับ",$line); +$line = str_replace("เรียงข้ตแน่น","เรียงชิดแน่น",$line); +$line = str_replace("เรียงลลับ","เรียวสลับ",$line); +$line = str_replace("เรียงห่างถัน","เรียงห่างกัน",$line); +$line = str_replace("เรีอนยอต","เรือนยอด",$line); +$line = str_replace("เรื่ม","เริ่ม",$line); +$line = str_replace("เรืยงสลับ","เรียงสลับ",$line); +$line = str_replace("เรื่อง นั้นๆ","เรื่องนั้น ๆ",$line); +$line = str_replace("เรื่องนี่","เรื่องนี้",$line); +$line = str_replace("เรือนจ้า","เรือนจำ",$line); +$line = str_replace("เรือนจาเก่า","เรือนจำเก่า",$line); +$line = str_replace("เรือนจาแ","เรือนจำแ",$line); +$line = str_replace("เรือ􀃉 ","เรื่อ",$line); +$line = str_replace("เรื􀃉","เรื่",$line); +$line = str_replace("เรื􀃉อง","เรื่อง",$line); +$line = str_replace("แรงงำน","แรงงาน",$line); +$line = str_replace("แรงดันน้า","แรงดันน้ำ",$line); +$line = str_replace("โรงเตั๊ยม","โรงเตี๊ยม",$line); +$line = str_replace("โรงน้าแข็ง","โรงน้ำแข็ง",$line); +$line = str_replace("โรงเรียนนาเป็น","โรงเรียนนำเป็น",$line); +$line = str_replace("โรเบิร์ต เลย","โรเบิร์ต เลย์",$line); +$line = str_replace("โรเบิร์ต เลย์์","โรเบิร์ต เลย์",$line); +$line = str_replace("โรแบสปึแยร์","โรแบสปีแยร์",$line); +$line = str_replace("โรมันจาค็อบสัน","โรมัน จาค็อบสัน",$line); +$line = str_replace("โรมาเนึย","โรมาเนีย",$line); +$line = str_replace("โรมาเนืย","โรมาเนีย",$line); +$line = str_replace("ใรคมาลาเรีย","โรคมาลาเรีย",$line); +$line = str_replace("ไรศู้นย์","ไร้ศูนย์",$line); +$line = str_replace("ไรเ้","ไร้เ",$line); +$line = str_replace("ฤดูแล้ง น้าที่","ฤดูแล้ง น้ำที่",$line); +$line = str_replace("ฤทธิ้","ฤทธิ์",$line); +$line = str_replace("ล&เอียต","ละเอียด",$line); +$line = str_replace("ลกั ","ลัก",$line); +$line = str_replace("ลกั","ลัก",$line); +$line = str_replace("ล็ขมพู","สีชมพู",$line); +$line = str_replace("ล็ขาว","สีขาว",$line); +$line = str_replace("ล้ขาว","สีขาว",$line); +$line = str_replace("ล็เขียว","สีเขียว",$line); +$line = str_replace("ล์เขียวแก่","สีเขียวแก่",$line); +$line = str_replace("ลงขลา","สงขลา",$line); +$line = str_replace("ลงนาม ใน","ลงนามใน",$line); +$line = str_replace("ล่งผล","ส่งผล",$line); +$line = str_replace("ล่งมอบ","ส่งมอบ",$line); +$line = str_replace("ล่งเสริม","ส่งเสริม",$line); +$line = str_replace("ล่งเสริมการค้า","ส่งเสริมการค้า",$line); +$line = str_replace("ลงั ","ลัง",$line); +$line = str_replace("ลดต่ำ ลง","ลดต่ำลง",$line); +$line = str_replace("ลดั ","ลัด",$line); +$line = str_replace("ลตรูป","ลดรูป",$line); +$line = str_replace("ล็แตง","สีแดง",$line); +$line = str_replace("ล้เทา","สีเทา",$line); +$line = str_replace("ลนั ","ลัน",$line); +$line = str_replace("ล้นํ้า","สีน้ำ",$line); +$line = str_replace("ล็นํ้าตาล","สีนํ้าตาล",$line); +$line = str_replace("ล้นาตาล","สีน้ำตาล",$line); +$line = str_replace("ล้นาตาลแตง","สีน้ำตาลแดง",$line); +$line = str_replace("ล็นำเงินตำ","สีน้ำเงินดำ",$line); +$line = str_replace("ล็น้ำตาล","สีน้ำตาล",$line); +$line = str_replace("ลบั ","ลับ",$line); +$line = str_replace("ลม้ ","ล้ม",$line); +$line = str_replace("ล็ม่วง","สีม่วง",$line); +$line = str_replace("ล้มสุก","ล้มลุก",$line); +$line = str_replace("ลยั ","ลัย",$line); +$line = str_replace("ลว้ ","ล้ว",$line); +$line = str_replace("ล่วนปลาย","ส่วนปลาย",$line); +$line = str_replace("ลสับตั้งฉาก","สลับตั้งฉาก",$line); +$line = str_replace("ล้เหล้อง","สีเหลือง",$line); +$line = str_replace("ลอ้ ","ล้อ",$line); +$line = str_replace("ล้อมรอบ รังไข่","ล้อมรอบรังไข่",$line); +$line = str_replace("ลอยน้า","ลอยน้ำ",$line); +$line = str_replace("ล้ออกแตง","สีออกแดง",$line); +$line = str_replace("ล้ออกเหลือง","สีออกเหลือง",$line); +$line = str_replace("ละเก็ต","สะเก็ด",$line); +$line = str_replace("ละลายน้่า","ละลายน้ำ",$line); +$line = str_replace("ละอองน้า","ละอองน้ำ",$line); +$line = str_replace("ละเอียดสันนุ่ม","ละเอียดสั้นนุ่ม",$line); +$line = str_replace("ลัก ","ลัก",$line); +$line = str_replace("ลักลอบนา","ลักลอบนำ",$line); +$line = str_replace("ลัขมพู","สีชมพู",$line); +$line = str_replace("ลัขาว","สีขาว",$line); +$line = str_replace("ลั่งห้าม","สั่งห้าม",$line); +$line = str_replace("ลัดลงมา","ถัดลงมา",$line); +$line = str_replace("ลัแตง","สีแดง",$line); +$line = str_replace("ลัทธิ นาขี","ลัทธินาซี",$line); +$line = str_replace("ลัทธิมากช์","ลัทธิมากซ์",$line); +$line = str_replace("ลัทธิมากชี","ลัทธิมากซ์",$line); +$line = str_replace("ลันํ้าตาล","สีนํ้าตาล",$line); +$line = str_replace("ลันาตาล","สีน้ำตาล",$line); +$line = str_replace("ลัน􀃉 ","ลั่น",$line); +$line = str_replace("ล่าข้า","ล่าช้า",$line); +$line = str_replace("ลาคลอง","ลำคลอง",$line); +$line = str_replace("ลาคลองง","ลำคลองงู",$line); +$line = str_replace("ลาจวน","ลำจวน",$line); +$line = str_replace("ล่าช้าหรือน้า","ล่าช้าหรือนำ",$line); +$line = str_replace("ล้าเชียงไกร","ลำเชียงไกร",$line); +$line = str_replace("ลาเซบาย","ลำเซบาย",$line); +$line = str_replace("ลาดับ","ลำดับ",$line); +$line = str_replace("ล้าดับ","ลำดับ",$line); +$line = str_replace("ลาดินอเมริกา","ลาตินอเมริกา",$line); +$line = str_replace("ล้าโดม","ลำโดม",$line); +$line = str_replace("ลาต้น","ลำต้น",$line); +$line = str_replace("ล่าต้น","ลำต้น",$line); +$line = str_replace("ลาธาร","ลำธาร",$line); +$line = str_replace("ล้านชูอับเรณู","ก้านชูอับเรณู",$line); +$line = str_replace("ล้านดอกเพศผู้","ก้านดอกเพศผู้",$line); +$line = str_replace("ล้านยอดเกสร","ก้านยอดเกสร",$line); +$line = str_replace("ลาน้า","ลำน้ำ",$line); +$line = str_replace("ล้าน้้าชี","ลำน้ำชี",$line); +$line = str_replace("ล้าน้ำ","ลำน้ำ",$line); +$line = str_replace("ลาบาก ","ลำบาก ",$line); +$line = str_replace("ลาปาง","ลำปาง",$line); +$line = str_replace("ล่าปาง","ลำปาง",$line); +$line = str_replace("ล้าปาง","ลำปาง",$line); +$line = str_replace("ลาปาววิทยาคม","ลำปาววิทยาคม",$line); +$line = str_replace("ล้าพัง","ลำพัง",$line); +$line = str_replace("ลาพูน","ลำพูน",$line); +$line = str_replace("ลาโพง","ลำโพง",$line); +$line = str_replace("ลามเหลี่ยม","สามเหลี่ยม",$line); +$line = str_replace("ลาไย","ลำไย",$line); +$line = str_replace("ลาละ","ลำละ",$line); +$line = str_replace("ล้าละ","ลำละ",$line); +$line = str_replace("ลาเลียง","ลำเลียง",$line); +$line = str_replace("ลาสินธุ์","ลำสินธุ์",$line); +$line = str_replace("ลาห้วย","ลำห้วย",$line); +$line = str_replace("ล้ำงท","ล้างท",$line); +$line = str_replace("ล่ำช้ำ","ล่าช้า",$line); +$line = str_replace("ลำดบั ","ลำดับ",$line); +$line = str_replace("ลำต้นเตี่ยว","ลำต้นเดี่ยว",$line); +$line = str_replace("ลำต้นใต้ลิน","ลำต้นใต้ดิน",$line); +$line = str_replace("ลำต้นสัน","ลำต้นสั้น",$line); +$line = str_replace("ลำน้ำแม่ตา","ลำน้ำแม่ต๋ำ",$line); +$line = str_replace("ลำยลักษณ์","ลายลักษณ์",$line); +$line = str_replace("ลิ'นาตาล","สีน้ำตาล",$line); +$line = str_replace("ลิ'นำเงิน","สีนำเงิน",$line); +$line = str_replace("ลิ’เหลี่ยม","สี่เหลี่ยม",$line); +$line = str_replace("ลิ•นาตาล","สีน้ำตาล",$line); +$line = str_replace("ลิขมพู","สีชมพู",$line); +$line = str_replace("ลิขาว","สีขาว",$line); +$line = str_replace("ลิเขียว","สีเขียว",$line); +$line = str_replace("ลิซมพู","สีชมพู",$line); +$line = str_replace("ลิแตง","สีแดง",$line); +$line = str_replace("ลิเทา","สีเทา",$line); +$line = str_replace("ลิ้นพระชนม์","สิ้นพระชนม์",$line); +$line = str_replace("ลิ่นลู่มหนาแน่น","สั้นนุ่มหนาแน่น",$line); +$line = str_replace("ลิ้นสุด","สิ้นสุด",$line); +$line = str_replace("ลิน่าตาล","สีน้ำตาล",$line); +$line = str_replace("ลินํ้าตาล","สีน้ำตาล",$line); +$line = str_replace("ลินำตาล","สีน้ำตาล",$line); +$line = str_replace("ลิน้ำตาล","สีน้ำตาล",$line); +$line = str_replace("ลิน􀃊 ","ลิ้น",$line); +$line = str_replace("ลิน􀃊","ลิ้น",$line); +$line = str_replace("ลิม่วง","สีม่วง",$line); +$line = str_replace("ลิเหลิอง","สีเหลือง",$line); +$line = str_replace("ลิเหลี่ยม","สี่เหลี่ยม",$line); +$line = str_replace("ลิเหลือง","สีเหลือง",$line); +$line = str_replace("ลิเหลืองอ่อน","สีเหลืองอ่อน",$line); +$line = str_replace("ลิ􀃊น","ลิ้น",$line); +$line = str_replace("ลี ขาวอมเขียว","สีขาวอมเขียว",$line); +$line = str_replace("ลี เหลืองอ่อน","สีเหลืองอ่อน",$line); +$line = str_replace("ลี,นาตาล","สีน้ำตาล",$line); +$line = str_replace("ลี'นาตาล","สีน้ำตาล",$line); +$line = str_replace("ลี'นาตาลตำ","สีน้ำตาลดำ",$line); +$line = str_replace("ลี่'เหลี่ยม","สี่เหลี่ยม",$line); +$line = str_replace("ลีขมพู","สีชมพู",$line); +$line = str_replace("ลีขาว","สีขาว",$line); +$line = str_replace("ลีเขียว","",$line); +$line = str_replace("ลีเขียวอมแตง","สีเขียวอมแดง",$line); +$line = str_replace("ลีครีม","สีครีม",$line); +$line = str_replace("ลีคลี้า","สีคล้ำ",$line); +$line = str_replace("ลีจาง","สีจาง",$line); +$line = str_replace("ลีชมพู","สีชมพู",$line); +$line = str_replace("ลีแดง","สีแดง",$line); +$line = str_replace("ลีตำ","สีดำ",$line); +$line = str_replace("ลีแตง","สีแดง",$line); +$line = str_replace("ลีเทา","สีเทา",$line); +$line = str_replace("ลี้นกว่า","สั้นกว่า",$line); +$line = str_replace("ลีนํ้าตาล","สีนํ้าตาล",$line); +$line = str_replace("ลีนาตาล","สีน้ำตาล",$line); +$line = str_replace("ลีน์าตาล","สีน้ำตาล",$line); +$line = str_replace("ลีนํ๋าตาล","สีน้ำตาล",$line); +$line = str_replace("ลีนำตาล","สีน้ำตาล",$line); +$line = str_replace("ลีน้ำตาล","สีน้ำตาล",$line); +$line = str_replace("ลีนิ้าตาล","สีน้ำตาล",$line); +$line = str_replace("ลีนี่าตาล","สีน้ำตาล",$line); +$line = str_replace("ลีฟัน","สีฟัน",$line); +$line = str_replace("ลีม่วง","สีม่วง",$line); +$line = str_replace("ลีม่วงแตง","สีม่วงแดง",$line); +$line = str_replace("ลีม่วงอมแตง","สีม่วงอมแดง",$line); +$line = str_replace("ลีล็ม","สีส้ม",$line); +$line = str_replace("ลีล้ม","สีส้ม",$line); +$line = str_replace("ลีส้ม","สีส้ม",$line); +$line = str_replace("ลีสัมแตง","สีส้มแดง",$line); +$line = str_replace("ลีแสด","สีแสด",$line); +$line = str_replace("ลี่เหลี่ยม","สี่เหลี่ยม",$line); +$line = str_replace("ลีเหลีอง","สีเหลือง",$line); +$line = str_replace("ลีเหลือง","สีเหลือง",$line); +$line = str_replace("ลีออกเทา","สีออกเทา",$line); +$line = str_replace("ลีอานฮินตัน","ลีอาน ฮินตัน",$line); +$line = str_replace("ลี􀃊","ลี้",$line); +$line = str_replace("ลึกขึ้ง","ลึกซึ้ง",$line); +$line = str_replace("ลึขาว","สีขาว",$line); +$line = str_replace("ลึขาวนวล","สีขาวนวล",$line); +$line = str_replace("ลึเขียว","",$line); +$line = str_replace("ลึนํ้าตาล","สีนํ้าตาล",$line); +$line = str_replace("ลึน่าตาล","สีน้ำตาล",$line); +$line = str_replace("ลึม่วง","สีม่วง",$line); +$line = str_replace("ลื'เขียว","สีเขียว",$line); +$line = str_replace("ลืขมทู","สีชมพู",$line); +$line = str_replace("ลืขมพู","สีชมพู",$line); +$line = str_replace("ลืขาว","สีขาว",$line); +$line = str_replace("ลืเขียว","",$line); +$line = str_replace("ลืชมพู","สีชมพู",$line); +$line = str_replace("ลืดลํ้า","สีคล้ำ",$line); +$line = str_replace("ลืดำ","สีดำ",$line); +$line = str_replace("ลืแดง","สีแดง",$line); +$line = str_replace("ลืตำ","สีดำ",$line); +$line = str_replace("ลืแตง","สีแดง",$line); +$line = str_replace("ลืเทา","สีเทา",$line); +$line = str_replace("ลืนํ้าตาล","สีนํ้าตาล",$line); +$line = str_replace("ลืนํ๋าตาล","สีน้ำตาล",$line); +$line = str_replace("ลืนำตาล","สีน้ำตาล",$line); +$line = str_replace("ลืน้ำตาล","สีน้ำตาล",$line); +$line = str_replace("ลืนิ้าตาล","สีน้ำตาล",$line); +$line = str_replace("ลืนี่าตาล","สีน้ำตาล",$line); +$line = str_replace("ลืน􀃉 ","ลื่น",$line); +$line = str_replace("ลืม่วง","สีม่วง",$line); +$line = str_replace("ลืล้ม","สีส้ม",$line); +$line = str_replace("ลืแลงเลือดนก","สีแดงเลือดนก",$line); +$line = str_replace("ลืแลต","สีแสด",$line); +$line = str_replace("ลืส้ม","สีส้ม",$line); +$line = str_replace("ลืสัม","ลีส้ม",$line); +$line = str_replace("ลืเหลือง","สีเหลือง",$line); +$line = str_replace("ลือ􀃉","ลื่อ",$line); +$line = str_replace("ลื􀃊อ","ลื้อ",$line); +$line = str_replace("ลุกถึแตง","สุกสีแดง",$line); +$line = str_replace("ลุกมีลำ","สุกสีดำ",$line); +$line = str_replace("ลุกล์นำเงินเข้มถึงตำ","สุกสีน้ำเงินเข้มถึงดำ",$line); +$line = str_replace("ลุกล์นื้าเงิน","สุกสีน้ำเงิน",$line); +$line = str_replace("ลุกสีขาว","สุกสีขาว",$line); +$line = str_replace("ลุกสีแดง","สุกสีแดง",$line); +$line = str_replace("ลุกสีม่วงดลึ้า","สุกสีม่วงคล้ำ",$line); +$line = str_replace("ลุกสีเหลือง","สุกสีเหลือง",$line); +$line = str_replace("ลุม้ ","ลุ้ม",$line); +$line = str_replace("ลุมติ่ ด","ลุ่มติด",$line); +$line = str_replace("ลุ่มน้า","ลุ่มน้ำ",$line); +$line = str_replace("ลุ่มน้้า","ลุ่มน้ำ",$line); +$line = str_replace("ลุ่มน้าจาง","ลุ่มน้ำจาง",$line); +$line = str_replace("ลุ่มน้าน่าน","ลุ่มน้ำน่าน",$line); +$line = str_replace("ลุ่มน้ำล้า","ลุ่มน้ำลำ",$line); +$line = str_replace("ลุมแม่่ น้ำ","ลุ่มแม่น้ำ",$line); +$line = str_replace("ลูกบำศก์","ลูกบาศก์",$line); +$line = str_replace("ลูกหนี่","ลูกหนี้",$line); +$line = str_replace("ลูวิ่่ง ","ลู่วิ่ง ",$line); +$line = str_replace("เลขำธิกำร","เลขาธิการ",$line); +$line = str_replace("เล้นแขนง","เส้นแขนง",$line); +$line = str_replace("เล่มนื้","เล่มนี้",$line); +$line = str_replace("เลี้ยงกระต่ำย","เลี้ยงกระต่าย",$line); +$line = str_replace("เลีย􀃉 ","เลี่ย",$line); +$line = str_replace("เลี􀃊ยง","เลี้ยง",$line); +$line = str_replace("เลี􀃊ยว","เลี้ยว",$line); +$line = str_replace("เลื้อยขี้นยอด","เลื้อยขึ้นยอด",$line); +$line = str_replace("เลือ􀃉 ","เลื่อ",$line); +$line = str_replace("เลื􀃉","เลื่",$line); +$line = str_replace("แลif","และ",$line); +$line = str_replace("แลนด์มำร์ค","แลนด์มาร์ค",$line); +$line = str_replace("แลร!ปลายกิ่ง","และปลายกิ่ง",$line); +$line = str_replace("แลรเขยาย","และขยาย",$line); +$line = str_replace("แลรเตาม1ซอก","และตามซอก",$line); +$line = str_replace("แลรเปลายกิ่ง","และปลายกิ่ง",$line); +$line = str_replace("แลรเลำต้น","และลำต้น",$line); +$line = str_replace("แลรเแยกเพศ","และแยกเพศ",$line); +$line = str_replace("แลว้ ","แล้ว",$line); +$line = str_replace("แลว้","แล้ว",$line); +$line = str_replace("แล้วเช่น","แล้ว เช่น",$line); +$line = str_replace("แล้วยังมี","แล้ว ยังมี",$line); +$line = str_replace("และ เคลื่อนไหว","และเคลื่อนไหว",$line); +$line = str_replace("และ เชื่อมั่น","และเชื่อมั่น",$line); +$line = str_replace("และน้า ","และน้ำ ",$line); +$line = str_replace("และน่า","และนำ",$line); +$line = str_replace("และนากล้า","และนำกล้า",$line); +$line = str_replace("และน้าข้อมูล","และนำข้อมูล",$line); +$line = str_replace("และนาเข้า","และนำเข้า",$line); +$line = str_replace("และน้าเชื้อ","และน้ำเชื้อ",$line); +$line = str_replace("และนาตู้","และนำตู้",$line); +$line = str_replace("และน้าที่ใช้","และน้ำที่ใช้",$line); +$line = str_replace("และน้าบ่อ","และน้ำบ่อ",$line); +$line = str_replace("และน้าผล","และนำผล",$line); +$line = str_replace("และน้ามี","และน้ำมี",$line); +$line = str_replace("และนาไม้","และนำไม้",$line); +$line = str_replace("และน้าระบบ","และนำระบบ",$line); +$line = str_replace("และน้าสามารถ","และน้ำสามารถ",$line); +$line = str_replace("และนำน ","และน่าน ",$line); +$line = str_replace("ไล่เสี่ย","",$line); +$line = str_replace("ว ","ว",$line); +$line = str_replace("วงค์","วงศ์ ",$line); +$line = str_replace("วงฅ์","วงศ์",$line); +$line = str_replace("วงสั ","วงศ์ ",$line); +$line = str_replace("วจั ","วัจ",$line); +$line = str_replace("วฒั ","วัฒ",$line); +$line = str_replace("วที้","ว้ที",$line); +$line = str_replace("วน้ ","ว้น",$line); +$line = str_replace("วนั ","วัน",$line); +$line = str_replace("วลาลึมีร์ เลนิน","วลาดีมีร์ เลนิน",$line); +$line = str_replace("วังน้าเขียว","วังน้ำเขียว",$line); +$line = str_replace("วังน้าลัด","วังน้ำลัด",$line); +$line = str_replace("วัดจาบอน","วัดจำบอน",$line); +$line = str_replace("วัดนำ ","วัดน้ำ ",$line); +$line = str_replace("วางมัดจา ","วางมัดจำ ",$line); +$line = str_replace("วาทศึลป็","วาทศิลป์",$line); +$line = str_replace("วารสาร วรรณกรรม","วารสารวรรณกรรม",$line); +$line = str_replace("วำงแผน","วางแผน",$line); +$line = str_replace("ว่ำประสงค์","ว่าประสงค์",$line); +$line = str_replace("ว่ำสามารถ","ว่าสามารถ",$line); +$line = str_replace("วิกฤตกา รณ์","วิกฤตการณ์",$line); +$line = str_replace("วิเคราะห์น้า","วิเคราะห์น้ำ",$line); +$line = str_replace("วิเครำะห์","วิเคราะห์",$line); +$line = str_replace("วิง􀃉 ","วิ่ง",$line); +$line = str_replace("วิง􀃉","วิ่ง",$line); +$line = str_replace("วิ้ง􀃉","วิ่ง",$line); +$line = str_replace("วิชำ","วิชา",$line); +$line = str_replace("วิทยากรนาชม","วิทยากรนำชม",$line); +$line = str_replace("วิทยำลัย","วิทยาลัย",$line); +$line = str_replace("วิทยำศำสตร์","วิทยาศาสตร์",$line); +$line = str_replace("วิธีกำร","วิธีการ",$line); +$line = str_replace("วินยั ","วินัย",$line); +$line = str_replace("วิภำคี","วิภาคี",$line); +$line = str_replace("วิลเลียม อีวาร์ตแกลด สโตน","วิลเลียม อีวาร์ต แกลดสโตน",$line); +$line = str_replace("วิสำกิจ","วิสากิจ",$line); +$line = str_replace("วิสำห","วิสาห",$line); +$line = str_replace("วิ􀃉ง","วิ่ง",$line); +$line = str_replace("วีเ􀃉","วี่เ",$line); +$line = str_replace("เวน้ ","เว้น",$line); +$line = str_replace("เวนบ","เว็บ",$line); +$line = str_replace("เวลา ผ่านไป","เวลาผ่านไป",$line); +$line = str_replace("เวลำ","เวลา",$line); +$line = str_replace("เวียงค่า","เวียงคำ",$line); +$line = str_replace("ไวก้ ","ไว้ก",$line); +$line = str_replace("ไวข้ ","ไว้ข",$line); +$line = str_replace("ไวจ้ ","ไว้จ",$line); +$line = str_replace("ไวต้","ไว้ต",$line); +$line = str_replace("ไวพ้ ","ไว้พ",$line); +$line = str_replace("ไวภ้ ","ไว้ภ",$line); +$line = str_replace("ไวว้","ไว้ว",$line); +$line = str_replace("ไวส้ ","ไว้ส",$line); +$line = str_replace("ไวห้ ","ไว้ห",$line); +$line = str_replace("ไวอ้ ","ไว้อ",$line); +$line = str_replace("ไวเ้","ไว้เ",$line); +$line = str_replace("ไวแ้ ","ไว้แ",$line); +$line = str_replace("ไวโ้ดย","ไว้โดย",$line); +$line = str_replace("ไวใ้ ","ไว้ใ",$line); +$line = str_replace("ศรีสาราญ","ศรีสำราญ",$line); +$line = str_replace("ศรีส่าราญ","ศรีสำราญ",$line); +$line = str_replace("ศรืลังกา","ศรีลังกา",$line); +$line = str_replace("ศลับ","สลับ",$line); +$line = str_replace("ศสับ","สลับ",$line); +$line = str_replace("ศักดิ้","ศักดิ์",$line); +$line = str_replace("ศักดิ้ศรี","ศักดิ์ศรี",$line); +$line = str_replace("ศักดี้","ศักดิ์",$line); +$line = str_replace("ศักดี๋สิทธี๋","ศักดิ์สิทธิ์",$line); +$line = str_replace("ศักดึ๋","ศักดิ์",$line); +$line = str_replace("ศักดึ๋สิทธี๋","ศักดิ์สิทธิ์",$line); +$line = str_replace("ศักยภำพ","ศักยภาพ",$line); +$line = str_replace("ศาสนสมปีติ","ศาสนสมบัติ",$line); +$line = str_replace("ศำสตร์","ศาสตร์",$line); +$line = str_replace("ศึกษาด้นคว้า","ศึกษาค้นคว้า",$line); +$line = str_replace("ศึกษาทำความ","ศึกษาทำความ",$line); +$line = str_replace("ศึกษำ","ศึกษา",$line); +$line = str_replace("ศึรษะ","ศีรษะ",$line); +$line = str_replace("ศึลธรรม","ศีลธรรม",$line); +$line = str_replace("ศึลบวช","ศีลบวช",$line); +$line = str_replace("ศึลปวัฒนธรรม","ศิลปวัฒนธรรม",$line); +$line = str_replace("ศึลปะ","ศิลปะ",$line); +$line = str_replace("ศึลปิน","ศิลปิน",$line); +$line = str_replace("ศูนย์ ปฏิบัติการ","ศูนย์ปฏิบัติการ",$line); +$line = str_replace("ษตั ","ษัต",$line); +$line = str_replace("ส ","ส",$line); +$line = str_replace("ส นั􀃉 ","สั่น",$line); +$line = str_replace("ส ัง","สัง",$line); +$line = str_replace("ส ื","สื",$line); +$line = str_replace("ส ือ􀃉","สื่อ",$line); +$line = str_replace("สงคราม ขนาดใหญ่","สงครามขนาดใหญ่",$line); +$line = str_replace("สงคราม ยุติ","สงครามยุติ",$line); +$line = str_replace("ส่งน้า","ส่งน้ำ",$line); +$line = str_replace("ส่งน้้า","ส่งน้ำ",$line); +$line = str_replace("สงั ","สัง",$line); +$line = str_replace("สงั􀃉","สั่ง",$line); +$line = str_replace("สญั ","สัญ",$line); +$line = str_replace("สตั ","สัต",$line); +$line = str_replace("สตีเฟนแครเชน","สตีเฟน แครเชน",$line); +$line = str_replace("สถาปัตยกรรม กอทิก","สถาปัตยกรรมกอทิก",$line); +$line = str_replace("สถำน","สถาน",$line); +$line = str_replace("สถำนที่","สถานที่",$line); +$line = str_replace("สถำบัน","สถาบัน",$line); +$line = str_replace("สทั ","สัท",$line); +$line = str_replace("ส้นๆ","สั้น ๆ",$line); +$line = str_replace("ส้นนุ่ม","สั้นนุ่ม",$line); +$line = str_replace("สนบั สนนุ ","สนับสนุน",$line); +$line = str_replace("สนองภำค","สนองภาค",$line); +$line = str_replace("สนับสนุน การก่อการร้าย","สนับสนุนการก่อการร้าย",$line); +$line = str_replace("สนับสบุน","สนับสนุน",$line); +$line = str_replace("สนับสบุน่","สนับสนุน",$line); +$line = str_replace("สนับสมุน","สนับสนุน",$line); +$line = str_replace("สนั􀃉 ","สั่น",$line); +$line = str_replace("สนั􀃉","สั่น",$line); +$line = str_replace("สนั􀃊 ","สั้น",$line); +$line = str_replace("สนั􀃊","สั้น",$line); +$line = str_replace("สบั ","สับ",$line); +$line = str_replace("สภาชุนนาง","สภาขุนนาง",$line); +$line = str_replace("สภาโชเวิยต","สภาโซเวียต",$line); +$line = str_replace("สภาพของน้า","สภาพของน้ำ",$line); +$line = str_replace("สภาพดนิ ","สภาพดิน",$line); +$line = str_replace("สภำพ ","สภาพ ",$line); +$line = str_replace("สภำพ","สภาพ",$line); +$line = str_replace("สภำพวัสดุ","สภาพวัสดุ",$line); +$line = str_replace("สม้ ","ส้ม",$line); +$line = str_replace("สม,มูรณ์ เพศ","สมบูรณ์เพศ",$line); +$line = str_replace("สม'มูรฟ้ เพศ","",$line); +$line = str_replace("สมณคักดี้","สมณศักดิ์",$line); +$line = str_replace("สมบตั ","สมบัต",$line); +$line = str_replace("สมบุรณ์","สมบูรณ์",$line); +$line = str_replace("ส้มพันธมิตร","สัมพันธมิตร",$line); +$line = str_replace("สมยั ","สมัย",$line); +$line = str_replace("สมหูรณ์","สมบูรณ์",$line); +$line = str_replace("สมั ","สัม",$line); +$line = str_replace("สมัครงำน","สมัครงาน",$line); +$line = str_replace("สมัยนี ้","สมัยนี้",$line); +$line = str_replace("สมาขิก","สมาชิก",$line); +$line = str_replace("สมาซิก","สมาชิก",$line); +$line = str_replace("สม่าเสมอ","สม่ำเสมอ",$line); +$line = str_replace("สม่่าเสมอ","สม่ำเสมอ",$line); +$line = str_replace("สม่้าเสมอ","สม่ำเสมอ",$line); +$line = str_replace("สมำชิก","สมาชิก",$line); +$line = str_replace("สมำ􀃉 ","สม่ำ",$line); +$line = str_replace("สมำ􀃉","สม่ำ",$line); +$line = str_replace("สรรน้้า","สรรน้ำ",$line); +$line = str_replace("สระน้า","สระน้ำ",$line); +$line = str_replace("สระว่ายน้า","สระว่ายน้ำ",$line); +$line = str_replace("สร้ำง","สร้าง",$line); +$line = str_replace("สลับ่ใกลื","สลับใกล้",$line); +$line = str_replace("สลับรร!นาบ","สลับระนาบ",$line); +$line = str_replace("สลาพ่ใต้","สลาฟใต้",$line); +$line = str_replace("สว้ ม","ส้วม",$line); +$line = str_replace("ส่วน กรอง","ส่วนกรอง",$line); +$line = str_replace("ส่วน กระดูก","ส่วนกระดูก",$line); +$line = str_replace("ส่วน กราสส์มันน์","ส่วนกราสส์มันน์",$line); +$line = str_replace("ส่วน กลาง","ส่วนกลาง",$line); +$line = str_replace("ส่วน การแจกแจง","ส่วนการแจกแจง",$line); +$line = str_replace("ส่วน การซ้ำรูป","ส่วนการซ้ำรูป",$line); +$line = str_replace("ส่วน การวิเคราะห์","ส่วนการวิเคราะห์",$line); +$line = str_replace("ส่วน ของ","ส่วนของ",$line); +$line = str_replace("ส่วน คำตอบ","ส่วนคำตอบ",$line); +$line = str_replace("ส่วน โครงสร้าง","ส่วนโครงสร้าง",$line); +$line = str_replace("ส่วน โครงหลัก","ส่วนโครงหลัก",$line); +$line = str_replace("ส่วน ใจความ","ส่วนใจความ",$line); +$line = str_replace("ส่วน ใด","ส่วนใด",$line); +$line = str_replace("ส่วน ใดส่วน หนึ่ง","ส่วนใดส่วนหนึ่ง",$line); +$line = str_replace("ส่วน ตัว","ส่วนตัว",$line); +$line = str_replace("ส่วน ต่าง ๆ","ส่วนต่าง ๆ",$line); +$line = str_replace("ส่วน เติมเต็ม","ส่วนเติมเต็ม",$line); +$line = str_replace("ส่วน แต่ละส่วน","ส่วนแต่ละส่วน",$line); +$line = str_replace("ส่วน ทฤษฎี","ส่วนทฤษฎี",$line); +$line = str_replace("ส่วน ที่","ส่วนที่",$line); +$line = str_replace("ส่วน ที่ต่อ","ส่วนที่ต่อ",$line); +$line = str_replace("ส่วน นักภาษาศาสตร์","ส่วนนักภาษาศาสตร์",$line); +$line = str_replace("ส่วน เนื้อเรื่อง","ส่วนเนื้อเรื่อง",$line); +$line = str_replace("ส่วน ในโครงสร้าง","ส่วนในโครงสร้าง",$line); +$line = str_replace("ส่วน ในตัวอย่าง","ส่วนในตัวอย่าง",$line); +$line = str_replace("ส่วน ในประโยค","ส่วนในประโยค",$line); +$line = str_replace("ส่วน ในภาษา","ส่วนในภาษา",$line); +$line = str_replace("ส่วน ในหน่วย","ส่วนในหน่วย",$line); +$line = str_replace("ส่วน บน","ส่วนบน",$line); +$line = str_replace("ส่วน ปฏิพันธ์","ส่วนปฏิพันธ์",$line); +$line = str_replace("ส่วน ประกอบ","ส่วนประกอบ",$line); +$line = str_replace("ส่วน ประธาน","",$line); +$line = str_replace("ส่วน ประโยค","ส่วนประโยค",$line); +$line = str_replace("ส่วน ปลาย","ส่วนปลาย",$line); +$line = str_replace("ส่วน พยางค์","ส่วนพยางค์",$line); +$line = str_replace("ส่วน พึ่งพา","ส่วนพึ่งพา",$line); +$line = str_replace("ส่วน ภาคแสดง","ส่วนภาคแสดง",$line); +$line = str_replace("ส่วน ภาษา","ส่วนภาษา",$line); +$line = str_replace("ส่วน มาก","ส่วนมาก",$line); +$line = str_replace("ส่วน มูลฐาน","ส่วนมูลฐาน",$line); +$line = str_replace("ส่วน ย่อย","ส่วนย่อย",$line); +$line = str_replace("ส่วน รอง","ส่วนรอง",$line); +$line = str_replace("ส่วน แรก","ส่วนแรก",$line); +$line = str_replace("ส่วน ลอย","ส่วนลอย",$line); +$line = str_replace("ส่วน ล่างสุด","ส่วนล่างสุด",$line); +$line = str_replace("ส่วน เล็ก ๆ","ส่วนเล็ก ๆ",$line); +$line = str_replace("ส่วน สำคัญ","ส่วนสำคัญ",$line); +$line = str_replace("ส่วน เส้นเสียง","ส่วนเส้นเสียง",$line); +$line = str_replace("ส่วน เสียง","ส่วนเสียง",$line); +$line = str_replace("ส่วน หน่วย","ส่วนหน่วย",$line); +$line = str_replace("ส่วน หน้า","ส่วนหน้า",$line); +$line = str_replace("ส่วน หนึ่ง","ส่วนหนึ่ง",$line); +$line = str_replace("ส่วน หลัก","ส่วนหลัก",$line); +$line = str_replace("ส่วน หลัง","ส่วนหลัง",$line); +$line = str_replace("ส่วน ใหญ่","ส่วนใหญ่",$line); +$line = str_replace("ส่วน องค์ประกอบ","ส่วนองค์ประกอบ",$line); +$line = str_replace("ส่วน อัตภาค","ส่วนอัตภาค",$line); +$line = str_replace("ส่วน อื่นๆ","ส่วนอื่น ๆ",$line); +$line = str_replace("ส่วนหลักเช่น","ส่วนหลัก เช่น",$line); +$line = str_replace("สวยงำม","สวยงาม",$line); +$line = str_replace("สวรรค ์","สวรรค์",$line); +$line = str_replace("สหภาพ โซเวิยต","สหภาพโชเวียต",$line); +$line = str_replace("สหภาพโชเวยต","สหภาพโซเวียต",$line); +$line = str_replace("สหภาพโชเวิยต","สหภาพโชเวียต",$line); +$line = str_replace("สอ้ ","ส้อ",$line); +$line = str_replace("สอดคถ้อง","สอดคล้อง",$line); +$line = str_replace("ส่อเด้า","ส่อเค้า",$line); +$line = str_replace("สะอำด","สะอาด",$line); +$line = str_replace("สั น","สั้น",$line); +$line = str_replace("สั'เทาอมตำ","สีเทาอมดำ",$line); +$line = str_replace("สัขาวนวล","สีขาวนวล",$line); +$line = str_replace("สั่งกำร","สั่งการ",$line); +$line = str_replace("สังคม ประชาธิปไตย","สังคมประชาธิปไตย",$line); +$line = str_replace("สังคมชองประเทศ","สังคมของประเทศ",$line); +$line = str_replace("สังคมประชาธินํโตย","สังคมประชาธิปไตย",$line); +$line = str_replace("สัง􀃉 ","สั่ง",$line); +$line = str_replace("สัง􀃉","สั่ง",$line); +$line = str_replace("สัญญาคืลเมนัม","สัญญาคิลเมนัม",$line); +$line = str_replace("สัญญาแซพ่วร์","สัญญาแซฟวร์",$line); +$line = str_replace("สัญญาแวร์ชาย","สัญญาแวร์ซาย",$line); +$line = str_replace("สัญญำ","สัญญา",$line); +$line = str_replace("สัตวช์ นิดหนึ่ง","สัตว์ชนิดหนึ่ง",$line); +$line = str_replace("สัตว์น้า","สัตว์น้ำ",$line); +$line = str_replace("สัตเวีย","ลัตเวีย",$line); +$line = str_replace("สันๆ","สั้น ๆ",$line); +$line = str_replace("สันกว่า","สั้นกว่า",$line); +$line = str_replace("สันดม","สันคม",$line); +$line = str_replace("สันมาก","สั้นมาก",$line); +$line = str_replace("สันาตาล","สีน้ำตาล",$line); +$line = str_replace("สันำเงิน","สีนำเงิน",$line); +$line = str_replace("สัน􀃉 ","สั้น",$line); +$line = str_replace("สัน􀃉","สั้น",$line); +$line = str_replace("สัน􀃊 ","สั้น",$line); +$line = str_replace("สั้น􀃊 ","สั้น",$line); +$line = str_replace("สัน􀃊","สั้น",$line); +$line = str_replace("สัปดาห","สัปดาห์",$line); +$line = str_replace("สัปดาห์์","สัปดาห์",$line); +$line = str_replace("สัปดาหห์ น้า","สัปดาห์หน้า",$line); +$line = str_replace("สัมภำษณ์","สัมภาษณ์",$line); +$line = str_replace("สัมฤทธ์ิ","สัมฤทธิ์",$line); +$line = str_replace("สัมฤทธี้","สัมฤทธิ์",$line); +$line = str_replace("ส้า","สำ",$line); +$line = str_replace("สาขาอาฃีพ","สาขาอาชีพ",$line); +$line = str_replace("สาคัญ","สำคัญ",$line); +$line = str_replace("ส่าคัญ","สำคัญ",$line); +$line = str_replace("ส้าคัญ","สำคัญ",$line); +$line = str_replace("สาแดง","สำแดง",$line); +$line = str_replace("สานัก","สำนัก",$line); +$line = str_replace("ส่านัก","สำนัก",$line); +$line = str_replace("ส้านัก","สำนัก",$line); +$line = str_replace("สานักงาน","สำนักงาน",$line); +$line = str_replace("สานึก","สำนึก",$line); +$line = str_replace("สาเนา","สำเนา",$line); +$line = str_replace("สาเนาซ้อน","สำเนาซ้อน",$line); +$line = str_replace("สาเนาหนังสือ","สำเนาหนังสือ",$line); +$line = str_replace("สาปะหลัง","สำปะหลัง",$line); +$line = str_replace("สามะโน","สำมะโน",$line); +$line = str_replace("สามารถจาเนื้อ","สามารถจำเนื้อ",$line); +$line = str_replace("สามารถใช้นำได้","สามารถใช้น้ำได้",$line); +$line = str_replace("สามารถทาได้","สามารถทำได้",$line); +$line = str_replace("สามารถนา","สามารถนำ",$line); +$line = str_replace("สามารถน่า","สามารถนำ",$line); +$line = str_replace("สามารถน้า","สามารถนำ",$line); +$line = str_replace("สามารถนาการ","สามารถนำการ",$line); +$line = str_replace("สามารถน้าข้อมูล","สามารถนำข้อมูล",$line); +$line = str_replace("สามารถนางาน","สามารถนำงาน",$line); +$line = str_replace("สามารถนาแผน","สามารถนำแผน",$line); +$line = str_replace("สามารถนายาง","สามารถนำยาง",$line); +$line = str_replace("สามารถน้าเรือ","สามารถนำเรือ",$line); +$line = str_replace("สามารถนาองค์ความรู้","สามารถนำองค์ความรู้",$line); +$line = str_replace("สามารถหำ","สามารถหา",$line); +$line = str_replace("สารวจ","สำรวจ",$line); +$line = str_replace("ส้ารวจ","สำรวจ",$line); +$line = str_replace("สารอง","สำรอง",$line); +$line = str_replace("สาเร็จ","สำเร็จ",$line); +$line = str_replace("ส่าเร็จ","สำเร็จ",$line); +$line = str_replace("สาเรนจ","สำเร็จ",$line); +$line = str_replace("สาโรง","สำโรง",$line); +$line = str_replace("สาหรับ","สำหรับ",$line); +$line = str_replace("ส่าหรับ","สำหรับ",$line); +$line = str_replace("ส้าหรับ","สำหรับ",$line); +$line = str_replace("สำกล","สากล",$line); +$line = str_replace("สำขำ","สาขา",$line); +$line = str_replace("ส้ำคัญ","สำคัญ",$line); +$line = str_replace("สำต้น","ลำต้น",$line); +$line = str_replace("สำธาร","ลำธาร",$line); +$line = str_replace("สำนกั ","สำนัก",$line); +$line = str_replace("สำนงำน","สานงาน",$line); +$line = str_replace("สำนักงำน","สำนักงาน",$line); +$line = str_replace("ส้ำนักงำน","สำนักงาน",$line); +$line = str_replace("สำมำรถ","สามารถ",$line); +$line = str_replace("สำยวิท","สายวิท",$line); +$line = str_replace("สำรสนเทศ","สารสนเทศ",$line); +$line = str_replace("สำหกรรม","สาหกรรม",$line); +$line = str_replace("สำหรับใข้ประกอบ","สำหรับใช้ประกอบ",$line); +$line = str_replace("สำหรับนาน้ำ","สำหรับนำน้ำ",$line); +$line = str_replace("สำเหตุ","สาเหตุ",$line); +$line = str_replace("สิ น","สิ้น",$line); +$line = str_replace("สิ ม่วง","สีม่วง",$line); +$line = str_replace("สิ'นาตาล","สีน้ำตาล",$line); +$line = str_replace("สิขาว","สีขาว",$line); +$line = str_replace("สิเขียว","สีเขียว",$line); +$line = str_replace("สิคลำ","สีคล้ำ",$line); +$line = str_replace("สิง􀃉 ","สิ่ง",$line); +$line = str_replace("สิง􀃉","สิ่ง",$line); +$line = str_replace("สิจาง","สีจาง",$line); +$line = str_replace("สิชมพู","สีชมพู",$line); +$line = str_replace("สิดำ","สีดำ",$line); +$line = str_replace("สิแดง","สีแดง",$line); +$line = str_replace("สิตเลอร์","ฮิตเลอร์",$line); +$line = str_replace("สิตเลอรึ","ฮิตเลอร์",$line); +$line = str_replace("สิเตาะ","สีเตาะ",$line); +$line = str_replace("สิทธิ้","สิทธิ์",$line); +$line = str_replace("สิทธ์ิ","สิทธิ์",$line); +$line = str_replace("สิทธิ้ขาด","สิทธิ์ขาด",$line); +$line = str_replace("สิทธิชั้นพื้นฐาน","สิทธิขั้นพื้นฐาน",$line); +$line = str_replace("สิทธิ์ทากิน","สิทธิ์ทำกิน",$line); +$line = str_replace("สิทธี้","สิทธิ์",$line); +$line = str_replace("สิเทา","สีเทา",$line); +$line = str_replace("สินค้ำ","สินค้า",$line); +$line = str_replace("สินเชื�อ","สินเชื่อ",$line); +$line = str_replace("สินเดนบูร์ก","ฮินเดนบูร์ก",$line); +$line = str_replace("สินพระชนม้","สิ้นพระชนม์",$line); +$line = str_replace("สินพระชนม์","สิ้นพระชนม์",$line); +$line = str_replace("สินวล","สีนวล",$line); +$line = str_replace("สินสุด","สิ้นสุด",$line); +$line = str_replace("สินํ้าเงิน","สีนํ้าเงิน",$line); +$line = str_replace("สินํ้าตาล","สีนํ้าตาล",$line); +$line = str_replace("สินาตาล","สีน้ำตาล",$line); +$line = str_replace("สิน้ำตาล","สีน้ำตาล",$line); +$line = str_replace("สินี่าตาล","สีน้ำตาล",$line); +$line = str_replace("สิน􀃊","สิ้น",$line); +$line = str_replace("สิฟ้น","สีฟ้น",$line); +$line = str_replace("สิม่วง","สีม่วง",$line); +$line = str_replace("สิย้อม","สีย้อม",$line); +$line = str_replace("สิส้ม","สีส้ม",$line); +$line = str_replace("สิเหลือง","สีเหลือง",$line); +$line = str_replace("สิออกนํ้าตาล","สีออกนํ้าตาล",$line); +$line = str_replace("สิอ่อน","สีอ่อน",$line); +$line = str_replace("สิ􀃉ง","สิ่ง",$line); +$line = str_replace("สิ􀃊น","สิ้น",$line); +$line = str_replace("สิ้􀃊น","สิ้น",$line); +$line = str_replace("สี เหลือง","สีเหลือง",$line); +$line = str_replace("สี,􀃉","สี่,",$line); +$line = str_replace("สี'เขียว","สีเขียว",$line); +$line = str_replace("สี'นาตาล","สีน้ำตาล",$line); +$line = str_replace("สี'นำเงิน","สีน้ำเงิน",$line); +$line = str_replace("สี’􀃉","สี่’",$line); +$line = str_replace("สี•นาตาล","สีน้ำตาล",$line); +$line = str_replace("สี■นาตาล","สีน้ำตาล",$line); +$line = str_replace("สีๆ/มพู","สีชมพู",$line); +$line = str_replace("สีขมพู","สีชมพู",$line); +$line = str_replace("สีขาวอม'นาตาล","สีขาวอมน้ำตาล",$line); +$line = str_replace("สีเขียวเฅลิอบ","สีเขียวเคลือบ",$line); +$line = str_replace("สีคลี้า","สีคล้ำ",$line); +$line = str_replace("สีชีดกว่า","สีซีดกว่า",$line); +$line = str_replace("สีดา","สีดำ",$line); +$line = str_replace("สีแดง อมต้ม","สีแดงอมส้ม",$line); +$line = str_replace("สีแดง อมล้ม","สีแดงอมส้ม",$line); +$line = str_replace("สีแตง","สีแดง",$line); +$line = str_replace("สีเทาอมนาตาล","สีเทาอมน้ำตาล",$line); +$line = str_replace("สีนั้าตาล","สีน้ำตาล",$line); +$line = str_replace("สีน้าเงิน","สีน้ำเงิน",$line); +$line = str_replace("สีนาตาล","สีน้ำตาล",$line); +$line = str_replace("สีน่าตาล","สีน้ำตาล",$line); +$line = str_replace("สีนํ๋าตาล","สีน้ำตาล",$line); +$line = str_replace("สีนํ้าตาลคลั่า","สีนํ้าตาลคล้ำ",$line); +$line = str_replace("สีนํ้าตาลคลำ","สีนํ้าตาลคล้ำ",$line); +$line = str_replace("สีนํ้าตาลคลื้า","สีนํ้าตาลคล้ำ",$line); +$line = str_replace("สีนํ้าตาลดลํ้า","สีนํ้าตาลคลํ้า",$line); +$line = str_replace("สีน้ำตาล อมเทา","สีน้ำตาลอมเทา",$line); +$line = str_replace("สีนำตาล","สีน้ำตาล",$line); +$line = str_replace("สีน้ำตาลแตง","สีน้ำตาลแดง",$line); +$line = str_replace("สีนิ้าตาล","สีน้ำตาล",$line); +$line = str_replace("สีนี่าเงิน","สีน้ำเงิน",$line); +$line = str_replace("สีนี่าตาล","สีน้ำตาล",$line); +$line = str_replace("สีนื้าเงิน","สีน้ำเงิน",$line); +$line = str_replace("สีนื้าตาล แดง","",$line); +$line = str_replace("สีม่วงคลิ้า","สีม่วงคล้ำ",$line); +$line = str_replace("สีม่วงแตง","สีม่วงแดง",$line); +$line = str_replace("สีล้ม","สีส้ม",$line); +$line = str_replace("สีสัม","สีส้ม",$line); +$line = str_replace("สีเหลี่ยม","สี่เหลี่ยม",$line); +$line = str_replace("สีเหลีอง","สีเหลือง",$line); +$line = str_replace("สีเหลืองลัม","สีเหลืองส้ม",$line); +$line = str_replace("สีเหลืองอมนำตาล","สีเหลืองอมน้ำตาล",$line); +$line = str_replace("สีแ􀃉 ","สี่แ",$line); +$line = str_replace("สึส้ม","สีส้ม",$line); +$line = str_replace("สืขาว","สีขาว",$line); +$line = str_replace("สืเข้ม","สีเข้ม",$line); +$line = str_replace("สืเขียว","สีเขียว",$line); +$line = str_replace("สืคล้ำ","สีคล้ำ",$line); +$line = str_replace("สืจาง","สีจาง",$line); +$line = str_replace("สืชมพู","สีชมพู",$line); +$line = str_replace("สืชีตง่าย","สีซีดง่าย",$line); +$line = str_replace("สืดำ","สีดำ",$line); +$line = str_replace("สืแดง","สีแดง",$line); +$line = str_replace("สืตำ","สีดำ",$line); +$line = str_replace("สืเทา","สีเทา",$line); +$line = str_replace("สืนํ้า","สีนํ้า",$line); +$line = str_replace("สืนํ๋าตาล","สีน้ำตาล",$line); +$line = str_replace("สืน้ำตาล","สีน้ำตาล",$line); +$line = str_replace("สืนี่าตาล","สีน้ำตาล",$line); +$line = str_replace("สืม่วง","สีม่วง",$line); +$line = str_replace("สืย้อม","สีย้อม",$line); +$line = str_replace("สืส้ม","สีส้ม",$line); +$line = str_replace("สื่เหลี่ยม","สี่เหลี่ยม",$line); +$line = str_replace("สืเหลีอง","สีเหลือง",$line); +$line = str_replace("สืเหลือง","สีเหลือง",$line); +$line = str_replace("สื่อ ความหมาย","สื่อความหมาย",$line); +$line = str_replace("สื่อ สัมพันธ์","สื่อสัมพันธ์",$line); +$line = str_replace("สื่อ สาร","สื่อสาร",$line); +$line = str_replace("สื่อ ให้เข้าใจ","สื่อให้เข้าใจ",$line); +$line = str_replace("สื่อสำร","สื่อสาร",$line); +$line = str_replace("สือ่อน","สีอ่อน",$line); +$line = str_replace("สือ􀃉 ","สื่อ",$line); +$line = str_replace("สื􀃉อ","สื่อ",$line); +$line = str_replace("สุกมีแตงตลื้า","สุกสีแดงคล้ำ",$line); +$line = str_replace("สุกลิน้ำตาล","สุกสีน้ำตาล",$line); +$line = str_replace("สุกลืแตง","สุกสีแดง",$line); +$line = str_replace("สุกลืล็ม","สุกสีส้ม",$line); +$line = str_replace("สุกสิส้ม","สุกสีส้ม",$line); +$line = str_replace("สุกสีตำ","สุกสีดำ",$line); +$line = str_replace("สุขภาพฟินตัว","สุขภาพฟื้นตัว",$line); +$line = str_replace("สุนทรพ จน์","สุนทรพจน์",$line); +$line = str_replace("สุมเสำ","สุมเส้า",$line); +$line = str_replace("สุราษฎร์ธานยี งั ","สุราษฎร์ธานียัง",$line); +$line = str_replace("สูการขยาย่","สู่การขยาย",$line); +$line = str_replace("สูเกาหลี่ ","สู่เกาหลี",$line); +$line = str_replace("สูคริ่ สต์","สู่คริสต์",$line); +$line = str_replace("สูงไต้","สูงได้",$line); +$line = str_replace("สูญหำย","สูญหาย",$line); +$line = str_replace("สูฐานแต่่ ","สู่ฐานแต่ ",$line); +$line = str_replace("สูด้่ าน","สู่ด้าน",$line); +$line = str_replace("สูบ้่ าน","สู่บ้าน",$line); +$line = str_replace("สูบนา","สูบน้ำ",$line); +$line = str_replace("สูบน้า","สูบน้ำ",$line); +$line = str_replace("สูบน้้า","สูบน้ำ",$line); +$line = str_replace("สูบนาดิบ","สูบน้ำดิบ",$line); +$line = str_replace("สูบนำ","สูบน้ำ",$line); +$line = str_replace("สูเพื่้ อ","สู้เพื่อ",$line); +$line = str_replace("สูแม่่ ","สู่แม่",$line); +$line = str_replace("สูร้ ","สู้ร",$line); +$line = str_replace("สูลาน่","สู่ลาน",$line); +$line = str_replace("สูห้ ","สู้ห",$line); +$line = str_replace("สูอวกาศในสมั่ ย","สู่อวกาศในสมัย",$line); +$line = str_replace("สูอาคาร่ ","สู่อาคาร",$line); +$line = str_replace("สูเ้","สู้เ",$line); +$line = str_replace("เสฉวนนาตาลี","เสฉวน นาตาลี",$line); +$line = str_replace("เสด็จ สวรรคต","เสด็จสวรรคต",$line); +$line = str_replace("เสน้ ","เส้น",$line); +$line = str_replace("เสน้บรรทัด","เส้นบรรทัด",$line); +$line = str_replace("เสน้เสียง","เส้นเสียง",$line); +$line = str_replace("เสรนจ","เสร็จ",$line); +$line = str_replace("เสริมกำร","เสริมการ",$line); +$line = str_replace("เสันแขนง","เส้นแขนง",$line); +$line = str_replace("เสันผ่านศูนย์กลาง","เส้นผ่านศูนย์กลาง",$line); +$line = str_replace("เสันรอบวง","เส้นรอบวง",$line); +$line = str_replace("เสาค้ายัน","เสาค้ำยัน",$line); +$line = str_replace("เสำเกสร","เส้าเกสร",$line); +$line = str_replace("เสียง สนับสนุน","เสียงสนับสนุน",$line); +$line = str_replace("เสียงช้างมาก","เสียงข้างมาก",$line); +$line = str_replace("เสียงต่ำ ลง","เสียงต่ำลง",$line); +$line = str_replace("เสียงต่ำ ลึก","เสียงต่ำลึก",$line); +$line = str_replace("เสียงต่ำ สุด","เสียงต่ำสุด",$line); +$line = str_replace("เสียงอยู่ใกลัก้น","เสียงอยู่ใกล้กัน",$line); +$line = str_replace("เสียซีรีต","เสียชีวิต",$line); +$line = str_replace("เสียซีวิด","เสียชีวิด",$line); +$line = str_replace("เสียวเครือ","เสี้ยวเครือ",$line); +$line = str_replace("เสียหำย","เสียหาย",$line); +$line = str_replace("เสือกตั้ง","เลือกตั้ง",$line); +$line = str_replace("เสื􀃊อ","เสื้อ",$line); +$line = str_replace("แสดงฟิมึอ","แสดงฝีมือ",$line); +$line = str_replace("แสตมป้","แสตมป์",$line); +$line = str_replace("ไสอ้ ","ไส้อ",$line); +$line = str_replace("หค้ ","ห้ค",$line); +$line = str_replace("หญ้ำ","หญ้า",$line); +$line = str_replace("หน่งึ","หนึ่ง",$line); +$line = str_replace("หนว่ ย","หน่วย",$line); +$line = str_replace("หน่วยงำน","หน่วยงาน",$line); +$line = str_replace("หน่วยน้า","หน่วยน้ำ",$line); +$line = str_replace("หนองน้าขาว","หนองน้ำขาว",$line); +$line = str_replace("หนองบัวลาภู","หนองบัวลำภู",$line); +$line = str_replace("หนังลือ","หนังสือ",$line); +$line = str_replace("หนังสือ เดินทาง","หนังสือเดินทาง",$line); +$line = str_replace("หนังสือคาประกัน","หนังสือค้ำประกัน",$line); +$line = str_replace("หนา้ ","หน้า",$line); +$line = str_replace("หนา้","หน้า",$line); +$line = str_replace("หน้างำน","หน้างาน",$line); +$line = str_replace("หนามสํนๆ","หนามสั้น ๆ",$line); +$line = str_replace("หนามสัน","หนามสั้น",$line); +$line = str_replace("หน้ำ","หน้า",$line); +$line = str_replace("หน้ำที่","หน้าที่",$line); +$line = str_replace("หนำมาก","หน้ามาก",$line); +$line = str_replace("หนี่ สิน","หนี้สิน",$line); +$line = str_replace("หนี่สิน","หนี้สิน",$line); +$line = str_replace("หนี�","หนี้",$line); +$line = str_replace("หนึงเท่่ า","หนึ่งเท่า",$line); +$line = str_replace("หนึง􀃉 ","หนึ่ง",$line); +$line = str_replace("หนึง􀃉","หนึ่ง",$line); +$line = str_replace("หนึ􀃉ง","หนึ่ง",$line); +$line = str_replace("หผ้ ","ห้ผ",$line); +$line = str_replace("หมนั􀃉 ","หมั่น",$line); +$line = str_replace("หมอ้ ","หม้อ",$line); +$line = str_replace("หมักน้ายาง","หมักน้ำยาง",$line); +$line = str_replace("หมายเลขดาที่","หมายเลขดำที่",$line); +$line = str_replace("หมำย","หมาย",$line); +$line = str_replace("หมิน􀃉 ","หมิ่น",$line); +$line = str_replace("หมูเกาะอั่ งกฤษ","หมู่เกาะอังกฤษ",$line); +$line = str_replace("หมูบ้่ าน","หมู่บ้าน",$line); +$line = str_replace("หมู่บ้ำน","หมู่บ้าน",$line); +$line = str_replace("หยักซีฟ้น","หยักซี่ฟัน",$line); +$line = str_replace("หรีอ","หรือ",$line); +$line = str_replace("หรื'อ","หรือ",$line); +$line = str_replace("หรือ เป็น","หรือเป็น",$line); +$line = str_replace("หรือ รูปไข่","หรือรูปไข่",$line); +$line = str_replace("หรือ แหลม","หรือแหลม",$line); +$line = str_replace("หรือถึนวล","หรือสีนวล",$line); +$line = str_replace("หรือท้าเป็น","หรือทำเป็น",$line); +$line = str_replace("หรือนา","หรือนำ",$line); +$line = str_replace("หรือน่าไปใช้","หรือนำไปใช้",$line); +$line = str_replace("หรือลำออก","หรือลาออก",$line); +$line = str_replace("หลๆยป็","หลายปี",$line); +$line = str_replace("หลงั ","หลัง",$line); +$line = str_replace("หลนั􀃉","หลั่น",$line); +$line = str_replace("หลอดตี้น","หลอดตื้น",$line); +$line = str_replace("หลอดลั่น","หลอดสั้น",$line); +$line = str_replace("หลอดลั้นๆ","หลอดสั้นๆ",$line); +$line = str_replace("หลอดสัน","หลอดสั้น",$line); +$line = str_replace("หลอต","หลอด",$line); +$line = str_replace("หลัง แต่งงาน","หลังแต่งงาน",$line); +$line = str_replace("หลังจากบั้น","หลังจากนั้น",$line); +$line = str_replace("หลัน􀃉","หลั่น",$line); +$line = str_replace("หลำกหลำย","หลากหลาย",$line); +$line = str_replace("หลำยพื้น","หลายพื้น",$line); +$line = str_replace("หลำยแห่ง","หลายแห่ง",$line); +$line = str_replace("หลี 􀃉","หลี่",$line); +$line = str_replace("หลี’􀃉","หลี่’",$line); +$line = str_replace("หลุด ร่วง","หลุดร่วง",$line); +$line = str_replace("หลุยส์ ฟิสีป","หลุยส์ ฟิลิป",$line); +$line = str_replace("ห้วยน้าทรง","ห้วยน้ำทรง",$line); +$line = str_replace("หวั ","หัว",$line); +$line = str_replace("หวี 􀃉","หวี่",$line); +$line = str_replace("หวีไ􀃉 ","หวี่ไ",$line); +$line = str_replace("หอ้ ","ห้อ ",$line); +$line = str_replace("หอ้ ","ห้อ",$line); +$line = str_replace("หอ จดหมายเหตุ","หอจดหมายเหตุ",$line); +$line = str_replace("หอคิลป็","หอศิลป์",$line); +$line = str_replace("ห้องน้า","ห้องน้ำ",$line); +$line = str_replace("ห้องน้่า","ห้องน้ำ",$line); +$line = str_replace("หัน􀃉 ","หั่น",$line); +$line = str_replace("หากนาเส้น","หากนำเส้น",$line); +$line = str_replace("หาน้้า","หาน้ำ",$line); +$line = str_replace("หำกเกษตร","หากเกษตร",$line); +$line = str_replace("หำกจังหวัด","หากจังหวัด",$line); +$line = str_replace("หำกประสงค์ ","หากประสงค์ ",$line); +$line = str_replace("หำกประสงค์","หากประสงค์",$line); +$line = str_replace("หำกมี","หากมี",$line); +$line = str_replace("หำกไม่","หากไม่",$line); +$line = str_replace("หำกสามารถ","หากสามารถ",$line); +$line = str_replace("หำกเห็น","หากเห็น",$line); +$line = str_replace("หำช่อง","หาช่อง",$line); +$line = str_replace("หำผู้มี","หาผู้มี",$line); +$line = str_replace("หุ้เขียน","ผู้เขียน",$line); +$line = str_replace("หุเใบ","หูใบ",$line); +$line = str_replace("หู่ใบรูป","หูใบรูป",$line); +$line = str_replace("เหง้าล้นหนา","เหง้าสั้นหนา",$line); +$line = str_replace("เหง้าสันหนา","เหง้าสั้นหนา",$line); +$line = str_replace("เหตสุ ่วนหน่งึ","เหตุส่วนหนึ่ง",$line); +$line = str_replace("เหตุราคาญ","เหตุรำคาญ",$line); +$line = str_replace("เห็นซัด","เห็นชัด",$line); +$line = str_replace("เหนน","เห็น",$line); +$line = str_replace("เห็นไม่ข้'ต","เห็นไม่ชัด",$line); +$line = str_replace("เห็นไม่ซัด","เห็นไม่ชัด",$line); +$line = str_replace("เห็นว่ำ","เห็นว่า",$line); +$line = str_replace("เหนีอ","เหนือ",$line); +$line = str_replace("เหนือ􀃉 ","เหนื่อ",$line); +$line = str_replace("เหมาลา","เหมาลำ",$line); +$line = str_replace("เหมำะสม","เหมาะสม",$line); +$line = str_replace("เหรีย􀃉 ","เหรี่ย",$line); +$line = str_replace("เหล็กค้ายัน","เหล็กค้ำยัน",$line); +$line = str_replace("เหลนก","เหล็ก",$line); +$line = str_replace("เหล่านี ","เหล่านี้",$line); +$line = str_replace("เหล่านี่","เหล่านี้",$line); +$line = str_replace("เหลิ'อง","เหลือง",$line); +$line = str_replace("เหลีย􀃉 ","เหลี่ย",$line); +$line = str_replace("เหลีย􀃉 ม ","เหลี่ยม",$line); +$line = str_replace("เหลี􀃉ย","เหลี่ย",$line); +$line = str_replace("เหลืองมแนาว","เหลืองมะนาว",$line); +$line = str_replace("เหลือทา","เหลือทำ",$line); +$line = str_replace("เหลื่อมลา","เหลื่อมล้ำ",$line); +$line = str_replace("เหลื่อมล้า","เหลื่อมล้ำ",$line); +$line = str_replace("เหลื่อมล้้า","เหลื่อมล้ำ",$line); +$line = str_replace("เหลือ􀃉 ","เหลื่อ",$line); +$line = str_replace("เหลื􀃉","เหลื่",$line); +$line = str_replace("แหง้ ","แห้ง",$line); +$line = str_replace("แห่งชาดิ","แห่งชาติ",$line); +$line = str_replace("แห่งชาดิยิว","แห่งชาติยิว",$line); +$line = str_replace("แห่งชำติ","แห่งชาติ",$line); +$line = str_replace("แหล่งนา ","แหล่งน้ำ ",$line); +$line = str_replace("แหล่งน้า","แหล่งน้ำ",$line); +$line = str_replace("แหล่งน้้า","แหล่งน้ำ",$line); +$line = str_replace("แหล่งนาดิบ","แหล่งน้ำดิบ",$line); +$line = str_replace("แหล่งนาเดิม ","แหล่งน้ำเดิม ",$line); +$line = str_replace("แหล่งนาสาธารณะ","แหล่งน้ำสาธารณะ",$line); +$line = str_replace("แหล่งพักนา","แหล่งพักน้ำ",$line); +$line = str_replace("แหลมล้น","แหลมสั้น",$line); +$line = str_replace("แหลมสัน","แหลมสั้น",$line); +$line = str_replace("ให ้","ให้",$line); +$line = str_replace("ให้ การ","ให้การ",$line); +$line = str_replace("ให้ มี","ให้มี",$line); +$line = str_replace("ให,้","ให้,",$line); +$line = str_replace("ใหก้ ","ให้ก",$line); +$line = str_replace("ให้กำร","ให้การ",$line); +$line = str_replace("ใหข้ ","ให้ข",$line); +$line = str_replace("ใหคู้่","ให้คู่",$line); +$line = str_replace("ใหจ้ ","ให้จ",$line); +$line = str_replace("ใหฉั้น","ให้ฉัน",$line); +$line = str_replace("ใหช้ ","ให้ช",$line); +$line = str_replace("ใหชั้ดเจน","ให้ชัดเจน",$line); +$line = str_replace("ให้เช้าทำงาน","ให้เข้าทำงาน",$line); +$line = str_replace("ใหญ","ใหญ่",$line); +$line = str_replace("ใหญ่่","ใหญ่",$line); +$line = str_replace("ใหญ่สุต","ใหญ่สุด",$line); +$line = str_replace("ใหฐ้ ","ให้ฐ",$line); +$line = str_replace("ใหด้ ","ให้ด",$line); +$line = str_replace("ใหดี้","ให้ดี",$line); +$line = str_replace("ใหต้ ","ให้ต",$line); +$line = str_replace("ใหตั้ว","ให้ตัว",$line); +$line = str_replace("ใหถ้ ","ให้ถ",$line); +$line = str_replace("ใหท้ ","ให้ท",$line); +$line = str_replace("ใหทั้","ให้ทั",$line); +$line = str_replace("ให้ท้า","ให้ทำ",$line); +$line = str_replace("ใหธ้ ","ให้ธ",$line); +$line = str_replace("ใหน้ ","ให้น",$line); +$line = str_replace("ใหนั้กเรียน","ให้นักเรียน",$line); +$line = str_replace("ให้น้า","ให้น้ำ",$line); +$line = str_replace("ให้น้้า","ให้น้ำ",$line); +$line = str_replace("ให้นาถัง","ให้นำถัง",$line); +$line = str_replace("ให้นาผู้","ให้นำผู้",$line); +$line = str_replace("ให้น่าสัญญา","ให้นำสัญญา",$line); +$line = str_replace("ให้น้้าสามารถ","ให้น้ำสามารถ",$line); +$line = str_replace("ให้นาสามารถไหล","ให้น้ำสามารถไหล",$line); +$line = str_replace("ให้น้ำข้อ","ให้นำข้อ",$line); +$line = str_replace("ให้นี่าเหลือง","ให้น้ำเหลือง",$line); +$line = str_replace("ใหนุ้่","ให้นุ่",$line); +$line = str_replace("ใหบ้ ","ให้บ",$line); +$line = str_replace("ใหบุ้พบท","ให้บุพบท",$line); +$line = str_replace("ใหป้ ","ให้ป",$line); +$line = str_replace("ใหผู้","ให้ผู",$line); +$line = str_replace("ใหฝ้ ","ให้ฝ",$line); +$line = str_replace("ใหพ้ ","ให้พ",$line); +$line = str_replace("ใหภ้ ","ให้ภ",$line); +$line = str_replace("ใหม้ ","ให้ม",$line); +$line = str_replace("ใหม","ใหม่",$line); +$line = str_replace("ใหม่่","ใหม่",$line); +$line = str_replace("ใหมี้","ให้มี",$line); +$line = str_replace("ใหมี้ความหมาย","ให้มีความหมาย",$line); +$line = str_replace("ใหม","ใหม่",$line); +$line = str_replace("ใหย้ ","ให้ย",$line); +$line = str_replace("ใหยึ้ด","ให้ยึด",$line); +$line = str_replace("ใหร้ ","ให้ร",$line); +$line = str_replace("ใหรู้้","ให้รู้",$line); +$line = str_replace("ใหรู้ป","ให้รูป",$line); +$line = str_replace("ใหรู้ลั้กษณะ","ให้รู้ลักษณะ",$line); +$line = str_replace("ใหล้ ","ให้ล",$line); +$line = str_replace("ใหลั้กษณ์","ให้ลักษณ์",$line); +$line = str_replace("ใหลิ้","ให้ลิ",$line); +$line = str_replace("ให้ลิทธิ้","ให้สิทธิ์",$line); +$line = str_replace("ใหลู้ก","ให้ลูก",$line); +$line = str_replace("ใหว้ ","ให้ว",$line); +$line = str_replace("ใหส้ ","ให้ส",$line); +$line = str_replace("ใหสั้","ให้สั",$line); +$line = str_replace("ใหสั้น􀃉 ","ให้สั้น",$line); +$line = str_replace("ใหสื้","ให้สื",$line); +$line = str_replace("ใหสู้ง","ให้สูง",$line); +$line = str_replace("ใหห้ ","ให้ห",$line); +$line = str_replace("ใหอิ้สระ","ให้อิสระ",$line); +$line = str_replace("ใหอี้ก","ให้อีก",$line); +$line = str_replace("ใหเ้","ให้เ",$line); +$line = str_replace("ใหแ้ ","ให้แ",$line); +$line = str_replace("ใหไ้ ","ให้ไ",$line); +$line = str_replace("ให้ ","ให้",$line); +$line = str_replace("องค์การ ท้องถิ่น","องค์การท้องถิ่น",$line); +$line = str_replace("องั ","อัง",$line); +$line = str_replace("อดอส์ฟ ฮิตเลอร์","อดอล์ฟ ฮิตเลอร์",$line); +$line = str_replace("อนั ","อัน",$line); +$line = str_replace("อนำคต","อนาคต",$line); +$line = str_replace("อนึง􀃉 ","อนึ่ง",$line); +$line = str_replace("อนึ􀃉ง ","อนึ่ง",$line); +$line = str_replace("อ่นื ","อื่น",$line); +$line = str_replace("อนุเคราะห์นาดิน","อนุเคราะห์นำดิน",$line); +$line = str_replace("อนุญาตทา","อนุญาตทำ",$line); +$line = str_replace("อนุญำต","อนุญาต",$line); +$line = str_replace("อบอุน่ ","อบอุ่น",$line); +$line = str_replace("อพยพเช้าเมือง","อพยพเข้าเมือง",$line); +$line = str_replace("อภิสิทธิ้","อภิสิทธิ์",$line); +$line = str_replace("อภิสิทธึ้","อภิสิทธิ์",$line); +$line = str_replace("อมนำตาล","อมน้ำตาล",$line); +$line = str_replace("อมเหสีอง","อมเหลือง",$line); +$line = str_replace("อย่รู ะ","อยู่ระ",$line); +$line = str_replace("อย่าง ไม่เป็นทางการ","อย่างไม่เป็นทางการ",$line); +$line = str_replace("อย่าง ละเอียด","อย่างละเอียด",$line); +$line = str_replace("อย่างเป็ดเสร็จ","อย่างเบ็ดเสร็จ",$line); +$line = str_replace("อย่างไร ก็ดี","อย่างไรก็ดี",$line); +$line = str_replace("อย่างไร ก็ตาม","อย่างไรก็ตาม",$line); +$line = str_replace("อย่ำง","อย่าง",$line); +$line = str_replace("อย่ำงคุ้ม","อย่างคุ้ม",$line); +$line = str_replace("อย่ำงต่อ","อย่างต่อ",$line); +$line = str_replace("อย่ำงน้อย","อย่างน้อย",$line); +$line = str_replace("อย่ำงเป็น","อย่างเป็น",$line); +$line = str_replace("อย่ำงมี","อย่างมี",$line); +$line = str_replace("อย่ำงยั่งยืน","อย่างยั่งยืน",$line); +$line = str_replace("อย่ำงสูงสุด","อย่างสูงสุด",$line); +$line = str_replace("อยู ่","อยู่",$line); +$line = str_replace("อยูกว่่ า","อยู่กว่า",$line); +$line = str_replace("อยูของเจ้่ า","อยู่ของเจ้า",$line); +$line = str_replace("อยูจนทุ่ ก ","อยู่จนทุก",$line); +$line = str_replace("อยู่ชันใน","อยู่ชั้นใน",$line); +$line = str_replace("อยูด้่ าน","อยู่ด้าน",$line); +$line = str_replace("อยูใด้วง","อยู่ใต้วง",$line); +$line = str_replace("อยูได้่","อยู่ได้",$line); +$line = str_replace("อยูตรง่ ","อยู่ตรง",$line); +$line = str_replace("อยูตรงกลาง่ ","อยู่ตรงกลาง",$line); +$line = str_replace("อยูตรงกลางมี่ ","อยู่ตรงกลางมี",$line); +$line = str_replace("อยูใต้่ ดิน","อยุ่ใต้ดิน",$line); +$line = str_replace("อยูทั่่ ว","อยู่ทั่ว",$line); +$line = str_replace("อยูทางทิ่ ศ","อยู่ทางทิศ",$line); +$line = str_replace("อยูที่่","อยู่ที่",$line); +$line = str_replace("อยู่ที่นี้","อยู่ที่นี่",$line); +$line = str_replace("อยูในกรุ่ ง","อยู่ในกรุง",$line); +$line = str_replace("อยูในซอก","อยู่ในซอก",$line); +$line = str_replace("อยูในดิ่ น","อยู่ในดิน",$line); +$line = str_replace("อยูในบริ่ เวณ","อยู่ในบริเวณ",$line); +$line = str_replace("อยูในระดั่ บ","อยู่ในระดับ",$line); +$line = str_replace("อยูในสมั่ ย","อยู่ในสมัย",$line); +$line = str_replace("อยูในสุ่ สาน","อยู่ในสุสาร",$line); +$line = str_replace("อยูบนลาน่","อยู่บนลาน",$line); +$line = str_replace("อยูภายใต้่ ","อยู่ภายใต้",$line); +$line = str_replace("อยูมาก่","อยู่มาก",$line); +$line = str_replace("อยูรวมกั่ น","อยุ่ร่วมกัน",$line); +$line = str_replace("อยูระหว่่ าง","อยู่ระหว่าง",$line); +$line = str_replace("อยู่สกงาน","อยู่ฝึกงาน",$line); +$line = str_replace("อยูอาศั่ ย","อยู่อาศัย",$line); +$line = str_replace("อย่ใู น","อยู่ใน",$line); +$line = str_replace("อ้ลฟอนโซ","อัลฟอนโซ",$line); +$line = str_replace("อว้ ","อ้ว",$line); +$line = str_replace("อ้วนสัน","อ้วนสั้น",$line); +$line = str_replace("อวบนา","อวบน้ำ",$line); +$line = str_replace("อวบนื้า","อวบน้ำ",$line); +$line = str_replace("ออ้ ","อ้อ",$line); +$line = str_replace("ออ้ ม","อ้อม",$line); +$line = str_replace("ออกคอก","ออกดอก",$line); +$line = str_replace("ออกตอก","ออกดอก",$line); +$line = str_replace("ออกเตี่ยว","ออกเดี่ยว",$line); +$line = str_replace("อองรี-ฟิดิป","อองรี-ฟิลิป",$line); +$line = str_replace("ออจุล","ออวุล",$line); +$line = str_replace("ออรุล","ออวุล",$line); +$line = str_replace("ออรูล","ออวุล",$line); +$line = str_replace("ออสเตนต์","ออสเตนด์",$line); +$line = str_replace("ออๅล","ออวุล",$line); +$line = str_replace("อะบิสฃิเนีย","อะบิสซิเนีย",$line); +$line = str_replace("อะลุ้มอส่วย","อะลุ้มอล่วย",$line); +$line = str_replace("อะเล็กชานเดอร์","อะเล็กซานเดอร์",$line); +$line = str_replace("อัตราการสั้น","อัตราการสั่น",$line); +$line = str_replace("อัตราการสั้นช้า","อัตราการสั่นช้า",$line); +$line = str_replace("อัตรากำร","อัตราการ",$line); +$line = str_replace("อัตรำ","อัตรา",$line); +$line = str_replace("อับ เรณู","อับเรณู",$line); +$line = str_replace("อับเรกุ}","อับเรณู",$line); +$line = str_replace("อับเรกุ}เล็ก","อับเรณูเล็ก",$line); +$line = str_replace("อับเรญ","อับเรณู",$line); +$line = str_replace("อับเรณู่","อับเรณู",$line); +$line = str_replace("อับเรณูส้น","อับเรณูสั้น",$line); +$line = str_replace("อับเรณูส้นมาก","อับเรณูส้้นมาก",$line); +$line = str_replace("อัพเพอร้ชวาเบีย","อัพเพอร์ชวาเบีย",$line); +$line = str_replace("อ่างน้าพุ","อ่างน้ำพุ",$line); +$line = str_replace("อาจท้า","อาจทำ",$line); +$line = str_replace("อาจนายาง","อาจนำยาง",$line); +$line = str_replace("อาจารยข์ องฉัน","อาจารย์ของฉัน",$line); +$line = str_replace("อาจารยค์","อาจารย์ค",$line); +$line = str_replace("อาชีพทานา","อาชีพทำนา",$line); +$line = str_replace("อาชีพทาผ้า","อาชีพทำผ้า",$line); +$line = str_replace("อานวย","อำนวย",$line); +$line = str_replace("อ้านวย","อำนวย",$line); +$line = str_replace("อานาจ","อำนาจ",$line); +$line = str_replace("อ่านาจ","อำนาจ",$line); +$line = str_replace("อ้านาจ","อำนาจ",$line); +$line = str_replace("อาบน้า","อาบน้ำ",$line); +$line = str_replace("อาบนาแร่","อาบน้ำแร่",$line); +$line = str_replace("อาเภอ","อำเภอ",$line); +$line = str_replace("อ่าเภอ","อำเภอ",$line); +$line = str_replace("อ้าเภอ","อำเภอ",$line); +$line = str_replace("อายุคารับ","อายุคำรับ",$line); +$line = str_replace("อารมณ์ชัน","อารมณ์ขัน",$line); +$line = str_replace("อาวุธ ยุทโธปกรณ์","อาวุธยุทโธปกรณ์",$line); +$line = str_replace("อาศัยน้าฝน","อาศัยน้ำฝน",$line); +$line = str_replace("อำคำร","อาคาร",$line); +$line = str_replace("อำจขำด","อาจขาด",$line); +$line = str_replace("อำจจะ","อาจจะ",$line); +$line = str_replace("อำจทำ","อาจทำ",$line); +$line = str_replace("อำจเป็น","อาจเป็น",$line); +$line = str_replace("อำจไม่","อาจไม่",$line); +$line = str_replace("อำจำรย์","อาจารย์",$line); +$line = str_replace("อำชีพ","อาชีพ",$line); +$line = str_replace("อำชีว","อาชีว",$line); +$line = str_replace("อำทิตย์","อาทิตย์",$line); +$line = str_replace("อำนาจ พิพากษา","อำนาจพิพากษา",$line); +$line = str_replace("อำนำจ","อำนาจ",$line); +$line = str_replace("อ้ำนำจ","อำนาจ",$line); +$line = str_replace("อำเภอคา","อำเภอคำ",$line); +$line = str_replace("อำเภอน้ายืน","อำเภอน้ำยืน",$line); +$line = str_replace("อำเภอน้าโสม","อำเภอน้ำโสม",$line); +$line = str_replace("อำยุ","อายุ",$line); +$line = str_replace("อำศัย","อาศัย",$line); +$line = str_replace("อำหำร","อาหาร",$line); +$line = str_replace("อำ􀃊 ","อ้ำ",$line); +$line = str_replace("อิงอาภัย","อิงอาศัย",$line); +$line = str_replace("อินเดนนูร์ก","ฮินเดนนูร์ก",$line); +$line = str_replace("อินโดนีเชีย","อินโดนีเซีย",$line); +$line = str_replace("อินโตจีน","อินโดจีน",$line); +$line = str_replace("อินโตนีเซีย","อินโดนีเซีย",$line); +$line = str_replace("อิมพีเรืยล","อิมพีเรียล",$line); +$line = str_replace("อิม􀃉","อิ่ม",$line); +$line = str_replace("อีสระ","อิสระ",$line); +$line = str_replace("อี􀃊 ","อี้",$line); +$line = str_replace("อี􀃊","อี่",$line); +$line = str_replace("อึ􀃊ง","อึ้ง",$line); +$line = str_replace("อืน􀃉 ","อื่น",$line); +$line = str_replace("อืน􀃉","อื่น",$line); +$line = str_replace("อื􀃉น ","อื่น",$line); +$line = str_replace("อื􀃉น","อื่น",$line); +$line = str_replace("อื�น","อื่น",$line); +$line = str_replace("อุณหภูมิของน้า","อุณหภูมิของน้ำ",$line); +$line = str_replace("อุตรดิตถ์นาโครงการ","อุตรดิตถ์นำโครงการ",$line); +$line = str_replace("อุปลัก ","อุปลัก",$line); +$line = str_replace("อุ้มน้า","อุ้มน้ำ",$line); +$line = str_replace("เอก้ ","เอ้ก",$line); +$line = str_replace("เอกสำร","เอกสาร",$line); +$line = str_replace("เอดูอาร์ต","เอดูอาร์ด",$line); +$line = str_replace("เอมเมอสีน","เอมเมอลีน",$line); +$line = str_replace("เออ้ ","เอ้อ",$line); +$line = str_replace("เอื อ","เอื้อ",$line); +$line = str_replace("เอื􀃊อ","เอื้อ",$line); +$line = str_replace("แอข้ ","แอ้ข",$line); +$line = str_replace("แอ่งน้า","แอ่งน้ำ",$line); +$line = str_replace("แอฟริกา เหนือ","แอฟริกาเหนือ",$line); +$line = str_replace("แอฟรีกา","แอฟริกา",$line); +$line = str_replace("แอฟรีกาเหนือ","แอฟริกาเหนือ",$line); +$line = str_replace("โอกำส","โอกาส",$line); +$line = str_replace("โออีอี ซี ","โออีอีซี",$line); +$line = str_replace("ไอน้่า","ไอน้ำ",$line); +$line = str_replace("ไอร์ แล นด์","ไอร์แลนด์",$line); +$line = str_replace("ไอร์แลนด","ไอร์แลนด์",$line); +$line = str_replace("ไอร์แลนด์์","ไอร์แลนด์",$line); +$line = str_replace("ไอห้ ","ไอ้ห",$line); +$line = str_replace("ฮิตเลอร็","ฮิตเลอร์",$line); +$line = str_replace("ฮิตเลอร้","ฮิตเลอร์",$line); +$line = str_replace("ฮิตเลอรี","ฮิตเลอร์",$line); +$line = str_replace("ฮิตเลอรึ","ฮิตเลอร์",$line); +$line = str_replace("เฮย้","เฮ้ย",$line); +$line = str_replace("ะกำศ","ะกาศ",$line); +$line = str_replace("า้ ","้า",$line); +$line = str_replace("้า ","้า",$line); +$line = str_replace("า้","้า",$line); +$line = str_replace("าน้าองค์","านำองค์",$line); +$line = str_replace("เ ","เ",$line); +$line = str_replace("เ พิง􀃉 ","เพิ่ง",$line); +$line = str_replace("เ ริม􀃉","เริ่ม",$line); +$line = str_replace("เ้","้เ",$line); +$line = str_replace("แ้ ","้แ",$line); +$line = str_replace("แ ต","แต่",$line); +$line = str_replace("โ้ ","้โ",$line); +$line = str_replace("ใ้ ","้ใ",$line); +$line = str_replace("ไ้ ","้ไ",$line); +$line = str_replace("ไ ด้","ได้",$line); +$line = str_replace("","^",$line); +$line = str_replace("ซึ่ ง","ซึ่ง",$line); +$line = str_replace("ออ กเสียง","ออกเสียง",$line); +$line = str_replace("อ นุมัติ","อนุมัติ",$line); +$line = str_replace("ดำเนิ น","ดำเนิน",$line); \ No newline at end of file diff --git a/src/data/scripts/merge_pdf/test_files/bcp.pdf b/src/data/scripts/merge_pdf/test_files/bcp.pdf new file mode 100644 index 0000000..b98dd70 Binary files /dev/null and b/src/data/scripts/merge_pdf/test_files/bcp.pdf differ diff --git a/src/data/scripts/merge_pdf/test_files/bcp2.pdf b/src/data/scripts/merge_pdf/test_files/bcp2.pdf new file mode 100644 index 0000000..b75109d Binary files /dev/null and b/src/data/scripts/merge_pdf/test_files/bcp2.pdf differ diff --git a/src/data/scripts/merge_pdf/test_files/kbank.pdf b/src/data/scripts/merge_pdf/test_files/kbank.pdf new file mode 100644 index 0000000..e03ad89 Binary files /dev/null and b/src/data/scripts/merge_pdf/test_files/kbank.pdf differ diff --git a/src/data/scripts/merge_pdf/test_files/ptt.pdf b/src/data/scripts/merge_pdf/test_files/ptt.pdf new file mode 100644 index 0000000..2e9d761 Binary files /dev/null and b/src/data/scripts/merge_pdf/test_files/ptt.pdf differ diff --git a/src/data/scripts/merge_pdf/test_files/tu.pdf b/src/data/scripts/merge_pdf/test_files/tu.pdf new file mode 100644 index 0000000..67607b2 Binary files /dev/null and b/src/data/scripts/merge_pdf/test_files/tu.pdf differ diff --git a/src/data/scripts/merge_pdf/test_merge_pdf.ipynb b/src/data/scripts/merge_pdf/test_merge_pdf.ipynb new file mode 100644 index 0000000..cab5b8c --- /dev/null +++ b/src/data/scripts/merge_pdf/test_merge_pdf.ipynb @@ -0,0 +1,1237 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install PyPDF2\n", + "# !pip install pdf-table2json\n", + "# !pip install difflib" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# import os\n", + "import pandas as pd\n", + "import PyPDF2\n", + "import pdf_table2json.converter as converter\n", + "from difflib import SequenceMatcher\n", + "import re\n", + "# import numpy as np\n", + "# import statistics\n", + "# import math" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def convert_correction_rules(filepath):\n", + " \"\"\"\n", + " Description:\n", + " Convert pdf_correction_rules.txt to \n", + " list of tuples (wrong, right). \n", + " This list will be used for correcting pdf-converted text.\n", + " Args:\n", + " filepath: string of file path.\n", + " Returns:\n", + " replace_list: List of tuples (incorrect_format , correct_format).\n", + " \"\"\"\n", + "\n", + " with open(filepath) as f:\n", + " lines = f.readlines()\n", + "\n", + " replace_list = [eval(t.strip().replace(\"$line = str_replace\",\"\").replace(',$line','')[:-1]) for t in lines]\n", + " return replace_list\n", + "\n", + "\n", + "def read_pdf_all_pages(pdf_file):\n", + " \"\"\"\n", + " Description:\n", + " Read all texts in every page of pdf file and return as string\n", + " Require PyPDF2\n", + " Args:\n", + " pdf_file: string of pdf file path.\n", + " Returns:\n", + " read_text: string.\n", + " \"\"\"\n", + "\n", + " reader = PyPDF2.PdfReader(pdf_file)\n", + " page_count = len(reader.pages)\n", + " read_text = [reader.pages[i].extract_text() for i in range(page_count)]\n", + " read_text = \"\".join(map(str , read_text))\n", + " return read_text\n", + "\n", + "\n", + "def clean_dup_esc_char(str_text):\n", + " \"\"\"\n", + " Description:\n", + " Reduce duplicated escape characters into one\n", + " Args:\n", + " str_text: string.\n", + " Returns:\n", + " clean_dup: string.\n", + " \"\"\"\n", + " \n", + " clean_dup = re.sub(r'(\\W)\\1+', r'\\1', str_text)\n", + " return clean_dup\n", + "\n", + "\n", + "def clean_by_rules(str_text, rules_filepath):\n", + " \"\"\"\n", + " Description:\n", + " Clean input text that contain incorrect word structure by replacing with \n", + " list of correct word structure which is written in pdf_correction_rules.txt\n", + " as php format.\n", + " Args:\n", + " str_text: input string.\n", + " rule_filepath: string of file path\n", + " Returns:\n", + " str_text: clean string.\n", + " \"\"\"\n", + "\n", + " replace_list = convert_correction_rules(rules_filepath)\n", + "\n", + " for tu in replace_list:\n", + " str_text = str_text.replace(tu[0],tu[1])\n", + "\n", + " return str_text\n", + "\n", + "\n", + "def whitespace_ratio(text):\n", + " \"\"\"\n", + " Description:\n", + " Calculate ratio of whitespace in text\n", + " Args:\n", + " text: input string.\n", + " Returns:\n", + " whitespace ratio: float.\n", + " \"\"\"\n", + " \n", + " if len(text) == 0:\n", + " return 0\n", + " return len(text.split(' '))/len(text)\n", + "\n", + "\n", + "def clean_whitespace(str_text):\n", + " \"\"\"\n", + " Description:\n", + " Clean whitespace in text if whitespace ratio is greater than 0.3\n", + " Args:\n", + " str_text: input string.\n", + " Returns:\n", + " text4: clean string.\n", + " \"\"\"\n", + " ### Not reccommend for working with table which requires duplicated \n", + " \n", + " if whitespace_ratio(str_text) > 0.3:\n", + "\n", + " text1 = re.sub(r\"\\s{2,}\",\"\",str_text)\n", + " text2 = re.sub(r'(?<=[A-z()])\\s(?=[A-z()])',\"\",text1)\n", + " text3 = re.sub(\" \",\"\",text2)\n", + " text4 = re.sub(\"\",\" \",text3)\n", + "\n", + " else:\n", + " text2 = re.sub(r'(?<=[A-z()])\\s(?=[A-z()])',\"\",str_text)\n", + " text3 = re.sub(r\"\\s{2,}\",\" \",text2)\n", + " text4 = re.sub(\"\",\" \",text3)\n", + "\n", + " return text4\n", + "\n", + "\n", + "### def for using with pdf_table2json ###\n", + "\n", + "def get_clean_json_tables(pdf_file , text_rule_file):\n", + " \"\"\"\n", + " Description:\n", + " Get json table from pdf file. \n", + " Detectable table must have horizontal border line.\n", + " Require pdf_table2json lib.\n", + " Args:\n", + " pdf_file: string of pdf file path.\n", + " text_rule_file: string of file path to pdf_correction_rules.txt.\n", + " Returns:\n", + " result: list of dict.\n", + " \"\"\"\n", + " \n", + " dict_list = converter.main(pdf_file, json_file_out=False, image_file_out=False)\n", + " result = eval(clean_by_rules(dict_list , text_rule_file))\n", + " return result\n", + "\n", + "\n", + "def add_blank_fill(ls, max):\n", + " \"\"\"\n", + " Description:\n", + " Add blank member to list till length of list\n", + " is equal to max\n", + " Args:\n", + " ls: list.\n", + " max: int.\n", + " Returns:\n", + " ls: list with length of max.\n", + " \"\"\"\n", + " \n", + " while len(ls) < max:\n", + " ls.append('')\n", + " return ls\n", + "\n", + "\n", + "def get_clean_df(dict_ls):\n", + " \"\"\"\n", + " Description:\n", + " Create dataframe from list of dict that read from pdf file.\n", + " Require Pandas.\n", + " Args:\n", + " dict_ls: list of dict.\n", + " Returns:\n", + " clean_df: dataframe.\n", + " \"\"\"\n", + "\n", + " max_key_cnt = max([len(dct.keys()) for dct in dict_ls])\n", + " top_column = list(dict_ls[0].keys())\n", + " new_column = add_blank_fill(top_column, max_key_cnt)\n", + "\n", + " clean_df = []\n", + "\n", + " for dct in dict_ls:\n", + " if list(dct.keys()) == top_column:\n", + " if len(clean_df) == 0:\n", + " add_values = add_blank_fill(list(dct.values()),max_key_cnt)\n", + " clean_df = pd.DataFrame([add_values],columns = new_column)\n", + " else:\n", + " clean_df.loc[len(clean_df.index)] = add_blank_fill(list(dct.values()),max_key_cnt)\n", + " prev_key = dct.keys()\n", + " else:\n", + " if len(dct.keys()) == 1:\n", + " clean_df.loc[len(clean_df.index)] = add_blank_fill(list(dct.values())[0],max_key_cnt)\n", + " elif dct.keys() != prev_key:\n", + " clean_df.loc[len(clean_df.index)] = add_blank_fill(list(dct.keys()),max_key_cnt)\n", + " clean_df.loc[len(clean_df.index)] = add_blank_fill(list(dct.values()),max_key_cnt)\n", + " prev_key = dct.keys()\n", + "\n", + " else:\n", + " clean_df.loc[len(clean_df.index)] = add_blank_fill(list(dct.values()),max_key_cnt)\n", + "\n", + " return clean_df\n", + " # print(clean_df.to_markdown())\n", + "\n", + "\n", + "### def for using with difflib ###\n", + "\n", + "def most_similar_fuzzy(search_text, source_text):\n", + " \"\"\"\n", + " Description:\n", + " Get the most similar search-text from source-text\n", + " Require difflib.\n", + " Args:\n", + " search_text: string of search word.\n", + " source_text: string of source to lookup\n", + " Returns:\n", + " dict: {match content : match line number}.\n", + " \"\"\"\n", + " \n", + " lines = source_text.split(\"\\n\")\n", + " max_sim = 0\n", + " for i, line in enumerate(lines):\n", + " words = line.split()\n", + "\n", + " for word in words:\n", + " similarity = SequenceMatcher(None, word, search_text)\n", + " if similarity.ratio() > max_sim:\n", + " max_sim = similarity.ratio()\n", + " match_line = i\n", + " \n", + " return({lines[match_line]:match_line})\n", + "\n", + "\n", + "def pdf_2_text_markup(pdf_file, text_rule_file):\n", + " \"\"\"\n", + " Description:\n", + " Convert pdf file to text with markup table.\n", + " Args:\n", + " pdf_file: string of pdf file path.\n", + " text_rule_file: string of file path to pdf_correction_rules.txt.\n", + " Returns:\n", + " full_text_markup: string.\n", + " \"\"\"\n", + " \n", + " raw_text = read_pdf_all_pages(pdf_file)\n", + " clean_text = clean_dup_esc_char(raw_text)\n", + " clean_text = clean_by_rules(clean_text,text_rule_file)\n", + "\n", + " raw_json_table = get_clean_json_tables(pdf_file, text_rule_file)\n", + " if len(raw_json_table) == 0:\n", + " return clean_whitespace(clean_text)\n", + "\n", + " clean_df = get_clean_df(raw_json_table)\n", + "\n", + " csv_table = clean_df.to_csv(index=False)\n", + " result_ls =[]\n", + " for csv_line in csv_table.strip().split('\\n'):\n", + " if len(clean_whitespace(csv_line)) <= 1 :\n", + " continue\n", + " result = most_similar_fuzzy(csv_line, clean_text)\n", + " result_ls.append(result)\n", + "\n", + " match_line_ls = [int(list(dct.values())[0]) for dct in result_ls]\n", + "\n", + " #Use min / max as start / end line of extraction\n", + " clean_text_lines = clean_text.split(\"\\n\")\n", + " clean_text_lines = [clean_whitespace(line) for line in clean_text_lines]\n", + " full_text_markup = \"\\n\".join(clean_text_lines[:min(match_line_ls)]) + \"\\n\" + clean_df.to_markdown(index=False) + \"\\n\" + \"\\n\".join(clean_text_lines[max(match_line_ls)+1:])\n", + " \n", + " return full_text_markup\n", + "\n", + "\n", + "def clean_by_char_structure(str_text):\n", + " \"\"\"\n", + " Description:\n", + " Clean string by vowel and tone mark structure.\n", + " Args:\n", + " str_text: input string.\n", + " Returns:\n", + " final_pdf: clean string.\n", + " \"\"\"\n", + "\n", + " str_text = str_text.replace(f\"{chr(3661)}า\", 'ำ')\n", + " str_text = str_text.replace(f\"{chr(3661) + chr(3656)}า\", '่ำ')\n", + " str_text = str_text.replace(chr(139), chr(3656))\n", + " str_text = str_text.replace(chr(140), chr(3657))\n", + " str_text = str_text.replace(chr(141), chr(3658))\n", + " str_text = str_text.replace(chr(142), chr(3659))\n", + "\n", + " split_text = str_text.split('\\n')\n", + " final_pdf = []\n", + " for text in split_text:\n", + " result = \"\"\n", + " index_new = 0\n", + " while index_new < len(text):\n", + " current_char = text[index_new]\n", + "\n", + " if index_new > 0 and index_new < len(text) - 2 and not current_char.isascii():\n", + " next_char = text[index_new+1]\n", + " next_next_char = text[index_new+2]\n", + " if next_char in [' ', chr(141)] and next_next_char in [chr(3655), chr(3656), chr(3657), chr(3658), chr(3659), chr(3634), chr(3635), chr(3636), chr(3637), chr(3638), chr(3632), chr(3633), chr(3640), chr(3641)]:\n", + " result += current_char + next_next_char\n", + " index_new+=3\n", + " continue\n", + "\n", + " result += current_char\n", + " index_new+=1\n", + "\n", + " result_new = \"\"\n", + " index_new = 0\n", + " while index_new < len(result):\n", + " current_char = result[index_new]\n", + "\n", + " if index_new > 0 and index_new < len(result) - 2 and not current_char.isascii():\n", + " next_char = result[index_new+1]\n", + " if next_char in [' ', chr(141)] and current_char in ['แ', 'เ', 'ไ', 'โ', 'ใ']:\n", + " result_new += current_char\n", + " index_new+=2\n", + " continue\n", + "\n", + " result_new += current_char\n", + " index_new+=1\n", + "\n", + " final_pdf.append(result_new)\n", + " \n", + " return '\\n'.join(final_pdf)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "text_rule_file = \"/Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/pdf_correction_rules_new.txt\"\n", + "bcp_pdf_file = \"/Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp.pdf\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp\n", + "Page 1 converted to image: /Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp/page_1.png\n", + "Page 2 converted to image: /Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp/page_2.png\n", + "Page 3 converted to image: /Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp/page_3.png\n", + "Page 4 converted to image: /Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp/page_4.png\n", + "Page 5 converted to image: /Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp/page_5.png\n", + "Page 6 converted to image: /Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp/page_6.png\n", + "Page 7 converted to image: /Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp/page_7.png\n", + "Page 8 converted to image: /Users/nuchareethongthungwong/Documents/Learning/superAI/season3/level3/github/openthaigpt-pretraining/src/data/scripts/merge_pdf/bcp/page_8.png\n", + "-1-\n", + "\n", + "\n", + "ที่ 10000/027/2566 \n", + " 11 เมษายน2566 \n", + "เรื่อง แจ้งมติที่ประชุมสามัญผู้ถือหุ้นประจำปี 2566 \n", + "เรียนกรรมการและผู้จัดการ \n", + " ตลาดหลักทรัพย์แห่งประเทศไทย \n", + " ตามที่ บริษัท บางจาก คอร์ปอเรชั่นจำกัด (มหาชน) มีการประชุมสามัญผู้ถือหุ้นประจำปี 2566 เมื่อวันที่ 11 \n", + "เมษายน2566 เวลา 13.30 น. ในรูปแบบการประชุมระบบ Hybrid (เข้าร่วมประชุม ณ สถานที่จัดประชุม \n", + "(Physical) และผ่านสื่ออิเล็กทรอนิกส์ ( E-Meeting) ตามพระราชกำหนดว่าด้วยการประชุมผ่านสื่ออิเล็กทรอนิกส์ \n", + "พ.ศ. 2563 รวมถึงกฎหมายและระเบียบอื่นๆ ที่เกี่ยวข้อง ) ได้มีมติที่ประชุมดังนี้ \n", + "ระเบียบวาระที่ 1 รับทราบรายงานของคณะกรรมการเกี่ยวกับผลการดำเนินงานของบริษัทฯ ในรอบปี 256 5 \n", + "มติที่ประชุม ที่ประชุมรับทราบรายงานของคณะกรรมการเกี่ยวกับผลการดำเนินงานของบริษัทฯ ในรอบ \n", + "ปี2565\n", + "ระเบียบวาระที่ 2 พิจารณาอนุมัติงบการเงินสำหรับปีสิ้นสุดวันที่ 31 ธันวาคม 256 5 \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมาก ของผู้ถือหุ้นซึ่งมาประชุมและออกเสียงลงคะแนนมีมติอนุมัติ \n", + "งบการเงินสำหรั บปีสิ้นสุดวันที่ 31 ธันวาคม 2565 ตามที่เสนอ ด้วยคะแนนเสียงดังนี้ \n", + "เห็นด้วย 793,199,243 คะแนนคิดเป็นร้อยละ 99.9725 \n", + "ไม่เห็นด้วย 217,400 คะแนนคิดเป็นร้อยละ 0.0274 \n", + "งดออกเสียง 4,762,601 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 3 พิจารณาอนุมัติจัดสรรกำไรเพื่อจ่ายเงินปันผลสำหรับผลการดำเนินงานปี 2565 \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมากของผู้ถือหุ้ นซึ่งมาประชุมและออกเสียงลงคะแนนมีมติอนุมัติจัดสรร\n", + "กำไรจากับญชีกำไรสะสมที่ยังไม่ได้จัดสรรเพื่อจ่ายเงินปันผลสำหรับงวดครึ่งปีหลังของปี 256 5 ใน\n", + "อัตราหุ้นละ 1 .00 บาท และเมื่อรวมกับเงินปันผลระหว่างกาลงวดครึ่ งปีแรกของปี 256 5 ในอัตรา\n", + "หุ้นละ 1 .25 บาท จะเป็นเงินปันผล ที่จ่ายในปี 2565 ในอัตราหุ้นละ 2 .25 บาท เป็นเงินรวม\n", + "ประมาณ 3,065 ล้านบาท โดยกำหนดรายชื่อผู้ถือหุ้นเพื่อสิทธิในการรับเงินปันผล ในวันที่ 7 \n", + "มีนาคม 2566 และกำหนดจ่ายเงิ นปันผลในวันที่ 24 เมษายน2566 ตามที่เสนอ ด้วยคะแนน\n", + "เสียงดังนี้ \n", + "\n", + "\n", + "- 2 - เห็นด้วย 798,154,028 คะแนนคิดเป็นร้อยละ 99.999 8 \n", + "ไม่เห็นด้วย 1,427 คะแนนคิดเป็นร้อยละ 0.0001 \n", + "งดออกเสียง 23,789 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 4 พิจารณาเลือกตั้ง กรรมการแทนกรรมการที่พ้นจากตำแหน่งตามวาระ \n", + "มติที่ประชุม ที่ประชุมมีมติเลือกตั้งกรรมการที่ออกตามวาระจำนวน2 ท่านให้กลับเข้าดำรงตำแหน่ง เป็น\n", + "กรรมการต่ออีกวาระหนึ่ง ตามที่เสนอ ประกอบด้วย \n", + " (1) พลเอก ทรงวิทย์ หนุนภักดี โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 785,062,182 คะแนนคิดเป็นร้อยละ 98.3918 \n", + "ไม่เห็นด้วย 12,831,350 คะแนนคิดเป็นร้อยละ 1.6081 \n", + "งดออกเสียง 295,112 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย 3,600 คะแนนคิดเป็นร้อยละ - \n", + " (2) นายบุญชอบ สุทธมนัสวงษ์ โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 790,294,730 คะแนนคิดเป็นร้อยละ 99.018 3 \n", + "ไม่เห็นด้วย 7,834,610 คะแนนคิดเป็นร้อยละ 0.9816 \n", + "งดออกเสียง 62,904 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + " และอนุมัติเลือกตั้งกรรมการใหม่แทนกรรมการที่พ้นจากตำแหน่ง ตามวาระ จำนวน3 ท่านดังนี้ \n", + " (1) นางวรนุช ภู่อิ่ม โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 795,503 ,595 คะแนนคิดเป็นร้อยละ 99.6710 \n", + "ไม่เห็นด้วย 2,625,745 คะแนนคิดเป็นร้อยละ 0.3289 \n", + "งดออกเสียง 62,904 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + " (2) นายสุรินทร์ จิรวิศิษฎ์ โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 795,591,378 คะแนนคิดเป็นร้อยละ 99.6819 \n", + "ไม่เห็นด้วย 2,538,062 คะแนนคิดเป็นร้อยละ 0.3180 \n", + "งดออกเสียง 62,804 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "(3) นางวิไล ฉัททันต์รัศมี โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 791,026,183 คะแนนคิดเป็นร้อยละ 99.1064 \n", + "ไม่เห็นด้วย 7,131,657 คะแนนคิดเป็นร้อยละ 0.8935 \n", + "งดออกเสียง 34,404 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + " - 3 - ดังนั้นกรรมการบริษัททั้งคณะภายหลังการ เลือกตั้ง มีจำนวนทั้งสิ้น15 คนประกอบด้วย \n", + "1) นายพิชัย ชุณหวชิร ประธานกรรมการ กรรมการอิสระ \n", + "2) นายประสงค์ พูนธเนศ กรรมการอิสระ \n", + "3) ดร. ปรเมธี วิมลศิริ กรรมการอิสระ \n", + "4) นางปริศนา ประหารข้าศึก กรรมการอิสระ \n", + "5) นายนรินทร์ กัลยาณมิตร กรรมการอิสระ \n", + "6) นายอัชพร จารุจินดา กรรมการอิสระ \n", + "7) นายเชาวลิต เอกบุตร กรรมการอิสระ \n", + "8) พลเอก ทรงวิทย์ หนุนภักดี กรรมการอิสระ \n", + "9) พล.ต.ท. สำราญ นวลมา กรรมการอิสระ \n", + "10) นายสุรินทร์ จิรวิศิษฎ์ กรรมการอิสระ \n", + "11) นางวิไล ฉัททันต์รัศมี กรรมการอิสระ \n", + "12) นายชาญวิทย์ นาคบุรี กรรมการผู้แทนกระทรวงการคลัง \n", + "13) นางวรนุช ภู่อิ่ม กรรมการผู้แทนกระทรวงการคลัง \n", + "14) นายบุญชอบ สุทธมนัสวงษ์ กรรมการผู้แทนสำนักงานประกันสังคม \n", + "15) นายชัยวัฒน์ โควาวิสารัช ประธานเจ้าหน้าที่บริหาร กลุ่มบริษัทบางจาก และ\n", + "กรรมการผู้จัดการใหญ่และเลขานุการคณะกรรมการบริษัท \n", + "ระเบียบวาระที่ 5 พิจารณากำหนดค่าตอบแทนกรรมการ \n", + "มติที่ประชุม ที่ประชุมโดยเสียง ไม่น้อยกว่าสองในสามของจำนวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุม มีมติ\n", + "อนุมัติกำหนดค่าตอบแทนกรรมการประจำปี 2566 ตามที่เสนอ ดังนี้ \n", + "1. ค่าตอบแทนรายเดือนและค่าเบี้ ยประชุม \n", + "คณะกรรมการ ค่าตอบแทน\n", + "| คณะกรรมการ | ค่าตอบแทน | เบี้ยประชุม |\n", + "| | รายเดือน | (บาท/ครั้ง/คน) |\n", + "| | (บาท/คน) | (เฉพาะกรรมการที่เข้าประชุม) |\n", + "|:-----------------------------------------|:-----------|:--------------------------|\n", + "| คณะกรรมการบริษัท | 45,000 | 45,000 |\n", + "| คณะกรรมการชุดย่อย | | |\n", + "| 1. คณะกรรมการตรวจสอบ | 20,000 | 25,000 |\n", + "| 2. คณะกรรมการสรรหาและกำหนดค่าตอบแทน | - | 25,000 |\n", + "| 3. คณะกรรมการบริหารความเสี่ยงทั้งองค์กร | - | 25,000 |\n", + "| 4. คณะกรรมการกำกับดูแลความยั่งยืนและบรรษัทภิบาล | - | 25,000 |\n", + "| 5. คณะกรรมการชุดย่อยอื่นที่อาจมีการแต่งตั้งโดย | - | 25,000 |\n", + "| คณะกรรมการบริษัทตามความจำเป็นและเหมาะสม | | |\n", + "| ในอนาคต | | |\n", + "ทั้งนี้ ประธานกรรมการบริษัท และประธานคณะกรรมการชุดย่อย จะได้รับค่าตอบแทนรายเดือนและ \n", + "ค่าเบี้ยประชุมสูงกว่ากรรมการในอัตราร้อยละ 25 รองประธานกรรมการบริษัท จะได้รับค่าตอบแทน\n", + "รายเดือนและค่าเบี้ยประชุมสูงกว่ากรรมการในอัตราร้อยละ 12.5 - 4 - 2. ค่าตอบแทนที่เป็นโบนัสคณะกรรมการ (ไม่เปลี่ยนแปลง ) \n", + " ร้อยละ 0.75 ของกำไรสุทธิ แต่ ไม่เกิน3,000,000 บาทต่อกรรมการ 1 ท่านและให้\n", + "คำนวณจ่ายตามระยะเวลาการดำ รงตำแหน่ง โดยประธานกรรมการบริษัทและ \n", + "รองประธานกรรมการบริษัท จะได้รับค่าตอบแทนที่เป็นเงินโบนัสสูงกว่ากรรมการใน\n", + "อัตราร้อยละ 25 และ 12.5 ตามลำดับ \n", + "3. ค่าตอบแทนอื่นของกรรมการ (ไม่เปลี่ยนแปลง ) \n", + " แผนประกันสุขภาพแบบกลุ่มการรักษาพยาบาลผู้ป่วยในและผู้ป่วยนอก ( IPD+OPD) โดย\n", + "มีค่าเบี้ยประกันภัยรายปีรวมจำนวนไม่เกิน50,000 บาท (ยังไม่รวมภาษีมูลค่าเพิ่ม) ต่อ\n", + "กรรมการ 1 ท่าน\n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 785,581,181 คะแนนคิดเป็นร้อยละ 98.4198 \n", + "ไม่เห็นด้วย 11,571,675 คะแนนคิดเป็นร้อยละ 1.4497 \n", + "งดออกเสียง 1,040,699 คะแนนคิดเป็นร้อยละ 0.1303 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 6 พิจารณาแต่งตั้งและกำหนดค่าตอบแทนผู้สอบบัญชี \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมากของผู้ถือหุ้นซึ่งมาประชุมและออกเสียงลงคะ แนนมีมติแต่งตั้ง \n", + "นายศักดา เกาทัณฑ์ทอง ผู้สอบบัญชีรับอนุญาต ทะเบียนเลข ที่ 4628 หรือนำยวัยวัฒน์ \n", + "กอสมานชัยกิจ ผู้สอบบัญชีรับอนุญาต ทะเบียนเลขที่ 6333 หรือนำยเจริญ ผู้สัมฤทธิ์เลิศ ผู้สอบ\n", + "บัญชีรับอนุญาต ทะเบียนเลขที่ 4068 จากบริษัท เคพีเอ็มจี ภูมิไชย สอบบัญชี จำกัด เป็นผู้สอบ\n", + "บัญชีประจำปี 2566 และกำหนดค่าตอบแทนเป็นจำนวนเงิน2,040,250 บาท ตามที่เสนอ \n", + "ด้วยคะแนนเสียงดังนี้ \n", + "เห็นด้วย 797,042,144 คะแนนคิดเป็นร้อยละ 99.8612 \n", + "ไม่เห็นด้วย 1,107, 212 คะแนนคิดเป็นร้อยละ 0.1387 \n", + "งดออกเสียง 44,199 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 7 พิจารณาอนุมัติการเข้าซื้อหุ้นสามัญและการทำคำเสนอซื้อหลักทรัพย์ที่เหลือทั้งหมดในบริษัท \n", + "เอสโซ่ (ประเทศไทย) จำกัด (มหาชน) ซึ่งเป็นรายการได้มาซึ่งสินทรัพย์ของบริษัทฯ \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อยกว่าสามในสี่ของจำนวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมำประชุมและมีสิทธิ\n", + "ออกเสียงลงคะแนนมีมติอนุมัติ ดังนี้ \n", + "(1) การเข้าซื้อหุ้นสามัญโดยตรงจำนวน2,283,750,000 หุ้นในเอสโซ่ (คิดเป็นประมาณร้อยละ \n", + "65.99 ของหุ้นที่ออกจำหน่ายแล้วทั้งหมดของเอสโซ่ ณ วันที่ 30 กันยายน2565) และการ\n", + "ทำคำเสนอซื้อหุ้นสามัญที่เหลือทั้งหมดในเอสโซ่ เป็นจำนวนไม่เกิน1,177,108,000 หุ้น(คิด\n", + "เป็นประมาณร้อยละ 34.01 ของหุ้นที่ออกจำหน่ายแล้วทั้งหมดของเอสโซ่ ณ วันที่ 30 - 5 - กันยายน2565) ภายหลังจากที่ธุรกรรมการซื้อขายหุ้นเสร็จสิ้นเพื่อได้มาซึ่งหุ้นที่เหลือ\n", + "ทั้งหมดในเอสโซ่ ในราคาเดียวกันกับราคาซื้อหุ้นเอสโซ่ในธุรกรรมการซื้ อขายหุ้นและ \n", + "(2) การมอบอำนาจให้ประธานเจ้าหน้าที่บริหารกลุ่มบริษัทบางจากและกรรมการผู้จัดการใหญ่ \n", + "หรือผู้ที่ประธานเจ้าหน้าที่บริหารกลุ่ม บริษัทบางจากและกรรมการผู้จัดการใหญ่มอบอำนาจ \n", + "เป็นผู้มีอำนาจในการเจรจา ต่อรองเงื่อนไข ทำความตกลง กำหนด แก้ไข เปลี่ยนแปลง\n", + "รายละเอียดและลงนามในสัญญาซื้อขายหุ้ นตลอดจนเอกสารต่างๆ ที่เกี่ยวข้อง และ\n", + "ดำเนินการใดๆ ที่จำเป็นในการเข้าทำธุรกรรมฯ และสัญญาหรือและเอกสาร อื่นใด รวมถึง\n", + "การดำเนินการใดๆ ที่เกี่ยวข้องให้เป็นไปตามเงื่อนไขของสัญญา และการติดต่อกับหน่วยงาน\n", + "ราชการหรือหน่วยงานกำกับดูแลที่เกี่ยวข้อง ตลอดจนดำเนินการต่างๆ ตามที่จำเป็น\n", + "และสมควรเพื่อประโยชน์สูงสุดของบริษัท ฯ และเป็นไปตามเนื้อหาข้างต้นเพื่อให้การทำ\n", + "ธุรกรรมฯ ดังกล่าวเสร็จสมบูรณ์ รวมทั้งบริหารจัดการและทำธุรกรรมที่เกี่ยวข้องได้ตาม\n", + "ความเหมาะสม \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 797,134,359 คะแนนคิดเป็นร้อยละ 99.8583 \n", + "ไม่เห็นด้วย 3,212 คะแนนคิดเป็นร้อยละ 0.0004 \n", + "งดออกเสียง 1,127,884 คะแนนคิดเป็นร้อยละ 0.1412 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 8 พิจารณาอนุมัติวงเงินในการออกและเสนอขายหุ้นกู้ ระยะเวลา 5 ปี (ปี 2566 - 2570) \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อยกว่าสามในสี่ของจำนวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุ มและมีสิทธิ\n", + "ออกเสียงลงคะแนนมีมติ อนุมัติวงเงินในการออกและเสนอขายหุ้นกู้ รวมไม่เกิน80 ,000 ล้านบาท \n", + "หรือสกุลเงินอื่นเทียบเท่า ณ ขณะใดขณะหนึ่ง ระยะเวลา 5 ปี (ปี 2566 -2570) และยกเลิกวงเงิน\n", + "คงเหลือ 6 ,000 ล้านบาท จากมติที่ประชุมสามัญผู้ถือหุ้นประจำปี 2562 ตามที่เสนอ ด้วยคะแนน\n", + "เสียงดังนี้ \n", + "เห็นด้วย 794,160,1 97 คะแนนคิดเป็นร้อยละ 99.4857 \n", + "ไม่เห็นด้วย 3,069,954 คะแนนคิดเป็นร้อยละ 0.3845 \n", + "งดออกเสียง 1,035,304 คะแนนคิดเป็นร้อยละ 0.1296 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 9 พิจารณาอนุมัติแก้ ไขข้อบังคับบริษัทฯ \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อ ยกว่าสามในสี่ของจำ นวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุมและมีสิทธิ\n", + "ออกเสียงลงคะแนนมีมติอนุมัติแก้ไขข้อบังคับของบริษัท ข้อ ข้อ 16 , 19, 29, 31, 41 และ 47\n", + "เป็นดังนี้ \n", + " ข้อ 16. ในการเรียกประชุมผู้ถือหุ้นให้คณะกรรมการจัดทำเป็นหนังสือนัดประชุม ระบุสถานที่ วัน\n", + "เวลา ระเบียบวาระการ ประชุม และเรื่องที่จะเสนอต่อที่ประชุม พร้อมด้วยรายละเอียดตาม- 6 - สมควร โดยระบุว่าเป็นเรื่องที่จะเสนอเพื่อทราบ เพื่ออนุมัติหรือเพื่อพิจารณา รวมทั้งความ เห็น\n", + "ของกรรมการในเรื่องดังกล่าวและจัดส่งให้ผู้ถือหุ้นและนายทะเบียนทราบไม่น้อยกว่าเจ็ด(7) วัน\n", + "ก่อนวันประชุม และโฆษ ณาคำบอกกล่าวนัดประชุม ตามหลักเกณฑ์ที่กฎหมายกำหนด สาม(3) วัน\n", + "ติดต่อกันและไม่น้อยกว่าสาม(3) วันก่อนวันประชุมด้วย \n", + " สถานที่ในการประชุมอาจ กำหนดเป็นสถานที่อื่นนอกเหนือไปจากท้องที่อันเป็นที่ตั้งสำนักงาน\n", + "ใหญ่ของบริษัท หรือจังหวัดใกล้เคียงตามที่คณะกร รมการจะกำหนดก็ได้ \n", + " การจัดส่งหนังสือนัดประชุมให้ผู้ถือหุ้นตามวรรคหนึ่ง อาจส่งโดยวิธีการทางอิเล็กทรอนิกส์ หรือ\n", + "ตามหลักเกณฑ์ที่กฎหมายกำหนด \n", + " ข้อ 19. ในการประชุมผู้ถือหุ้นผู้ถือหุ้นอาจมอบฉันทะให้บุคคลอื่นซึ่งบรรลุนิติภาวะเข้าประชุม\n", + "และออกเสียงแทนตนในการประชุมก็ได้ หนังสือมอบฉันทะจะต้องลงวันที่และลายมือชื่อของ ผู้ถือ\n", + "หุ้นที่มอบฉันทะและเป็นไปตามแบบที่ นายทะเบียนกำหนด \n", + "หนังสือมอบฉันทะนี้จะต้องมอบให้แก่ประธานกรรมการหรือผู้ที่ประธานกรรมการกำหนด \n", + "ณ สถานที่ประชุมก่อนผู้รับมอบฉันทะเข้าประชุม \n", + "การมอบฉันทะตามวรรคหนึ่ง อาจดำเนินกา รโดยวิธีการทำงอิเล็ กทรอนิกส์หรือ ตามหลักเกณฑ์ที่\n", + "กฎหมายกำหนด \n", + "ข้อ 29. ให้ประธานกรรมการเป็นผู้เรียกประชุมคณะกรรมการ \n", + "เมื่อมีเหตุอันสมควรหรือเพื่อรักษาสิทธิหรือประโยชน์ของบริษัท กรรมการตั้งแต่สองคนขึ้นไปจะ\n", + "ร่วมกันร้องขอให้ประธานกรรมการเรียก ประชุมคณะกรรมการได้ โดย ต้องระบุเรื่องและเหตุผลที่จะ\n", + "เสนอให้ที่ประชุมพิจารณาไปด้วย ในกรณีเช่นนี้ให้ประธานกรรมการเรียกและกำหนดวันประชุม\n", + "ภายในสิบสี่วันนับแต่วันที่ได้รับการร้องขอ \n", + "ในกรณีที่ประธานกรรมการไม่ดำเนินการตามวรรคสอง กรรมการซึ่งร้องขออาจร่วมกันเรียกและ\n", + "กำหนดวันประชุมคณะกรรมการเพื่อพิจารณาเรื่องที่ ร้องขอได้ภายในสิบสี่วันนับแต่วันครบ\n", + "กำหนดระยะเวลาตามวรรคสอง \n", + "ในกรณีที่ไม่มีประธานกรรมการไม่ว่าด้วยเหตุใด ให้รองประธานกรรมการเป็นผู้เรียกประชุม\n", + "คณะกรรมการ ในกรณีที่ไม่มีรองประธานก รรมการไม่ว่าด้วยเหตุใด กรรมการตั้งแต่สองคนขึ้นไป\n", + "อาจร่วมกันเรียกประชุมคณะกรรมกา รได้ \n", + "ให้เลขานุการคณะกรรมการเป็นผู้แจ้งนัดการประชุมคณะกรรมการตามที่ ได้รับมอบหมาย \n", + "ข้อ 31. ในการเรียกประชุมคณะกรรมการ ให้มีหนังสือนัดประชุมส่งมอบให้แก่กรรมการหรือ\n", + "ผู้แทนของกรรมการ ไม่น้อยกว่าสาม(3) วันก่อนวันประชุม เว้นแต่ในกรณีจำเป็นรีบด่วนเพื่ อรักษา\n", + "สิทธิหรือประโยชน์ของบริษัทจะแจ้งการนัดประชุมโดยวิธีอื่นและกำหนดวันประชุมให้เร็วกว่านั้น\n", + "ก็ได้ - 7 - ในการจัดส่งหนังสือเชิญประชุมคณะกรรมการบริษัท รวมทั้งเอกสารประกอบการประชุม\n", + "คณะกรรมการ บริษัทอำจจัดส่ง โดยวิธีการทางอิเล็กทรอนิกส์หรือตามหลักเกณฑ์ที่กฎหมาย\n", + "กำหนด\n", + "ข้อ 41. การจ่ายเงินปันผลประจำปีจะกระทำได้ก็แต่โดยมติของที่ประชุมผู้ถือหุ้น\n", + "ภายใต้ข้อบังคับข้อ 42. ห้ามมิให้แบ่งเงินปันผลจากเงินประเภทอื่นนอกจากกำไร ในกรณีที่บริษัท\n", + "ยังมียอดขาดทุนสะสมอยู่ห้ามมิ ให้แบ่งเงินปันผล \n", + "เงินปันผลสำหรับหุ้นสามัญให้แบ่งตามจำนวนหุ้นหุ้ นละเท่าๆ กัน\n", + "คณะกรรมการอาจจ่ายเงินปันผลระหว่างกาลให้แก่ผู้ถือหุ้นได้เป็นครั้งคราวในเมื่อเห็นว่าบริษัทมี\n", + "ผลกำไรสมควรพอที่จะทำเช่นนั้นมติของคณะกรรมการดังกล่าวต้องประกอบด้วยคะแนนเสียงไม่\n", + "น้อยกว่าสามในสี่(3/4) ของจำนวนกรรมการซึ่งมาประชุม และให้รายงานให้ที่ประชุมผู้ถือหุ้น\n", + "ทราบในการประชุมคราวต่อไป \n", + "การจ่ายเงินปันผล ให้กระทำภายในหนึ่ง (1) เดือนนับแต่วันที่ที่ประชุมผู้ถือหุ้นหรือ\n", + "คณะกรรมการลงมติ แล้วแต่กรณี ทั้งนี้ ให้แจ้ง ไปยังผู้ถือหุ้นตามหลักเกณฑ์ที่กฎหมายกำหนด และ\n", + "ให้โฆษณาคำบอกกล่าวการจ่ายเงินปันผลนั้นตามหลักเกณฑ์ที่กฎหมายกำหนด ภายในหนึ่ง(1) \n", + "เดือนนับแต่วันที่ที่ประชุมผู้ถือหุ้นอนุมัติหรือคณะกรรมการลงมติแล้วแต่กรณี \n", + "ข้อ 47. ตราของบริษัทมีดังประทับไว้นี้ \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 798,176,609 คะแนนคิดเป็นร้อยละ 99.9888 \n", + "ไม่เห็นด้วย 712 คะแนนคิดเป็นร้อยละ 0.0000 \n", + "งดออกเสียง 88,214 คะแนนคิดเป็นร้อยละ 0.0110 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "\n", + "ระเบียบวาระที่ 10 พิจารณาอนุมัติแก้ไขหนังสือบริคณห์สนธิข้อ 3 (วัตถุประสงค์ของบริษัท) \n", + "มติที่ประชุม ที่ที่ประชุมโดยเสียงไม่น้อยกว่าสามในสี่ของจำนวนเสียงทั้งหมดของผู้ ถือหุ้นซึ่งมาประชุม และมี\n", + "สิทธิออกเสียงลงคะแนนมีมติ แก้ไขเพิ่มเติมหนังสือบริคณห์สนธิของบริษัทฯ ข้อ 3 (วัตถุประสงค์\n", + "ของบริษัท) โดยเพิ่มเติมวัตถุประสงค์ข้อ 22 และข้อ 23 ดังนี้ \n", + "-8-\n", + " ข้อ 22 ประกอบกิจการเป็นศูนย์บริหารเงินโดยการประกอบธุรกิจบริการรับซื้อภาระผูกพันหรื อ\n", + "เอกสารเรียกเก็บเงิ นรับและจ่ายเงินทุกประเภท ทั้งในและต่างประเทศ การหักกลบรายได้หรือ\n", + "ภาระผูกพันการซื้อขายหรือแลกเปลี่ยนเงินตราต่างประเทศเมื่อได้รับอนุญาตจากหน่วยงานที่\n", + "เกี่ยวข้อง การบริหารความเสี่ยงจากอัตราแลกเปลี่ยนการบริหารความเสี่ยงสินค้าโภคภัณฑ์ การ\n", + "บริหารความเสี่ยงอื่นๆ การบริหารสภาพคล่อง รวมทั้งธุรกิจ อื่นๆ ทุกชนิด ทุกประเภท ที่\n", + "เกี่ยวข้องกับศูนย์บริหารเงินเว้นแต่ในธุรกิจธนาคาร ธุรกิจเงินทุนและธุรกิจเครดิตฟองซิเอร์ \n", + " ข้อ 23 ประกอบกิจการให้บริการด้านการบริหารหรือด้านเทคนิค และการให้บริการสนับสนุนใน\n", + "ด้านต่าง ๆ เช่นการบริ หารงานทั่วไป การวางแผนทางธุรกิจ การ ประสานงานทางธุรกิจ การให้\n", + "คำแนะนำเกี่ยวกับธุรกิจ การให้คำปรึกษาด้านการเงินการจัดการและควบคุมสินเชื่อ การ\n", + "ให้บริการด้านบัญชีและการเงินการวิจัยและพัฒนาผลิตภัณฑ์ การสนับสนุนด้านเทคนิค การ\n", + "ส่งเสริมด้านการต ลาดและการขาย การบริหารด้านงานบุคคลและการฝึกอบรม การวิเคราะห์วิจัย\n", + "ด้านเศรษฐกิจและการลงทุนการจัดการ การจัดทำบัญชีให้กับกลุ่มบริษัท และการให้บริการ\n", + "สนับสนุนอื่นๆ ที่เกี่ยวข้องกับการประกอบกิจการตามวัตถุประสงค์ของบริษัท \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 798,210,8 24 คะแนนคิดเป็นร้อยละ 99.9931 \n", + "ไม่เห็นด้วย 712 คะแนนคิดเป็นร้อยละ 0.0000 \n", + "งดออกเสียง 53,999 คะแนนคิดเป็นร้อยละ 0.0067 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "\n", + "ระเบียบวาระที่ 11 เรื่องอื่นๆ \n", + "-ไม่มี-\n", + " จึงเรียนมาเพื่อทราบ \n", + " ขอแสดงความนับถือ \n", + "\n", + "\n", + "\n", + " (นายชัยวัฒน์ โควาวิสารัช) \n", + " ประธานเจ้าหน้าที่บริหาร กลุ่มบริษัทบางจาก \n", + " และกรรมการผู้จัดการใหญ่ \n", + "ส่วนเลขานุการคณะกรรมการบริษัท \n", + "โทรศัพท์ 0 2335 4000 \n", + "โทรสาร 0 2335 8000 \n", + "\n" + ] + } + ], + "source": [ + "result = pdf_2_text_markup(bcp_pdf_file, text_rule_file)\n", + "result = clean_by_char_structure(result)\n", + "print(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- 1 - \n", + " \n", + " \n", + "ที่ 10000/027/2566 \n", + " 11 เมษายน2566 \n", + "เรื่อง แจ้งมติที่ประชุมสามัญผู้ถือหุ้นประจำปี 2566 \n", + "เรียนกรรมการและผู้จัดการ \n", + " ตลาดหลักทรัพย์แห่งประเทศไทย \n", + " ตามที่ บริษัท บางจาก คอร์ปอเรชั่นจำกัด (มหาชน) มีการประชุมสามัญผู้ถือหุ้นประจำปี 2566 เมื่อวันที่ 11 \n", + "เมษายน2566 เวลา 13.30 น. ในรูปแบบการประชุมระบบ Hybrid (เข้าร่วมประชุม ณ สถานที่จัดประชุม \n", + "(Physical) และผ่านสื่ออิเล็กทรอนิกส์ ( E-Meeting) ตามพระราชกำหนดว่าด้วยการประชุมผ่านสื่ออิเล็กทรอนิกส์ \n", + "พ.ศ. 2563 รวมถึงกฎหมายและระเบียบอื่นๆ ที่เกี่ยวข้อง ) ได้มีมติที่ประชุมดังนี้ \n", + "ระเบียบวาระที่ 1 รับทราบรายงานของคณะกรรมการเกี่ยวกับผลการดำเนินงานของบริษัทฯ ในรอบปี 256 5 \n", + "มติที่ประชุม ที่ประชุมรับทราบรายงานของคณะกรรมการเกี่ยวกับผลการดำเนินงานของบริษัทฯ ในรอบ \n", + "ปี 2565 \n", + "ระเบียบวาระที่ 2 พิจารณาอนุมัติงบการเงินสำหรับปีสิ้นสุดวันที่ 31 ธันวาคม 256 5 \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมาก ของผู้ถือหุ้นซึ่งมาประชุมและออกเสียงลงคะแนนมีมติอนุมัติ \n", + "งบการเงินสำหรั บปีสิ้นสุดวันที่ 31 ธันวาคม 2565 ตามที่เสนอ ด้วยคะแนนเสียงดังนี้ \n", + "เห็นด้วย 793,199,243 คะแนนคิดเป็นร้อยละ 99.9725 \n", + "ไม่เห็นด้วย 217,400 คะแนนคิดเป็นร้อยละ 0.0274 \n", + "งดออกเสียง 4,762,601 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 3 พิจารณาอนุมัติจัดสรรกำไรเพื่อจ่ายเงินปันผลสำหรับผลการดำเนินงานปี 2565 \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมากของผู้ถือหุ้ นซึ่งมาประชุมและออกเสียงลงคะแนนมีมติอนุมัติจัดสรร\n", + "กำไรจากับญชีกำไรสะสมที่ยังไม่ได้จัดสรรเพื่อจ่ายเงินปันผลสำหรับงวดครึ่งปีหลังของปี 256 5 ใน\n", + "อัตราหุ้นละ 1 .00 บาท และเมื่อรวมกับเงินปันผลระหว่างกาลงวดครึ่ งปีแรกของปี 256 5 ในอัตรา\n", + "หุ้นละ 1 .25 บาท จะเป็นเงินปันผล ที่จ่ายในปี 2565 ในอัตราหุ้นละ 2 .25 บาท เป็นเงินรวม\n", + "ประมาณ 3,065 ล้านบาท โดยกำหนดรายชื่อผู้ถือหุ้นเพื่อสิทธิในการรับเงินปันผล ในวันที่ 7 \n", + "มีนาคม 2566 และกำหนดจ่ายเงิ นปันผลในวันที่ 24 เมษายน2566 ตามที่เสนอ ด้วยคะแนน\n", + "เสียงดังนี้ \n", + " \n", + " \n", + "- 2 - เห็นด้วย 798,154,028 คะแนนคิดเป็นร้อยละ 99.999 8 \n", + "ไม่เห็นด้วย 1,427 คะแนนคิดเป็นร้อยละ 0.0001 \n", + "งดออกเสียง 23,789 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 4 พิจารณาเลือกตั้ง กรรมการแทนกรรมการที่พ้นจากตำแหน่งตามวาระ \n", + "มติที่ประชุม ที่ประชุมมีมติเลือกตั้งกรรมการที่ออกตามวาระจำนวน2 ท่านให้กลับเข้าดำรงตำแหน่ง เป็น\n", + "กรรมการต่ออีกวาระหนึ่ง ตามที่เสนอ ประกอบด้วย \n", + " (1) พลเอก ทรงวิทย์ หนุนภักดี โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 785,062,182 คะแนนคิดเป็นร้อยละ 98.3918 \n", + "ไม่เห็นด้วย 12,831,350 คะแนนคิดเป็นร้อยละ 1.6081 \n", + "งดออกเสียง 295,112 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย 3,600 คะแนนคิดเป็นร้อยละ - \n", + " (2) นายบุญชอบ สุทธมนัสวงษ์ โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 790,294,730 คะแนนคิดเป็นร้อยละ 99.018 3 \n", + "ไม่เห็นด้วย 7,834,610 คะแนนคิดเป็นร้อยละ 0.9816 \n", + "งดออกเสียง 62,904 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + " และอนุมัติเลือกตั้งกรรมการใหม่แทนกรรมการที่พ้นจากตำแหน่ง ตามวาระ จำนวน3 ท่านดังนี้ \n", + " (1) นางวรนุช ภู่อิ่ม โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 795,503 ,595 คะแนนคิดเป็นร้อยละ 99.6710 \n", + "ไม่เห็นด้วย 2,625,745 คะแนนคิดเป็นร้อยละ 0.3289 \n", + "งดออกเสียง 62,904 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + " (2) นายสุรินทร์ จิรวิศิษฎ์ โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 795,591,378 คะแนนคิดเป็นร้อยละ 99.6819 \n", + "ไม่เห็นด้วย 2,538,062 คะแนนคิดเป็นร้อยละ 0.3180 \n", + "งดออกเสียง 62,804 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "(3) นางวิไล ฉัททันต์รัศมี โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 791,026,183 คะแนนคิดเป็นร้อยละ 99.1064 \n", + "ไม่เห็นด้วย 7,131,657 คะแนนคิดเป็นร้อยละ 0.8935 \n", + "งดออกเสียง 34,404 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + " - 3 - ดังนั้นกรรมการบริษัททั้งคณะภายหลังการ เลือกตั้ง มีจำนวนทั้งสิ้น15 คนประกอบด้วย \n", + "1) นายพิชัย ชุณหวชิร ประธานกรรมการ กรรมการอิสระ \n", + "2) นายประสงค์ พูนธเนศ กรรมการอิสระ \n", + "3) ดร. ปรเมธี วิมลศิริ กรรมการอิสระ \n", + "4) นางปริศนา ประหารข้าศึก กรรมการอิสระ \n", + "5) นายนรินทร์ กัลยาณมิตร กรรมการอิสระ \n", + "6) นายอัชพร จารุจินดา กรรมการอิสระ \n", + "7) นายเชาวลิต เอกบุตร กรรมการอิสระ \n", + "8) พลเอก ทรงวิทย์ หนุนภักดี กรรมการอิสระ \n", + "9) พล.ต.ท. สำราญ นวลมา กรรมการอิสระ \n", + "10) นายสุรินทร์ จิรวิศิษฎ์ กรรมการอิสระ \n", + "11) นางวิไล ฉัททันต์รัศมี กรรมการอิสระ \n", + "12) นายชาญวิทย์ นาคบุรี กรรมการผู้แทนกระทรวงการคลัง \n", + "13) นางวรนุช ภู่อิ่ม กรรมการผู้แทนกระทรวงการคลัง \n", + "14) นายบุญชอบ สุทธมนัสวงษ์ กรรมการผู้แทนสำนักงานประกันสังคม \n", + "15) นายชัยวัฒน์ โควาวิสารัช ประธานเจ้าหน้าที่บริหาร กลุ่มบริษัทบางจาก และ\n", + "กรรมการผู้จัดการใหญ่และเลขานุการคณะกรรมการบริษัท \n", + "ระเบียบวาระที่ 5 พิจารณากำหนดค่าตอบแทนกรรมการ \n", + "มติที่ประชุม ที่ประชุมโดยเสียง ไม่น้อยกว่าสองในสามของจำนวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุม มีมติ\n", + "อนุมัติกำหนดค่าตอบแทนกรรมการประจำปี 2566 ตามที่เสนอ ดังนี้ \n", + "1. ค่าตอบแทนรายเดือนและค่าเบี้ ยประชุม \n", + "คณะกรรมการ ค่าตอบแทน\n", + "รายเดือน\n", + "(บาท/คน) เบี้ยประชุม \n", + "(บาท/ครั้ง/คน) \n", + "(เฉพาะกรรมการที่เข้าประชุม) \n", + "คณะกรรมการบริษัท 45,000 45,000 \n", + "คณะกรรมการชุดย่อย \n", + "1. คณะกรรมการตรวจสอบ 20,000 25,000 \n", + "2. คณะกรรมการสรรหาและกำหนดค่าตอบแทน- 25,000 \n", + "3. คณะกรรมการ บริหารความเสี่ยงทั้งองค์กร - 25,000 \n", + "4. คณะกรรมการ กำกับดูแลความยั่งยืนและบรรษัทภิบาล - 25,000 \n", + "5. คณะกรรมการชุดย่อยอื่นที่อาจมีการแต่งตั้งโดย\n", + "คณะกรรมการบริษัทตามความจำเป็นและเหมาะสม\n", + "ในอนาคต - 25,000 \n", + "ทั้งนี้ ประธานกรรมการบริษัท และประธานคณะกรรมการชุดย่อย จะได้รับค่าตอบแทนรายเดือนและ \n", + "ค่าเบี้ยประชุมสูงกว่ากรรมการในอัตราร้อยละ 25 รองประธานกรรมการบริษัท จะได้รับค่าตอบแทน\n", + "รายเดือนและค่าเบี้ยประชุมสูงกว่ากรรมการในอัตราร้อยละ 12.5 - 4 - 2. ค่าตอบแทนที่เป็นโบนัสคณะกรรมการ (ไม่เปลี่ยนแปลง ) \n", + " ร้อยละ 0.75 ของกำไรสุทธิ แต่ ไม่เกิน3,000,000 บาทต่อกรรมการ 1 ท่านและให้\n", + "คำนวณจ่ายตามระยะเวลาการดำ รงตำแหน่ง โดยประธานกรรมการบริษัทและ \n", + "รองประธานกรรมการบริษัท จะได้รับค่าตอบแทนที่เป็นเงินโบนัสสูงกว่ากรรมการใน\n", + "อัตราร้อยละ 25 และ 12.5 ตามลำดับ \n", + "3. ค่าตอบแทนอื่นของกรรมการ (ไม่เปลี่ยนแปลง ) \n", + " แผนประกันสุขภาพแบบกลุ่มการรักษาพยาบาลผู้ป่วยในและผู้ป่วยนอก ( IPD+OPD) โดย\n", + "มีค่าเบี้ยประกันภัยรายปีรวมจำนวนไม่เกิน50,000 บาท (ยังไม่รวมภาษีมูลค่าเพิ่ม) ต่อ\n", + "กรรมการ 1 ท่าน\n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 785,581,181 คะแนนคิดเป็นร้อยละ 98.4198 \n", + "ไม่เห็นด้วย 11,571,675 คะแนนคิดเป็นร้อยละ 1.4497 \n", + "งดออกเสียง 1,040,699 คะแนนคิดเป็นร้อยละ 0.1303 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 6 พิจารณาแต่งตั้งและกำหนดค่าตอบแทนผู้สอบบัญชี \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมากของผู้ถือหุ้นซึ่งมาประชุมและออกเสียงลงคะ แนนมีมติแต่งตั้ง \n", + "นายศักดา เกาทัณฑ์ทอง ผู้สอบบัญชีรับอนุญาต ทะเบียนเลข ที่ 4628 หรือนำยวัยวัฒน์ \n", + "กอสมานชัยกิจ ผู้สอบบัญชีรับอนุญาต ทะเบียนเลขที่ 6333 หรือนำยเจริญ ผู้สัมฤทธิ์เลิศ ผู้สอบ\n", + "บัญชีรับอนุญาต ทะเบียนเลขที่ 4068 จากบริษัท เคพีเอ็มจี ภูมิไชย สอบบัญชี จำกัด เป็นผู้สอบ\n", + "บัญชีประจำปี 2566 และกำหนดค่าตอบแทนเป็นจำนวนเงิน2,040,250 บาท ตามที่เสนอ \n", + "ด้วยคะแนนเสียงดังนี้ \n", + "เห็นด้วย 797,042,144 คะแนนคิดเป็นร้อยละ 99.8612 \n", + "ไม่เห็นด้วย 1,107, 212 คะแนนคิดเป็นร้อยละ 0.1387 \n", + "งดออกเสียง 44,199 คะแนนคิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 7 พิจารณาอนุมัติการเข้าซื้อหุ้นสามัญและการทำคำเสนอซื้อหลักทรัพย์ที่เหลือทั้งหมดในบริษัท \n", + "เอสโซ่ (ประเทศไทย) จำกัด (มหาชน) ซึ่งเป็นรายการได้มาซึ่งสินทรัพย์ของบริษัทฯ \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อยกว่าสามในสี่ของจำนวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมำประชุมและมีสิทธิ\n", + "ออกเสียงลงคะแนนมีมติอนุมัติ ดังนี้ \n", + "(1) การเข้าซื้อหุ้นสามัญโดยตรงจำนวน2,283,750,000 หุ้นในเอสโซ่ (คิดเป็นประมาณร้อยละ \n", + "65.99 ของหุ้นที่ออกจำหน่ายแล้วทั้งหมดของเอสโซ่ ณ วันที่ 30 กันยายน2565) และการ\n", + "ทำคำเสนอซื้อหุ้นสามัญที่เหลือทั้งหมดในเอสโซ่ เป็นจำนวนไม่เกิน1,177,108,000 หุ้น(คิด\n", + "เป็นประมาณร้อยละ 34.01 ของหุ้นที่ออกจำหน่ายแล้วทั้งหมดของเอสโซ่ ณ วันที่ 30 - 5 - กันยายน2565) ภายหลังจากที่ธุรกรรมการซื้อขายหุ้นเสร็จสิ้นเพื่อได้มาซึ่งหุ้นที่เหลือ\n", + "ทั้งหมดในเอสโซ่ ในราคาเดียวกันกับราคาซื้อหุ้นเอสโซ่ในธุรกรรมการซื้ อขายหุ้นและ \n", + "(2) การมอบอำนาจให้ประธานเจ้าหน้าที่บริหารกลุ่มบริษัทบางจากและกรรมการผู้จัดการใหญ่ \n", + "หรือผู้ที่ประธานเจ้าหน้าที่บริหารกลุ่ม บริษัทบางจากและกรรมการผู้จัดการใหญ่มอบอำนาจ \n", + "เป็นผู้มีอำนาจในการเจรจา ต่อรองเงื่อนไข ทำความตกลง กำหนด แก้ไข เปลี่ยนแปลง\n", + "รายละเอียดและลงนามในสัญญาซื้อขายหุ้ นตลอดจนเอกสารต่างๆ ที่เกี่ยวข้อง และ\n", + "ดำเนินการใดๆ ที่จำเป็นในการเข้าทำธุรกรรมฯ และสัญญาหรือและเอกสาร อื่นใด รวมถึง\n", + "การดำเนินการใดๆ ที่เกี่ยวข้องให้เป็นไปตามเงื่อนไขของสัญญา และการติดต่อกับหน่วยงาน\n", + "ราชการหรือหน่วยงานกำกับดูแลที่เกี่ยวข้อง ตลอดจนดำเนินการต่างๆ ตามที่จำเป็น\n", + "และสมควรเพื่อประโยชน์สูงสุดของบริษัท ฯ และเป็นไปตามเนื้อหาข้างต้นเพื่อให้การทำ\n", + "ธุรกรรมฯ ดังกล่าวเสร็จสมบูรณ์ รวมทั้งบริหารจัดการและทำธุรกรรมที่เกี่ยวข้องได้ตาม\n", + "ความเหมาะสม \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 797,134,359 คะแนนคิดเป็นร้อยละ 99.8583 \n", + "ไม่เห็นด้วย 3,212 คะแนนคิดเป็นร้อยละ 0.0004 \n", + "งดออกเสียง 1,127,884 คะแนนคิดเป็นร้อยละ 0.1412 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 8 พิจารณาอนุมัติวงเงินในการออกและเสนอขายหุ้นกู้ ระยะเวลา 5 ปี (ปี 2566 - 2570) \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อยกว่าสามในสี่ของจำนวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุ มและมีสิทธิ\n", + "ออกเสียงลงคะแนนมีมติ อนุมัติวงเงินในการออกและเสนอขายหุ้นกู้ รวมไม่เกิน80 ,000 ล้านบาท \n", + "หรือสกุลเงินอื่นเทียบเท่า ณ ขณะใดขณะหนึ่ง ระยะเวลา 5 ปี (ปี 2566 -2570) และยกเลิกวงเงิน\n", + "คงเหลือ 6 ,000 ล้านบาท จากมติที่ประชุมสามัญผู้ถือหุ้นประจำปี 2562 ตามที่เสนอ ด้วยคะแนน\n", + "เสียงดังนี้ \n", + "เห็นด้วย 794,160,1 97 คะแนนคิดเป็นร้อยละ 99.4857 \n", + "ไม่เห็นด้วย 3,069,954 คะแนนคิดเป็นร้อยละ 0.3845 \n", + "งดออกเสียง 1,035,304 คะแนนคิดเป็นร้อยละ 0.1296 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 9 พิจารณาอนุมัติแก้ ไขข้อบังคับบริษัทฯ \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อ ยกว่าสามในสี่ของจำ นวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุมและมีสิทธิ\n", + "ออกเสียงลงคะแนนมีมติอนุมัติแก้ไขข้อบังคับของบริษัท ข้อ ข้อ 16 , 19, 29, 31, 41 และ 47\n", + "เป็นดังนี้ \n", + " ข้อ 16. ในการเรียกประชุมผู้ถือหุ้นให้คณะกรรมการจัดทำเป็นหนังสือนัดประชุม ระบุสถานที่ วัน\n", + "เวลา ระเบียบวาระการ ประชุม และเรื่องที่จะเสนอต่อที่ประชุม พร้อมด้วยรายละเอียดตาม- 6 - สมควร โดยระบุว่าเป็นเรื่องที่จะเสนอเพื่อทราบ เพื่ออนุมัติหรือเพื่อพิจารณา รวมทั้งความ เห็น\n", + "ของกรรมการในเรื่องดังกล่าวและจัดส่งให้ผู้ถือหุ้นและนายทะเบียนทราบไม่น้อยกว่าเจ็ด(7) วัน\n", + "ก่อนวันประชุม และโฆษ ณาคำบอกกล่าวนัดประชุม ตามหลักเกณฑ์ที่กฎหมายกำหนด สาม(3) วัน\n", + "ติดต่อกันและไม่น้อยกว่าสาม(3) วันก่อนวันประชุมด้วย \n", + " สถานที่ในการประชุมอาจ กำหนดเป็นสถานที่อื่นนอกเหนือไปจากท้องที่อันเป็นที่ตั้งสำนักงาน\n", + "ใหญ่ของบริษัท หรือจังหวัดใกล้เคียงตามที่คณะกร รมการจะกำหนดก็ได้ \n", + " การจัดส่งหนังสือนัดประชุมให้ผู้ถือหุ้นตามวรรคหนึ่ง อาจส่งโดยวิธีการทางอิเล็กทรอนิกส์ หรือ\n", + "ตามหลักเกณฑ์ที่กฎหมายกำหนด \n", + " ข้อ 19. ในการประชุมผู้ถือหุ้นผู้ถือหุ้นอาจมอบฉันทะให้บุคคลอื่นซึ่งบรรลุนิติภาวะเข้าประชุม\n", + "และออกเสียงแทนตนในการประชุมก็ได้ หนังสือมอบฉันทะจะต้องลงวันที่และลายมือชื่อของ ผู้ถือ\n", + "หุ้นที่มอบฉันทะและเป็นไปตามแบบที่ นายทะเบียนกำหนด \n", + "หนังสือมอบฉันทะนี้จะต้องมอบให้แก่ประธานกรรมการหรือผู้ที่ประธานกรรมการกำหนด \n", + "ณ สถานที่ประชุมก่อนผู้รับมอบฉันทะเข้าประชุม \n", + "การมอบฉันทะตามวรรคหนึ่ง อาจดำเนินกา รโดยวิธีการทำงอิเล็ กทรอนิกส์หรือ ตามหลักเกณฑ์ที่\n", + "กฎหมายกำหนด \n", + "ข้อ 29. ให้ประธานกรรมการเป็นผู้เรียกประชุมคณะกรรมการ \n", + "เมื่อมีเหตุอันสมควรหรือเพื่อรักษาสิทธิหรือประโยชน์ของบริษัท กรรมการตั้งแต่สองคนขึ้นไปจะ\n", + "ร่วมกันร้องขอให้ประธานกรรมการเรียก ประชุมคณะกรรมการได้ โดย ต้องระบุเรื่องและเหตุผลที่จะ\n", + "เสนอให้ที่ประชุมพิจารณาไปด้วย ในกรณีเช่นนี้ให้ประธานกรรมการเรียกและกำหนดวันประชุม\n", + "ภายในสิบสี่วันนับแต่วันที่ได้รับการร้องขอ \n", + "ในกรณีที่ประธานกรรมการไม่ดำเนินการตามวรรคสอง กรรมการซึ่งร้องขออาจร่วมกันเรียกและ\n", + "กำหนดวันประชุมคณะกรรมการเพื่อพิจารณาเรื่องที่ ร้องขอได้ภายในสิบสี่วันนับแต่วันครบ\n", + "กำหนดระยะเวลาตามวรรคสอง \n", + "ในกรณีที่ไม่มีประธานกรรมการไม่ว่าด้วยเหตุใด ให้รองประธานกรรมการเป็นผู้เรียกประชุม\n", + "คณะกรรมการ ในกรณีที่ไม่มีรองประธานก รรมการไม่ว่าด้วยเหตุใด กรรมการตั้งแต่สองคนขึ้นไป\n", + "อาจร่วมกันเรียกประชุมคณะกรรมกา รได้ \n", + "ให้เลขานุการคณะกรรมการเป็นผู้แจ้งนัดการประชุมคณะกรรมการตามที่ ได้รับมอบหมาย \n", + "ข้อ 31. ในการเรียกประชุมคณะกรรมการ ให้มีหนังสือนัดประชุมส่งมอบให้แก่กรรมการหรือ\n", + "ผู้แทนของกรรมการ ไม่น้อยกว่าสาม(3) วันก่อนวันประชุม เว้นแต่ในกรณีจำเป็นรีบด่วนเพื่ อรักษา\n", + "สิทธิหรือประโยชน์ของบริษัทจะแจ้งการนัดประชุมโดยวิธีอื่นและกำหนดวันประชุมให้เร็วกว่านั้น\n", + "ก็ได้ - 7 - ในการจัดส่งหนังสือเชิญประชุมคณะกรรมการบริษัท รวมทั้งเอกสารประกอบการประชุม\n", + "คณะกรรมการ บริษัทอำจจัดส่ง โดยวิธีการทางอิเล็กทรอนิกส์หรือตามหลักเกณฑ์ที่กฎหมาย\n", + "กำหนด \n", + "ข้อ 41. การจ่ายเงินปันผลประจำปีจะกระทำได้ก็แต่โดยมติของที่ประชุมผู้ถือหุ้น\n", + "ภายใต้ข้อบังคับข้อ 42. ห้ามมิให้แบ่งเงินปันผลจากเงินประเภทอื่นนอกจากกำไร ในกรณีที่บริษัท\n", + "ยังมียอดขาดทุนสะสมอยู่ห้ามมิ ให้แบ่งเงินปันผล \n", + "เงินปันผลสำหรับหุ้นสามัญให้แบ่งตามจำนวนหุ้นหุ้ นละเท่าๆ กัน\n", + "คณะกรรมการอาจจ่ายเงินปันผลระหว่างกาลให้แก่ผู้ถือหุ้นได้เป็นครั้งคราวในเมื่อเห็นว่าบริษัทมี\n", + "ผลกำไรสมควรพอที่จะทำเช่นนั้นมติของคณะกรรมการดังกล่าวต้องประกอบด้วยคะแนนเสียงไม่\n", + "น้อยกว่าสามในสี่(3/4) ของจำนวนกรรมการซึ่งมาประชุม และให้รายงานให้ที่ประชุมผู้ถือหุ้น\n", + "ทราบในการประชุมคราวต่อไป \n", + "การจ่ายเงินปันผล ให้กระทำภายในหนึ่ง (1) เดือนนับแต่วันที่ที่ประชุมผู้ถือหุ้นหรือ\n", + "คณะกรรมการลงมติ แล้วแต่กรณี ทั้งนี้ ให้แจ้ง ไปยังผู้ถือหุ้นตามหลักเกณฑ์ที่กฎหมายกำหนด และ\n", + "ให้โฆษณาคำบอกกล่าวการจ่ายเงินปันผลนั้นตามหลักเกณฑ์ที่กฎหมายกำหนด ภายในหนึ่ง(1) \n", + "เดือนนับแต่วันที่ที่ประชุมผู้ถือหุ้นอนุมัติหรือคณะกรรมการลงมติแล้วแต่กรณี \n", + "ข้อ 47. ตราของบริษัทมีดังประทับไว้นี้ \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 798,176,609 คะแนนคิดเป็นร้อยละ 99.9888 \n", + "ไม่เห็นด้วย 712 คะแนนคิดเป็นร้อยละ 0.0000 \n", + "งดออกเสียง 88,214 คะแนนคิดเป็นร้อยละ 0.0110 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + " \n", + "ระเบียบวาระที่ 10 พิจารณาอนุมัติแก้ไขหนังสือบริคณห์สนธิข้อ 3 (วัตถุประสงค์ของบริษัท) \n", + "มติที่ประชุม ที่ที่ประชุมโดยเสียงไม่น้อยกว่าสามในสี่ของจำนวนเสียงทั้งหมดของผู้ ถือหุ้นซึ่งมาประชุม และมี\n", + "สิทธิออกเสียงลงคะแนนมีมติ แก้ไขเพิ่มเติมหนังสือบริคณห์สนธิของบริษัทฯ ข้อ 3 (วัตถุประสงค์\n", + "ของบริษัท) โดยเพิ่มเติมวัตถุประสงค์ข้อ 22 และข้อ 23 ดังนี้ \n", + "- 8 - \n", + " ข้อ 22 ประกอบกิจการเป็นศูนย์บริหารเงินโดยการประกอบธุรกิจบริการรับซื้อภาระผูกพันหรื อ\n", + "เอกสารเรียกเก็บเงิ นรับและจ่ายเงินทุกประเภท ทั้งในและต่างประเทศ การหักกลบรายได้หรือ\n", + "ภาระผูกพันการซื้อขายหรือแลกเปลี่ยนเงินตราต่างประเทศเมื่อได้รับอนุญาตจากหน่วยงานที่\n", + "เกี่ยวข้อง การบริหารความเสี่ยงจากอัตราแลกเปลี่ยนการบริหารความเสี่ยงสินค้าโภคภัณฑ์ การ\n", + "บริหารความเสี่ยงอื่นๆ การบริหารสภาพคล่อง รวมทั้งธุรกิจ อื่นๆ ทุกชนิด ทุกประเภท ที่\n", + "เกี่ยวข้องกับศูนย์บริหารเงินเว้นแต่ในธุรกิจธนาคาร ธุรกิจเงินทุนและธุรกิจเครดิตฟองซิเอร์ \n", + " ข้อ 23 ประกอบกิจการให้บริการด้านการบริหารหรือด้านเทคนิค และการให้บริการสนับสนุนใน\n", + "ด้านต่าง ๆ เช่นการบริ หารงานทั่วไป การวางแผนทางธุรกิจ การ ประสานงานทางธุรกิจ การให้\n", + "คำแนะนำเกี่ยวกับธุรกิจ การให้คำปรึกษาด้านการเงินการจัดการและควบคุมสินเชื่อ การ\n", + "ให้บริการด้านบัญชีและการเงินการวิจัยและพัฒนาผลิตภัณฑ์ การสนับสนุนด้านเทคนิค การ\n", + "ส่งเสริมด้านการต ลาดและการขาย การบริหารด้านงานบุคคลและการฝึกอบรม การวิเคราะห์วิจัย\n", + "ด้านเศรษฐกิจและการลงทุนการจัดการ การจัดทำบัญชีให้กับกลุ่มบริษัท และการให้บริการ\n", + "สนับสนุนอื่นๆ ที่เกี่ยวข้องกับการประกอบกิจการตามวัตถุประสงค์ของบริษัท \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 798,210,8 24 คะแนนคิดเป็นร้อยละ 99.9931 \n", + "ไม่เห็นด้วย 712 คะแนนคิดเป็นร้อยละ 0.0000 \n", + "งดออกเสียง 53,999 คะแนนคิดเป็นร้อยละ 0.0067 \n", + "บัตรเสีย - คะแนนคิดเป็นร้อยละ - \n", + " \n", + "ระเบียบวาระที่ 11 เรื่องอื่นๆ \n", + " - ไม่มี - \n", + " จึงเรียนมาเพื่อทราบ \n", + " ขอแสดงความนับถือ \n", + " \n", + " \n", + " \n", + " (นายชัยวัฒน์ โควาวิสารัช) \n", + " ประธานเจ้าหน้าที่บริหาร กลุ่มบริษัทบางจาก \n", + " และกรรมการผู้จัดการใหญ่ \n", + "ส่วนเลขานุการคณะกรรมการบริษัท \n", + "โทรศัพท์ 0 2335 4000 \n", + "โทรสาร 0 2335 8000 \n", + " \n" + ] + } + ], + "source": [ + "raw_text = read_pdf_all_pages(bcp_pdf_file)\n", + "clean_text = clean_dup_esc_char(raw_text)\n", + "clean_text = clean_by_rules(clean_text,text_rule_file)\n", + "clean_text = clean_by_char_structure(clean_text)\n", + "# print('\\n'.join(clean_text))\n", + "print(clean_text)\n", + "# clean_text" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- 1 - \n", + " \n", + " \n", + "ที่ 10000/027/2566 \n", + " 11 เมษายน 2566 \n", + "เรื่อง แจ้งมติที่ประชุมสามัญผู้ถือหุ้น ประจ าปี 2566 \n", + "เรียน กรรมการและผู้จัดการ \n", + " ตลาดหลักทรัพย์แห่งประเทศไทย \n", + " ตามที่ บริษัท บางจาก คอร์ปอเรชั่น จ ากัด (มหาชน) มีการประชุมสามัญผู้ถือหุ้นประจ าปี 2566 เมื่อวันที่ 11 \n", + "เมษายน 2566 เวลา 13.30 น. ในรูปแบบการประชุมระบบ Hybrid (เข้าร่วมประชุม ณ สถานที่จัดประชุม \n", + "(Physical) และผ่านสื่ออิเล็กทรอนิกส์ ( E-Meeting) ตามพระราชก าหนดว่าด้วยการประชุมผ่านสื่ออิเล็กทรอนิกส์ \n", + "พ.ศ. 2563 รวมถึงกฎหมายและระเบียบอื่นๆ ที่เกี่ยวข้อง ) ได้มีมติที่ประชุมดังนี้ \n", + "ระเบียบวาระที่ 1 รับทราบรายงานของคณะกรรมการเกี่ยวกับผลการด าเนิ นงานของบริษัทฯ ในรอบปี 256 5 \n", + "มติที่ประชุม ที่ประชุมรับทราบรายงานของคณะกรรมการเกี่ยวกับผลการด าเนินงานของบริษัทฯ ในรอบ \n", + "ปี 2565 \n", + "ระเบียบวาระที่ 2 พิจารณาอนุมัติงบการเงินส าหรับปีสิ้น สุดวันที่ 31 ธันวาคม 256 5 \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมาก ของผู้ถือหุ้นซึ่ งมาประชุมและออ กเสียงลงคะแนน มีมติอนุมัติ \n", + "งบการเงินส าหรั บปีสิ้นสุดวันที่ 31 ธันวาคม 2565 ตามที่เสนอ ด้วยคะแนนเสียงดังนี้ \n", + "เห็นด้วย 793,199,243 คะแนน คิดเป็นร้อยละ 99.9725 \n", + "ไม่เห็นด้วย 217,400 คะแนน คิดเป็นร้อยละ 0.0274 \n", + "งดออกเสียง 4,762,601 คะแนน คิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 3 พิจารณาอนุมัติจัดสรรก าไรเพื่อจ่ายเงินปันผลส าหรับผลการด าเนินงานปี 2565 \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมากของผู้ถือหุ้ นซึ่งมาประชุมและออกเสียงลงคะแนน มีมติอ นุมัติจัดสรร\n", + "ก าไรจากบัญชีก าไรสะสมที่ยังไม่ไ ด้จัดสรรเพื่อจ่ายเงินปันผลส าหรับงวดครึ่งปีหลังของปี 256 5 ใน\n", + "อัตราหุ้นละ 1 .00 บาท และเมื่อรวมกับเงินปันผลระหว่างกาลงวดครึ่ งปีแรกของปี 256 5 ในอัตรา\n", + "หุ้นละ 1 .25 บาท จะเป็นเงินปันผล ที่จ่ายในปี 2565 ในอัตราหุ้นละ 2 .25 บาท เป็นเงินรวม\n", + "ประมาณ 3,065 ล้านบาท โดยก าหนดรายชื่อผู้ถือหุ้นเพื่อสิทธิในการรับเงินปันผล ในวันที่ 7 \n", + "มีนาคม 2566 และก าหนดจ่ายเงิ นปันผลในวันที่ 24 เมษายน 2566 ตามที่เสนอ ด้วยคะแนน\n", + "เสียงดังนี้ \n", + " \n", + " \n", + "- 2 - เห็นด้วย 798,154,028 คะแนน คิดเป็นร้อยละ 99.999 8 \n", + "ไม่เห็นด้วย 1,427 คะแนน คิดเป็นร้อยละ 0.0001 \n", + "งดออกเสียง 23,789 คะแนน คิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 4 พิจารณาเลือกตั้ง กรรมการแทนกรรมการที่พ้นจากต าแหน่งตามวาระ \n", + "มติที่ประชุม ที่ประชุมมีมติเลือกตั้งกรรมการที่ออกตามวาระจ านวน 2 ท่าน ให้กลับเข้าด ารงต าแหน่ง เป็น\n", + "กรรมการต่ออีกวาระหนึ่ง ตามที่เสนอ ประกอบด้วย \n", + " (1) พลเอก ทรงวิทย์ หนุนภักดี โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 785,062,182 คะแนน คิดเป็นร้อยละ 98.3918 \n", + "ไม่เห็นด้วย 12,831,350 คะแนน คิดเป็นร้อยละ 1.6081 \n", + "งดออกเสียง 295,112 คะแนน คิดเป็นร้อยละ - \n", + "บัตรเสีย 3,600 คะแนน คิดเป็นร้อยละ - \n", + " (2) นายบุญชอบ สุทธมนัสวงษ์ โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 790,294,730 คะแนน คิดเป็นร้อยละ 99.018 3 \n", + "ไม่เห็นด้วย 7,834,610 คะแนน คิดเป็นร้อยละ 0.9816 \n", + "งดออกเสียง 62,904 คะแนน คิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + " และอนุมัติเลือกตั้งกรรมการใหม่แทนกรรมการที่ พ้นจากต าแหน่ง ตามวาระ จ านวน 3 ท่าน ดังนี้ \n", + " (1) นางวรนุช ภู่อิ่ม โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 795,503 ,595 คะแนน คิดเป็นร้อยละ 99.6710 \n", + "ไม่เห็นด้วย 2,625,745 คะแนน คิดเป็นร้อยละ 0.3289 \n", + "งดออกเสียง 62,904 คะแนน คิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + " (2) นายสุรินทร์ จิรวิศิษฎ์ โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 795,591,378 คะแนน คิดเป็นร้อยละ 99.6819 \n", + "ไม่เห็นด้วย 2,538,062 คะแนน คิดเป็นร้อยละ 0.3180 \n", + "งดออกเสียง 62,804 คะแนน คิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + "(3) นางวิไล ฉัททันต์รัศมี โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 791,026,183 คะแนน คิดเป็นร้อยละ 99.1064 \n", + "ไม่เห็นด้วย 7,131,657 คะแนน คิดเป็นร้อยละ 0.8935 \n", + "งดออกเสียง 34,404 คะแนน คิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + " - 3 - ดังนั้น กรรมการบริษัททั้งคณะภายหลังการ เลือกตั้ง มีจ านวนทั้งสิ้น 15 คน ประกอบด้วย \n", + "1) นายพิชัย ชุณหวชิร ประธานกรรมการ กรรมการอิสระ \n", + "2) นายประสงค์ พูนธเนศ กรรมการอิสระ \n", + "3) ดร. ปรเมธี วิมลศิริ กรรมการอิสระ \n", + "4) นางปริศนา ประหารข้าศึก กรรมการอิสระ \n", + "5) นายนรินทร์ กัลยาณมิตร กรรมการอิสระ \n", + "6) นายอัชพร จารุจินดา กรรมการอิสระ \n", + "7) นายเชาวลิต เอกบุตร กรรมการอิสระ \n", + "8) พลเอก ทรงวิทย์ หนุนภักดี กรรมการอิสระ \n", + "9) พล.ต.ท. ส าราญ นวลมา กรรมการอิสระ \n", + "10) นายสุรินทร์ จิรวิศิษฎ์ กรรมการอิสระ \n", + "11) นางวิไล ฉัททันต์รัศมี กรรมการอิสระ \n", + "12) นายชาญวิทย์ นาคบุรี กรรมการผู้แทน กระทรวงการคลัง \n", + "13) นางวรนุช ภู่อิ่ม กรรมการผู้แทน กระทรวงการคลัง \n", + "14) นายบุญชอบ สุทธมนัสวงษ์ กรรมการผู้แทน ส านักงานประกันสังคม \n", + "15) นายชัยวัฒน์ โควาวิสารัช ประธานเจ้าหน้าที่บริหาร กลุ่มบริษัทบางจาก และ\n", + "กรรมการผู้จัดการใ หญ่และเลขานุการคณะกรรมการบริษัท \n", + "ระเบียบวาระที่ 5 พิจารณาก าหนดค่าตอบแทนกรรมการ \n", + "มติที่ประชุม ที่ประชุมโดยเสียง ไม่น้อยกว่าสองในสามของจ านวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุม มีมติ\n", + "อนุมัติก าหนดค่าตอบแทนกรรมการประจ าปี 2566 ตามที่เสนอ ดังนี้ \n", + "1. ค่าตอบแทนรายเดือนและค่าเบี้ ยประชุม \n", + "คณะกรรมการ ค่าตอบแทน \n", + "รายเดือน \n", + "(บาท/คน) เบี้ยประชุม \n", + "(บาท/ครั้ง/คน) \n", + "(เฉพาะกรรมการที่เข้าประชุม) \n", + "คณะกรรมการบริษัท 45,000 45,000 \n", + "คณะกรรมการชุดย่อย \n", + "1. คณะกรรมการตรวจสอบ 20,000 25,000 \n", + "2. คณะกรรมการสรรหาและก าหนดค่าตอบแทน - 25,000 \n", + "3. คณะกรรมการ บริหารความเสี่ยงทั้งองค์กร - 25,000 \n", + "4. คณะกรรมการ ก ากับดูแลความยั่งยืนและบรรษัทภิบาล - 25,000 \n", + "5. คณะกรรมการชุดย่อยอื่นที่อาจมีการแต่งตั้งโดย\n", + "คณะกรรมการบริษัทตามความจ าเป็นและเหมาะสม\n", + "ในอนาคต - 25,000 \n", + "ทั้งนี้ ประธานกรรมการบริษัท และประธานคณะกรรมการชุดย่อย จะไ ด้รับค่าตอบแทนรายเดือนและ \n", + "ค่าเบี้ยประชุมสูงกว่ากรรมการในอัตราร้อยละ 25 รองประธานกรรมการบริษัท จะได้รับค่าตอบแทน \n", + "รายเดือนและค่าเบี้ยประชุมสูงกว่ากรรมการในอัตราร้อยละ 12.5 - 4 - 2. ค่าตอบแทนที่เป็นโบนัสคณะกรรมการ (ไม่เปลี่ยนแปลง ) \n", + " ร้อยละ 0.75 ของก าไรสุทธิ แต่ ไม่เกิน 3,000,000 บาทต่อกรรมการ 1 ท่าน และให้\n", + "ค านวณจ่ายตามระยะเวลาการด า รงต าแหน่ง โดยประธานกรรมการบริษัทและ \n", + "รองประธานกรรมการบริษัท จะได้รับค่าตอบแทนที่เป็นเงินโบนัส สูงกว่ากรรมการใน\n", + "อัตราร้อยละ 25 และ 12.5 ตามล าดับ \n", + "3. ค่าตอบแทนอื่นของกรรมการ (ไม่เปลี่ยนแปลง ) \n", + " แผนประกันสุขภาพแบบกลุ่มการรักษาพยาบาลผู้ป่วยในและผู้ป่วยนอก ( IPD+OPD) โดย\n", + "มีค่าเบี้ยประกันภัยรายปีรวมจ านวนไม่เกิน 50,000 บาท (ยังไม่รวมภาษีมูลค่าเพิ่ม) ต่อ\n", + "กรรมการ 1 ท่าน \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 785,581,181 คะแนน คิดเป็นร้อยละ 98.4198 \n", + "ไม่เห็นด้วย 11,571,675 คะแนน คิดเป็นร้อยละ 1.4497 \n", + "งดออกเสียง 1,040,699 คะแนน คิดเป็นร้อยละ 0.1303 \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 6 พิจารณาแต่งตั้งและก าหนดค่าตอบแทนผู้สอบบัญชี \n", + "มติที่ประชุม ที่ประชุมโดยเสียงข้างมากของผู้ถือหุ้นซึ่งมาประชุมและออกเสียงลงคะ แนน มีมติแต่งตั้ง \n", + "นายศักดา เกาทัณฑ์ทอง ผู้สอบบัญชีรับอนุญาต ทะเบียนเลข ที่ 4628 หรือนายวัยวัฒน์ \n", + "กอสมานชัยกิจ ผู้สอบบัญชีรับอนุญาต ทะเบียนเลขที่ 6333 หรือนายเจริญ ผู้สัมฤทธิ์เลิศ ผู้สอบ\n", + "บัญชีรับอนุญาต ทะเบียนเลขที่ 4068 จากบริษัท เคพีเอ็มจี ภูมิไชย สอบบัญชี จ ากัด เป็นผู้สอบ\n", + "บัญชีประจ าปี 2566 และก าหนดค่าตอบแทนเป็นจ านวนเงิน 2,040,250 บาท ตามที่เสนอ \n", + "ด้วยคะแนนเสียงดังนี้ \n", + "เห็นด้วย 797,042,144 คะแนน คิดเป็นร้อยละ 99.8612 \n", + "ไม่เห็นด้วย 1,107, 212 คะแนน คิดเป็นร้อยละ 0.1387 \n", + "งดออกเสียง 44,199 คะแนน คิดเป็นร้อยละ - \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 7 พิจารณาอนุมัติการเข้าซื้อหุ้นสามัญและการท าค าเสนอซื้อหลักทรัพย์ที่เหลือทั้งหมดใน บริษัท \n", + "เอสโซ่ (ประเทศไทย) จ ากัด (มหาชน) ซึ่งเป็นรายการได้มาซึ่งสินทรัพย์ของบริษัทฯ \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อยกว่าสามใ นสี่ของจ านวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งม าประชุมและมีสิทธิ\n", + "ออกเสียงลงคะแนน มีมติอนุมัติ ดังนี้ \n", + "(1) การเข้าซื้อหุ้นสามัญโดยตรงจ านวน 2,283,750,000 หุ้นในเอสโซ่ (คิดเป็นประมาณร้อยละ \n", + "65.99 ของหุ้นที่ออกจ าหน่ายแล้วทั้งหมดของเอสโซ่ ณ วันที่ 30 กันยายน 2565) และการ\n", + "ท าค าเสนอซื้อหุ้นสามัญที่เหลือทั้งหมดในเอสโซ่ เป็นจ านวนไม่เกิน 1,177,108,000 หุ้น (คิด\n", + "เป็นประมาณร้อยละ 34.01 ของหุ้นที่ออกจ าหน่ายแล้วทั้งหมดของเอสโซ่ ณ วันที่ 30 - 5 - กันยายน 2565) ภายหลังจากที่ธุรกรรมการซื้อขายหุ้นเสร็จสิ้น เพื่อได้มาซึ่งหุ้นที่เหลือ\n", + "ทั้งหมดในเอสโซ่ ในราคาเดียวกันกับราคาซื้อหุ้นเอสโซ่ในธุรกรรมการซื้ อขายหุ้น และ \n", + "(2) การมอบอ านาจให้ประธานเจ้าหน้าที่บริหารกลุ่มบริษัทบางจากและกรรมการผู้จัดการใหญ่ \n", + "หรือผู้ที่ประธานเจ้าหน้าที่บริหารกลุ่ม บริษัทบางจากและกรรมการผู้จัดการใหญ่มอบอ านาจ \n", + "เป็นผู้มีอ านาจในการเจรจา ต่อรองเงื่อนไข ท าความตกลง ก าหนด แก้ไข เปลี่ยนแปลง\n", + "รายละเอียดและลงนามในสัญญาซื้อขายหุ้ น ตลอดจนเอกสารต่างๆ ที่เกี่ยวข้อง และ\n", + "ด าเนินการใดๆ ที่จ าเป็นในการเข้าท าธุรกรรมฯ และสัญญาหรือและเอกสาร อื่นใด รวมถึง\n", + "การด าเนินการใดๆ ที่เกี่ยวข้องให้เป็นไปตามเงื่อนไขของสัญญา และการติดต่อกับหน่วยงาน\n", + "ราชการหรือหน่วยงานก ากับดูแลที่เกี่ยวข้อง ตลอดจนด าเนินการต่างๆ ตามที่จ าเป็น \n", + "และสมควรเพื่อประโยชน์สูงสุดของบริษัท ฯ และเป็นไปตามเนื้อหาข้างต้น เพื่อให้การท า\n", + "ธุรกรรมฯ ดังกล่าวเสร็จสมบูรณ์ รวมทั้ง บริหารจัดการและท าธุรกรรมที่เกี่ยวข้องได้ตาม\n", + "ความเหมาะสม \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 797,134,359 คะแนน คิดเป็นร้อยละ 99.8583 \n", + "ไม่เห็นด้วย 3,212 คะแนน คิดเป็นร้อยละ 0.0004 \n", + "งดออกเสียง 1,127,884 คะแนน คิดเป็นร้อยละ 0.1412 \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 8 พิจารณาอนุมัติวงเงินในการออกและเสนอขายหุ้นกู้ ระยะเวลา 5 ปี (ปี 2566 - 2570) \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อยกว่าสามในสี่ของจ านวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุ มและมีสิทธิ\n", + "ออกเสียงลงคะแนน มีมติ อนุมัติวงเงินในการออกและเสนอขายหุ้นกู้ รวมไม่เกิน 80 ,000 ล้านบาท \n", + "หรือสกุลเงินอื่นเทียบเท่า ณ ขณะใดขณะหนึ่ง ระยะเวลา 5 ปี (ปี 2566 -2570) และยกเลิกวงเงิน\n", + "คงเหลือ 6 ,000 ล้านบาท จากมติที่ประชุมสามัญผู้ถือหุ้นปร ะจ าปี 2562 ตามที่เสนอ ด้วยคะแนน\n", + "เสียงดังนี้ \n", + "เห็นด้วย 794,160,1 97 คะแนน คิดเป็นร้อยละ 99.4857 \n", + "ไม่เห็นด้วย 3,069,954 คะแนน คิดเป็นร้อยละ 0.3845 \n", + "งดออกเสียง 1,035,304 คะแนน คิดเป็นร้อยละ 0.1296 \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + "ระเบียบวาระที่ 9 พิจารณาอนุมัติแก้ ไขข้อบังคับบริษัทฯ \n", + "มติที่ประชุม ที่ประชุมโดยเสียงไม่น้อ ยกว่าสามในสี่ของจ า นวนเสียงทั้งหมดของผู้ถือหุ้นซึ่งมาประชุมและมีสิทธิ\n", + "ออกเสียงลงคะแนน มีมติอนุมัติแก้ไขข้อบังคับของบริษัท ข้อ ข้อ 16 , 19, 29, 31, 41 และ 47\n", + "เป็นดังนี้ \n", + " ข้อ 16. ในการเรียกประชุมผู้ถือหุ้น ให้คณะกรรมการจัดท าเป็นหนังสือนัดประชุม ระบุสถานที่ วัน \n", + "เวลา ระเบียบวาระการ ประชุม และเรื่องที่จะเสนอต่อที่ประชุม พร้อมด้วยรายละเอียดตาม- 6 - สมควร โดยระบุว่าเป็นเรื่องที่จะเสนอเพื่อทราบ เพื่ออนุมัติหรือเพื่อพิจารณา รวมทั้งความ เห็น\n", + "ของกรรมการในเรื่องดังกล่าวและจัดส่งให้ผู้ถือหุ้นและนายทะเบียนทราบไม่น้อยกว่าเจ็ด(7) วัน\n", + "ก่อนวันประชุม และโฆษ ณาค าบอกกล่าวนัดประชุม ตามหลักเกณฑ์ที่กฎหมายก าหนด สาม(3) วัน\n", + "ติดต่อกัน และไม่น้อยกว่าสาม(3) วันก่อนวันประชุมด้วย \n", + " สถานที่ในการประชุมอาจ ก าหนดเป็นสถานที่อื่นนอกเหนือไปจากท้องที่อันเป็นที่ตั้งส านักงาน\n", + "ใหญ่ของบริษัท หรือจังหวัดใกล้เคียงตามที่คณะกร รมการจะก าหนดก็ได้ \n", + " การจัดส่งหนังสือนัดประชุมให้ผู้ถือหุ้นตามวรรคหนึ่ง อาจส่งโดยวิธีการทางอิเล็กทรอนิกส์ หรือ\n", + "ตามหลักเกณฑ์ที่กฎหมายก าหนด \n", + " ข้อ 19. ในการประชุมผู้ถือหุ้น ผู้ถือหุ้นอาจมอบฉันทะให้บุคคลอื่นซึ่งบรรลุนิติภาวะเข้าประชุม\n", + "และออกเสียงแทนตนในการประชุมก็ได้ หนังสือมอบฉันทะจ ะต้องลงวันที่และลายมือชื่อของ ผู้ถือ\n", + "หุ้นที่มอบฉันทะและเป็นไปตามแบบที่ นายทะเบียนก าหนด \n", + "หนังสือมอบฉันทะนี้จะต้องมอบให้แ ก่ประธานกรรมการหรือผู้ที่ประธานกรรมการก าหนด \n", + "ณ สถานที่ประชุมก่อนผู้รับมอบฉันทะเข้าประชุม \n", + "การมอบฉันทะตามวรรคหนึ่ง อาจด าเนินกา รโดยวิธีการทางอิเล็ กทรอนิกส์หรือ ตามหลักเกณฑ์ที่\n", + "กฎหมายก าหนด \n", + "ข้อ 29. ให้ประธานกรรมการเป็นผู้เรียกประชุมคณะกรรมการ \n", + "เมื่อมีเหตุอันสมควรหรือเพื่อรักษาสิทธิหรือประโยชน์ของบริษัท กรรมการตั้งแต่สองคนขึ้นไปจะ\n", + "ร่วมกันร้องขอให้ประธานกรรมการเรียก ประชุมคณะกรรมการได้ โดย ต้องระบุเรื่องและเ หตุผลที่จะ\n", + "เสนอให้ที่ประชุมพิจารณาไปด้วย ในกรณีเช่นนี้ให้ประธานกรรมการเรียกและก าหนดวันประชุม\n", + "ภายในสิบสี่วันนับแต่วันที่ได้รับการร้องขอ \n", + "ในกรณีที่ประธานกรรมการไม่ด าเนินการตามวรรคสอง กรรมการซึ่งร้องขออาจร่วมกันเรียกและ\n", + "ก าหนดวันประชุมคณะกรรมการเ พื่อพิจารณาเรื่องที่ ร้องขอได้ภายในสิบสี่วัน นับแต่วันครบ\n", + "ก าหนดระยะเวลาตามวรรคสอง \n", + "ในกรณีที่ไม่มีประธานกรรมการไม่ว่าด้วยเหตุใด ให้รองประธานกรรมการเป็นผู้เรียกประชุม\n", + "คณะกรรมการ ในกรณีที่ไม่มีรองประธานก รรมการไม่ว่าด้วยเหตุใด กรรมการตั้งแต่สองคนขึ้นไป\n", + "อาจร่วมกันเรียกประชุมคณะกรรมกา รได้ \n", + "ให้เลขานุการคณะกรรมการเป็นผู้แจ้งนัดการประชุมคณะกรรมการตามที่ ได้รับมอบหมาย \n", + "ข้อ 31. ในการเรียกประชุมคณะกรรมการ ให้มีหนังสือนัดประชุมส่งมอบให้แก่กรรมการหรือ\n", + "ผู้แทนของกรรมการ ไม่น้อยกว่าสาม(3) วันก่อนวันประชุม เว้นแต่ในกรณีจ าเป็นรีบด่วนเพื่ อรักษา\n", + "สิทธิหรือประโยชน์ของบริษัทจะแจ้งการนัดประชุมโดยวิธีอื่นและก าหนดวันประชุมให้เร็วกว่านั้น\n", + "ก็ได้ - 7 - ในการจัดส่งหนังสือเชิญประชุมคณะกรรมการบริษัท รวมทั้งเอกสารประกอบการประชุม\n", + "คณะกรรมการ บริษัทอ าจจัดส่ง โดยวิธีการทางอิเล็กทรอนิกส์หรือตามหลักเกณฑ์ที่กฎหมาย\n", + "ก าหนด \n", + "ข้อ 41. การจ่ายเงินปันผลประจ าปีจะกระท าได้ก็แต่โดยมติของที่ประชุมผู้ถือหุ้น \n", + "ภายใต้ข้อบังคับข้อ 42. ห้ามมิให้แบ่งเงินปันผลจากเงินประเภทอื่นนอกจากก าไร ในกรณีที่บริษัท\n", + "ยังมียอดขาดทุนสะสมอยู่ห้ามมิ ให้แบ่งเงินปันผล \n", + "เงินปันผลส าหรับหุ้นสามัญให้แบ่งตามจ านวนหุ้น หุ้ นละเท่าๆ กัน \n", + "คณะกรรมการอาจจ่ายเงินปันผลระหว่างกาลให้แก่ผู้ถือหุ้นได้เป็นครั้งคราว ในเมื่อเห็นว่าบริษัทมี\n", + "ผลก าไรสมควรพอที่จะท าเช่นนั้น มติของคณะกรรมการดังกล่าวต้องประกอบด้วยคะแนนเสียงไม่\n", + "น้อยกว่าสามในสี่(3/4) ของจ านวนกรรมการซึ่งมาประชุม และให้รายงานให้ที่ปร ะชุมผู้ถือหุ้น\n", + "ทราบในการประชุมคราวต่อไป \n", + "การจ่ายเงินปันผล ให้กระท าภายในหนึ่ง (1) เดือน นับแต่วันที่ที่ประชุมผู้ถือหุ้นหรือ\n", + "คณะกรรมการลงมติ แล้วแต่กรณี ทั้งนี้ ให้แจ้ง ไปยังผู้ถือหุ้นตามหลักเกณฑ์ที่กฎหมายก าหนด และ\n", + "ให้โฆษณาค าบอกกล่าวการจ่ายเงินปันผลนั้น ตามหลักเกณฑ์ที่กฎหมายก าหนด ภายในหนึ่ง(1) \n", + "เดือน นับแต่วันที่ที่ประชุมผู้ถือหุ้นอนุมัติหรือคณะกรรมการลงมติแล้วแต่กรณี \n", + "ข้อ 47. ตราของบริษัทมีดังประทับไว้นี้ \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 798,176,609 คะแนน คิดเป็นร้อยละ 99.9888 \n", + "ไม่เห็นด้วย 712 คะแนน คิดเป็นร้อยละ 0.0000 \n", + "งดออกเสียง 88,214 คะแนน คิดเป็นร้อยละ 0.0110 \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + " \n", + "ระเบียบวาระที่ 10 พิจารณาอนุมัติแก้ไขหนังสือบริคณห์สนธิข้อ 3 (วัตถุประสงค์ของบริษัท) \n", + "มติที่ประชุม ที่ที่ประชุมโดยเสียงไม่น้อยกว่าสามในสี่ของจ านวนเสียงทั้งหมดของผู้ ถือหุ้นซึ่งมาประชุม และมี\n", + "สิทธิออกเสียงลงคะแนน มีมติ แก้ไขเพิ่มเติมหนังสือบริคณห์สนธิของบริษัทฯ ข้อ 3 (วัตถุประสงค์\n", + "ของบริษัท) โดยเพิ่มเติมวัตถุประสงค์ข้อ 22 และข้อ 23 ดังนี้ \n", + "- 8 - \n", + " ข้อ 22 ประกอบกิจการเป็นศูนย์บริหารเงิน โดยการประกอบธุรกิจบริการรับซื้อภาระผูกพันหรื อ\n", + "เอกสารเรียกเก็บเงิ น รับและจ่ายเงินทุกประเภท ทั้งในแ ละต่างประเทศ การหักกลบรายได้หรือ\n", + "ภาระผูกพัน การซื้อขายหรือแลกเปลี่ยนเงินตราต่างประเทศเมื่อได้รับอนุญาตจากหน่วยงานที่\n", + "เกี่ยวข้อง การบริหารความเสี่ยงจากอัตราแลกเปลี่ยน การบริหารความเสี่ยงสินค้าโภคภัณฑ์ การ\n", + "บริหารความเสี่ยงอื่น ๆ การบริหารสภาพคล่อง รวมทั้งธุรกิจ อื่น ๆ ทุกชนิด ทุกประเภท ที่\n", + "เกี่ยวข้องกับศูนย์บริหารเงิน เว้นแต่ในธุรกิจธนาคาร ธุรกิจเงินทุน และธุรกิจเครดิตฟองซิเอร์ \n", + " ข้อ 23 ประกอบกิจการให้บริการด้านการบริหารหรือด้านเทคนิค และการให้บริการสนับสนุนใน\n", + "ด้านต่าง ๆ เช่น การบริ หารงานทั่วไป การวางแผนทางธุรกิจ การ ประสานงานทางธุรกิจ การให้\n", + "ค าแนะน าเกี่ยวกับธุรกิจ การให้ค าปรึกษาด้านการเงิน การจัดการและควบคุมสินเชื่อ การ\n", + "ให้บริการด้านบัญชีและการเงิน การวิจัยและพัฒนาผลิตภัณฑ์ การสนับสนุนด้านเทคนิค การ\n", + "ส่งเสริมด้านการต ลาดและการขาย การบริห ารด้านงานบุคคลและการฝึกอบรม การวิเคร าะห์วิจัย\n", + "ด้านเศรษฐกิจและการลงทุน การจัดการ การจัดท าบัญชีให้กับกลุ่มบริษัท และการให้บริการ\n", + "สนับสนุนอื่น ๆ ที่เกี่ยวข้องกับการประกอบกิจการตามวัตถุประสงค์ของบริษัท \n", + "โดยมีคะแนนเสียงดังนี้ \n", + "เห็นด้วย 798,210,8 24 คะแนน คิดเป็นร้อยละ 99.9931 \n", + "ไม่เห็นด้วย 712 คะแนน คิดเป็นร้อยละ 0.0000 \n", + "งดออกเสียง 53,999 คะแนน คิดเป็นร้อยละ 0.0067 \n", + "บัตรเสีย - คะแนน คิดเป็นร้อยละ - \n", + " \n", + "ระเบียบวาระที่ 11 เรื่องอื่นๆ \n", + " - ไม่มี - \n", + " จึงเรียนมาเพื่อทราบ \n", + " ขอแสดงความนับถือ \n", + " \n", + " \n", + " \n", + " (นายชัยวัฒน์ โควาวิสารัช) \n", + " ประธานเจ้าหน้าที่บริหาร กลุ่มบริษัทบางจาก \n", + " และกรรมการผู้จัดการใหญ่ \n", + "ส่วนเลขานุการคณะกรรมการบริษัท \n", + "โทรศัพท์ 0 2335 4000 \n", + "โทรสาร 0 2335 8000 \n", + " \n" + ] + } + ], + "source": [ + "print(raw_text)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/data/scripts/pantip_2G/clean_data.py b/src/data/scripts/pantip_2G/clean_data.py new file mode 100644 index 0000000..2ec3471 --- /dev/null +++ b/src/data/scripts/pantip_2G/clean_data.py @@ -0,0 +1,106 @@ +import argparse +import glob +import tqdm +import jsonlines +import html +import re +import os + +SOURCE = "source" +SOURCE_ID = "source_id" +TEXT = "text" +CREATED_DATE = "created_date" +UPDATED_DATE = "updated_date" + +parser = argparse.ArgumentParser() + +parser.add_argument("--input_folder", help="Name of an input folder", required=True) +parser.add_argument( + "--output_folder", + help='Name of an output folder (Default: "clean")', + default="clean", +) + +args = parser.parse_args() + + +def clean_data(text): + # Replace
with newline + text = text.replace("
", "\n") + # Replace tab+colon with tab + text = text.replace("\t:", "\t") + # Decode HTML entities + text = html.unescape(text) + # Remove HTML tags + text = re.sub(r"<.*?>", "", text) + # Strip leading and trailing whitespace + text = text.strip() + + return text + + +def reformat_jsonl(input_file, output_file, source): + """ + clean data and change format to + "text": "Data", + "source": "Source of the data", + "source_id": "id of the original item in source data", + "created_date": "Created date", + "updated_date": "Updated date" + """ + with jsonlines.open(input_file, "r") as reader, jsonlines.open( + output_file, "w" + ) as writer: + current_tid = None + current_text = "" + + for item in reader.iter(skip_invalid=True): + tid = item["tid"] + cid = item["cid"] + desc = item.get("desc") + + if tid != current_tid: + # Write the previous line (if any) to the output file + if current_tid is not None: + data = { + SOURCE: source, + SOURCE_ID: tid, + TEXT: clean_data(current_text.strip()), + CREATED_DATE: item["updated_time"], + UPDATED_DATE: item["updated_time"], + } + writer.write(data) + + # Start a new line + current_tid = tid + current_text = "" + + if cid == "0": + # Forum entry with title + current_text += "กระทู้ {} เนื้อหา {} ".format(item["title"], desc) + else: + # Comment related to the current forum entry + current_text += "ความคิดเห็นที่ {} {} ".format(cid, desc) + + # Write the last line to the output file + if current_tid is not None: + data = { + SOURCE: source, + SOURCE_ID: tid, + TEXT: clean_data(current_text.strip()), + CREATED_DATE: item["updated_time"], + UPDATED_DATE: item["updated_time"], + } + writer.write(data) + + +if __name__ == "__main__": + for path in tqdm.tqdm(glob.glob(args.input_folder + "/**/*.jsonl")): + source = path.replace(args.input_folder, "") + des_path = args.output_folder + source + des_folder = des_path.split("\\")[:-1] + des_folder = "\\".join(des_folder) + + os.makedirs(des_folder, exist_ok=True) + + reformat_jsonl(path, des_path, source) diff --git a/src/data/scripts/pantip_3G/reformat.py b/src/data/scripts/pantip_3G/reformat.py new file mode 100644 index 0000000..f56a6c2 --- /dev/null +++ b/src/data/scripts/pantip_3G/reformat.py @@ -0,0 +1,116 @@ +import argparse +import glob +import tqdm +import jsonlines +import html +import re +import os +import gzip + +SOURCE = "source" +SOURCE_ID = "source_id" +TEXT = "text" +CREATED_DATE = "created_date" +UPDATED_DATE = "updated_date" + +parser = argparse.ArgumentParser() + +parser.add_argument("--input_folder", help="Name of an input folder", required=True) +parser.add_argument( + "--output_folder", + help='Name of an output folder (Default: "clean")', + default="clean", +) + +args = parser.parse_args() + + +def clean_text(value): + if isinstance(value, str): + # Replace tab+colon with tab + value = value.replace("\t:", "\t") + # Decode HTML entities + value = html.unescape(value) + # Replace
with newline + value = value.replace("
", "\n") + # Remove HTML tags + value = re.sub(r"<.*?>", "", value) + # Strip leading and trailing whitespace + value = value.strip() + + return value + + +def reformat_jsonl(input_file, output_file, source): + with gzip.open(input_file, "rt") as gzip_file, jsonlines.open( + output_file, "w" + ) as writer: + reader = jsonlines.Reader(gzip_file) + current_tid = None + current_data = { + "text": "", + "source": source, + "source_id": current_tid, + "created_date": "", + "updated_date": "", + "meta": "", + } + + for item in reader.iter(skip_invalid=True): + tid = item["tid"] + cid = item["cid"] + desc = item.get("desc") + + if tid != current_tid: + # Write the previous line (if any) to the output file + if current_tid is not None: + current_data["text"] = clean_text(current_data["text"]) + writer.write(current_data) + + # Start a new line + current_tid = tid + current_data = { + "text": "", + "source": source, + "source_id": current_tid, + "created_date": item.get("created_time"), + "updated_date": item.get("updated_time"), + "meta": None, + } + + if cid == "0": + # Forum entry with title + current_data["text"] = "กระทู้ {} เนื้อหา {} ".format( + item["title"], desc + ) + current_data["text"] += "ประเภท {} ".format(item.get("type", "")) + current_data["text"] += "เกี่ยวกับ {} ".format(item.get("tags", "")) + + current_data["source"] = source + current_data["source_id"] = tid + current_data["updated_date"] = item.get("updated_time") + current_data["created_date"] = item.get("created_time") + + else: + # Comment related to the current forum entry + current_data["text"] += "ความคิดเห็นที่ {} {} ".format(cid, desc) + + # Write the last line to the output file + if current_tid is not None: + current_data["text"] = clean_text(current_data["text"]) + writer.write(current_data) + + +if __name__ == "__main__": + for path in tqdm.tqdm(glob.glob(args.input_folder + "/*.jsonl.gz")): + source = path.replace(args.input_folder, "") + des_path = args.output_folder + source + des_folder = des_path.split(os.sep)[:-1] + des_folder = os.sep.join(des_folder) + + os.makedirs(des_folder, exist_ok=True) + + des_path = des_path.replace(".gz", "") + + reformat_jsonl(path, des_path, "pantip_3g") + print("done {}".format(path)) diff --git a/src/data/scripts/pile/convert_the_pile.py b/src/data/scripts/pile/convert_the_pile.py new file mode 100644 index 0000000..d0e154b --- /dev/null +++ b/src/data/scripts/pile/convert_the_pile.py @@ -0,0 +1,59 @@ +from datasets import Dataset +from argparse import ArgumentParser + +import zstandard as zstd +import os +import tqdm +import json + +DATASET_NAME = "pile" +NULL = "null" +TEXT_KEY = "text" +META_KEY = "meta" +SOURCE_KEY = "source" +SOURCE_ID_KEY = "source_id" +CREATED_DATE_KEY = "create_date" +UPDATED_DATE_KEY = "update_date" +EVAL_SET_NAME = "eval" + + +def data_generator(jsonl_compressed_directory): + for jsonl_file in tqdm.tqdm(os.listdir(jsonl_compressed_directory)): + jsonl_file_path = os.path.join(jsonl_compressed_directory, jsonl_file) + i = 0 + file_info = os.path.basename(jsonl_file).split(".") + # check zst compress + if file_info[-1] != "zst": + continue + file_name = file_info[0] + with zstd.open(open(jsonl_file_path, "rb"), "rt", encoding="utf-8") as file: + for line in file: + data = json.loads(line) + yield { + TEXT_KEY: data[TEXT_KEY], + SOURCE_KEY: DATASET_NAME, + SOURCE_ID_KEY: f"{file_name}_{i}", + CREATED_DATE_KEY: NULL, + UPDATED_DATE_KEY: NULL, + META_KEY: data[META_KEY], + } + i += 1 + + +if __name__ == "__main__": + parser = ArgumentParser() + parser.add_argument("jsonl_compressed_directory") + parser.add_argument("output_hf_directory") + parser.add_argument("--validation_size", default=0.001, type=float) + parser.add_argument("--seed", default=42, type=int) + parser.add_argument("--num_proc", default=4, type=int) + + args = parser.parse_args() + + dataset = Dataset.from_generator( + data_generator, + gen_kwargs={"jsonl_compressed_directory": args.jsonl_compressed_directory}, + ) + split = dataset.train_test_split(test_size=args.validation_size, seed=args.seed) + split[EVAL_SET_NAME] = split.pop("test") + split.save_to_disk(args.output_hf_directory, num_proc=args.num_proc) diff --git a/src/data/scripts/split_data/README.md b/src/data/scripts/split_data/README.md new file mode 100644 index 0000000..02c338e --- /dev/null +++ b/src/data/scripts/split_data/README.md @@ -0,0 +1,29 @@ +# JSONL File Splitter +This Python script is designed to split a large JSONL (JSON Lines) file into three separate sets: train, test, and validation. It's a useful tool for preparing data for training, ensuring that you have distinct datasets for training, testing, and validation. + +## Usage +In the SLURM script, modify the last line to specify the input JSONL file path and the desired test and validation set sizes: +```bash +python split_jsonl.py --test_size 0.001 --validation_size 0.001 +``` +Replace with the path to your JSONL file. +Adjust the --test_size and --validation_size options to set the desired proportions for the test and validation sets. + +## Output +Once the SLURM job is completed, the script will split the input JSONL file into three separate files: + +*_train.jsonl: Contains the training data. +*_test.jsonl: Contains the test data. +*_validation.jsonl: Contains the validation data. +The files will be saved in the following directories: + +Data/train +Data/test +Data/validation + +## Example +Here's an example SLURM script command: +```bash +python split_jsonl.py /scratch/lt200056-opgpth/large_data/mC4/mc4_th_new.jsonl --test_size 0.001 --validation_size 0.001 +``` +This command splits the mc4_th_new.jsonl file located in /scratch/lt200056-opgpth/large_data/mC4/ into train, test, and validation sets with a test size and validation size of 0.1% each. diff --git a/src/data/scripts/split_data/split_jsonl.py b/src/data/scripts/split_data/split_jsonl.py new file mode 100644 index 0000000..a61179a --- /dev/null +++ b/src/data/scripts/split_data/split_jsonl.py @@ -0,0 +1,104 @@ +import random +import jsonlines +import os +import argparse + +# Create the train, test, and validation directories +train_directory = "Data/train" +test_directory = "Data/test" +validation_directory = "Data/validation" +os.makedirs(train_directory, exist_ok=True) +os.makedirs(test_directory, exist_ok=True) +os.makedirs(validation_directory, exist_ok=True) + + +# Function to split a list into train, test, and validation sets +def split_data(data, test_size, validation_size): + random.shuffle(data) + test_index = int(len(data) * test_size) + validation_index = int(len(data) * (test_size + validation_size)) + return data[validation_index:], data[:test_index], data[test_index:validation_index] + + +# Function to split a .jsonl file into train, test, and validation files +def split_jsonl_file(file_path, test_size, validation_size): + # Get the original file name + file_name = os.path.basename(file_path) + file_name_without_extension = os.path.splitext(file_name)[0] + + # Create the train, test, and validation file paths + train_file_path = os.path.join( + train_directory, f"{file_name_without_extension}_train.jsonl" + ) + test_file_path = os.path.join( + test_directory, f"{file_name_without_extension}_test.jsonl" + ) + validation_file_path = os.path.join( + validation_directory, f"{file_name_without_extension}_validation.jsonl" + ) + + # Open the input file for reading and the output files for writing + try: + with jsonlines.open(file_path, "r") as reader, jsonlines.open( + train_file_path, "w" + ) as train_writer, jsonlines.open( + test_file_path, "w" + ) as test_writer, jsonlines.open( + validation_file_path, "w" + ) as validation_writer: + # Process the file in chunks + chunk_size = 10000 # Adjust the chunk size based on available memory + while True: + chunk = [] + for line in iter(reader): # Create an iterator from the reader + chunk.append(line) + if len(chunk) >= chunk_size: + break + else: + break # Exit the while loop if no more lines to read + + # Split the chunk into train, test, and validation sets + train_chunk, test_chunk, validation_chunk = split_data( + chunk, test_size, validation_size + ) + + # Write the train data to the train file + train_writer.write_all(train_chunk) + + # Write the test data to the test file + test_writer.write_all(test_chunk) + + # Write the validation data to the validation file + validation_writer.write_all(validation_chunk) + + except (OSError, jsonlines.InvalidLineError) as e: + print(f"Error processing file: {file_path}. {str(e)}") + return + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Split a .jsonl file into train, test, and validation files." + ) + parser.add_argument("file_path", type=str, help="Path to the JSONL file to split.") + parser.add_argument( + "--test_size", + type=float, + default=0.01, + help="Percentage of data to use for the test set (default: 0.1)", + ) + parser.add_argument( + "--validation_size", + type=float, + default=0.001, + help="Percentage of data to use for the validation set (default: 0.2)", + ) + args = parser.parse_args() + file_path = args.file_path + test_size = args.test_size + validation_size = args.validation_size + + print(f"Splitting file: {file_path}") + split_jsonl_file(file_path, test_size, validation_size) + + print("Splitting of .jsonl file into train/test/validation sets completed.") diff --git a/src/data/scripts/split_data/submit.sh b/src/data/scripts/split_data/submit.sh new file mode 100644 index 0000000..d560e8c --- /dev/null +++ b/src/data/scripts/split_data/submit.sh @@ -0,0 +1,15 @@ +#!/bin/bash +#SBATCH -p compute +#SBATCH --gpus=0 +#SBATCH -N 1 -c 32 +#SBATCH --ntasks-per-node=1 +#SBATCH -t 01:00:00 +#SBATCH -A lt200056 +#SBATCH -J split-test + +ml Miniconda3 +conda deactivate +conda activate /project/lt200056-opgpth/decontamination/.conda/env + +python src/data/scripts/split_data/split_jsonl.py /scratch/lt200056-opgpth/large_data/mC4/mc4_th_new.jsonl --test_size 0.001 --validation_size 0.001 +python src/data/scripts/split_data/split_jsonl.py /scratch/lt200056-opgpth/large_data/CC100/cc100_th_new.jsonl --test_size 0.001 --validation_size 0.001 diff --git a/src/data/setup.py b/src/data/setup.py new file mode 100644 index 0000000..1e6fba8 --- /dev/null +++ b/src/data/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup + +setup( + name="openthaigpt_pretraining_data", + version="0.1", + packages=["openthaigpt_pretraining_data"], +) diff --git a/src/evaluation/README.md b/src/evaluation/README.md new file mode 100644 index 0000000..406aa1f --- /dev/null +++ b/src/evaluation/README.md @@ -0,0 +1 @@ +# Model: Evaluation diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/__init__.py b/src/evaluation/openthaigpt_pretraining_evaluation/__init__.py new file mode 100644 index 0000000..c749898 --- /dev/null +++ b/src/evaluation/openthaigpt_pretraining_evaluation/__init__.py @@ -0,0 +1,2 @@ +"""Top-level package for OpenThaiGPT Evaluation.""" +__version__ = "0.1.0" diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/__init__.py b/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/classification/__init__.py b/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/classification/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/machine_translation/__init__.py b/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/machine_translation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/question_answering/__init__.py b/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/question_answering/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/summarization/__init__.py b/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/summarization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/token_classification/__init__.py b/src/evaluation/openthaigpt_pretraining_evaluation/auto_evaluation/token_classification/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/example.py b/src/evaluation/openthaigpt_pretraining_evaluation/example.py new file mode 100644 index 0000000..b81257f --- /dev/null +++ b/src/evaluation/openthaigpt_pretraining_evaluation/example.py @@ -0,0 +1,15 @@ +SQUARE_TEST_CASES = [ + {"x": 1, "y": 1}, + {"x": 2, "y": 4}, + {"x": 3, "y": 9}, + {"x": 4, "y": 16}, + {"x": 5, "y": 25}, +] + +CUBE_TEST_CASES = [ + {"x": 1, "y": 1}, + {"x": 2, "y": 8}, + {"x": 3, "y": 27}, + {"x": 4, "y": 64}, + {"x": 5, "y": 125}, +] diff --git a/src/evaluation/openthaigpt_pretraining_evaluation/human_preference/human-preference-eval.ipynb b/src/evaluation/openthaigpt_pretraining_evaluation/human_preference/human-preference-eval.ipynb new file mode 100644 index 0000000..265e316 --- /dev/null +++ b/src/evaluation/openthaigpt_pretraining_evaluation/human_preference/human-preference-eval.ipynb @@ -0,0 +1,613 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0e843095-d88e-466d-97e3-53fa521f52ef", + "metadata": {}, + "outputs": [], + "source": [ + "# common\n", + "\n", + "# common imports\n", + "import sys\n", + "import os\n", + "from pathlib import Path\n", + "from typing import Any, Callable, Dict, Literal, Optional, Protocol, Tuple, List\n", + "from functools import cmp_to_key\n", + "\n", + "import json\n", + "\n", + "# Add our code to import path\n", + "sys.path.insert(0, \"/workspace/code\")\n", + "\n", + "from otgpt_hft.data_model.serial.store import Store\n", + "from otgpt_hft.data_model.serial.entry import SerializedEntry\n", + "from otgpt_hft.data_model.source import OAnnoSource\n", + "from otgpt_hft.data_model.dialogue.graph import DialogueGraph\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2f2cb732-046d-4cd7-b572-729cd259f649", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data_split_dir /workspace/data/store/Thaweewat-oasst1_th/dev-2024-02-12--2\n" + ] + } + ], + "source": [ + "# load dev split\n", + "dataset_name = \"Thaweewat-oasst1_th\"\n", + "split = \"dev-2024-02-12--2\"\n", + "\n", + "# NOTE: replace with path to Human Feedback Tool data store\n", + "data_split_dir = Path(f\"/workspace/data/store/{dataset_name}/{split}\")\n", + "print(\"data_split_dir\", data_split_dir)\n", + "\n", + "os.makedirs(data_split_dir, exist_ok=True)\n", + "store = Store(SerializedEntry, data_split_dir)\n", + "\n", + "# loading annotation storage\n", + "await store.load_chunks()\n", + "\n", + "# user for computing scores\n", + "# NOTE: must be use with complete annotation\n", + "# this script does not work with partial annotation\n", + "user = \"user/\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bea7c44f-ccce-4a0d-ab38-e910133bd3b7", + "metadata": {}, + "outputs": [], + "source": [ + "# get all data entries\n", + "entries = await store.get_entries(0, len(store))" + ] + }, + { + "cell_type": "markdown", + "id": "8d7f5263-e5ae-469d-845c-b2878bc466a0", + "metadata": {}, + "source": [ + "Show annotation of a given user" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "e6a7df5e-1867-4528-9691-e67c3344dcf3", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "entry 0 b2ea0598-3bdc-4d91-a9c4-ea2dd8db47fd\n", + "openai/chatgpt-3.5/2024-02-06\n", + "=\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "Thaweewat-oasst1_th\n", + "=\n", + "SeaLLMs/SeaLLM-7B-v2\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "aisingapore/sealion7b-instruct-nc\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "llama2-7b-finetune-hf\n", + "=\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + ">\n", + "scb10x/typhoon-7b\n", + "================================================================\n", + "entry 1 3e0fc4b0-ac79-4cd3-842c-aebb81231eb5\n", + "Thaweewat-oasst1_th\n", + ">\n", + "openai/chatgpt-3.5/2024-02-06\n", + "=\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "llama2-7b-finetune-hf\n", + "=\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "aisingapore/sealion7b-instruct-nc\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + ">\n", + "scb10x/typhoon-7b\n", + ">\n", + "SeaLLMs/SeaLLM-7B-v2\n", + "================================================================\n", + "entry 2 fcd988b4-141c-4919-aa90-b0d7484f7833\n", + "Thaweewat-oasst1_th\n", + "=\n", + "llama2-7b-finetune-hf\n", + "=\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + ">\n", + "SeaLLMs/SeaLLM-7B-v2\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "openai/chatgpt-3.5/2024-02-06\n", + "=\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "aisingapore/sealion7b-instruct-nc\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "scb10x/typhoon-7b\n", + "================================================================\n", + "entry 3 1daff100-c4bb-4efb-b1cc-6bb9e7c31ec9\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "openai/chatgpt-3.5/2024-02-06\n", + ">\n", + "SeaLLMs/SeaLLM-7B-v2\n", + ">\n", + "llama2-7b-finetune-hf\n", + "=\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + "=\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + ">\n", + "aisingapore/sealion7b-instruct-nc\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "scb10x/typhoon-7b\n", + "================================================================\n", + "entry 4 f2df8535-93ed-4a85-b703-07771056d1ef\n", + "Thaweewat-oasst1_th\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "aisingapore/sealion7b-instruct-nc\n", + ">\n", + "SeaLLMs/SeaLLM-7B-v2\n", + "=\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "openai/chatgpt-3.5/2024-02-06\n", + ">\n", + "llama2-7b-finetune-hf\n", + "=\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + "=\n", + "scb10x/typhoon-7b\n", + "================================================================\n", + "entry 5 7618707d-bee1-46cf-b3a0-ea723ae13165\n", + "Thaweewat-oasst1_th\n", + "=\n", + "openai/chatgpt-3.5/2024-02-06\n", + "=\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "aisingapore/sealion7b-instruct-nc\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "Thaweewat-oasst1_th\n", + "=\n", + "llama2-7b-finetune-hf\n", + "=\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + ">\n", + "SeaLLMs/SeaLLM-7B-v2\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + ">\n", + "scb10x/typhoon-7b\n", + "================================================================\n", + "entry 6 8d8f30ef-f070-4339-9085-9fff8d104e4c\n", + "openai/chatgpt-3.5/2024-02-06\n", + "=\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "llama2-7b-finetune-hf\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "Thaweewat-oasst1_th\n", + "=\n", + "aisingapore/sealion7b-instruct-nc\n", + ">\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + ">\n", + "SeaLLMs/SeaLLM-7B-v2\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + "=\n", + "scb10x/typhoon-7b\n", + "================================================================\n", + "entry 7 a51727da-4670-45dd-b4ac-a64b7acba083\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "aisingapore/sealion7b-instruct-nc\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "Thaweewat-oasst1_th\n", + ">\n", + "openai/chatgpt-3.5/2024-02-06\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + "=\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "llama2-7b-finetune-hf\n", + "=\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + "=\n", + "SeaLLMs/SeaLLM-7B-v2\n", + ">\n", + "scb10x/typhoon-7b\n", + "================================================================\n", + "entry 8 980b089c-06d9-42ae-a0bf-97f46868a9e5\n", + "openai/chatgpt-3.5/2024-02-06\n", + ">\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "llama2-7b-finetune-hf\n", + ">\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + ">\n", + "Thaweewat-oasst1_th\n", + "=\n", + "Thaweewat-oasst1_th\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + ">\n", + "SeaLLMs/SeaLLM-7B-v2\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + "=\n", + "scb10x/typhoon-7b\n", + "=\n", + "aisingapore/sealion7b-instruct-nc\n", + "================================================================\n", + "entry 9 d649c166-9486-4a01-a301-9abb78c7e385\n", + "pythainlp/wangchanglm-7.5B-sft-en\n", + ">\n", + "llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + "=\n", + "aisingapore/sealion7b-instruct-nc\n", + ">\n", + "openai/chatgpt-4/2024-02-06\n", + ">\n", + "pythainlp/wangchanglm-7.5B-sft-enth\n", + ">\n", + "Thaweewat-oasst1_th\n", + "=\n", + "llama2-7b-finetune-hf\n", + ">\n", + "Thaweewat-oasst1_th\n", + "=\n", + "SeaLLMs/SeaLLM-7B-v2\n", + "=\n", + "openai/chatgpt-3.5/2024-02-06\n", + ">\n", + "mistralai/Mistral-7B-Instruct-v0.2\n", + "=\n", + "scb10x/typhoon-7b\n", + "================================================================\n" + ] + } + ], + "source": [ + "for idx, entry in enumerate(entries):\n", + " \n", + " # compute graph\n", + " graph = DialogueGraph(entry)\n", + "\n", + " # get comparison data of annotator (user) of \n", + " # the initial prompt (root node)\n", + " cmp = graph.root.get_cmp(user)\n", + "\n", + " # get all responses for root\n", + " res_ids = graph.root._next\n", + " \n", + " # compare function for sorting based on comparison data `cmp`\n", + " def compare(res_id_1, res_id_2):\n", + " c = cmp.get_cmp(res_id_1, res_id_2)\n", + " if c == \">\":\n", + " return 1\n", + " elif c == \"<\":\n", + " return -1\n", + " elif c == \"=\":\n", + " return 0\n", + " assert False, f\"c {c}\"\n", + " \n", + " sorted_res_ids = sorted(res_ids, key=cmp_to_key(compare), reverse=True)\n", + "\n", + " print(\"entry\", idx, graph.root.unit.id)\n", + " prev_res_id = None\n", + " for res_id in sorted_res_ids:\n", + " if prev_res_id is not None:\n", + " print(cmp.get_cmp(prev_res_id, res_id))\n", + " print(graph.nodes[res_id].unit.source.name)\n", + " prev_res_id = res_id\n", + " print(\"================================================================\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "25771038-595f-4536-8d42-be9997e87dc5", + "metadata": {}, + "outputs": [], + "source": [ + "# List of models to evaluate\n", + "# also serve as order for listing the models\n", + "order = [\n", + " \"Thaweewat-oasst1_th\",\n", + " \"openai/chatgpt-3.5/2024-02-06\",\n", + " \"openai/chatgpt-4/2024-02-06\",\n", + " \"llama2-7b-finetune-hf\",\n", + " \"llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\",\n", + " \"SeaLLMs/SeaLLM-7B-v2\",\n", + " \"aisingapore/sealion7b-instruct-nc\",\n", + " # \"pythainlp/wangchanglm-7.5B-sft-en\",\n", + " \"pythainlp/wangchanglm-7.5B-sft-enth\",\n", + " \"mistralai/Mistral-7B-Instruct-v0.2\",\n", + " \"scb10x/typhoon-7b\",\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "0b84e675-ed8d-46ba-8d84-4aa59b4a596b", + "metadata": {}, + "outputs": [], + "source": [ + "# percentile scores of each model\n", + "entries_score = {\n", + " model: []\n", + " for model in order\n", + "}\n", + "\n", + "# iterate over each data entry\n", + "for idx, entry in enumerate(entries):\n", + " # store ranking information of each response (e.g., model output)\n", + " # there are multiple rankings per response since there are multiple\n", + " # reference human annotation (Thaweewat-oasst1_th) per prompt\n", + " entry_rankings = {\n", + " model: []\n", + " for model in order\n", + " }\n", + "\n", + " # compute graph\n", + " graph = DialogueGraph(entry)\n", + "\n", + " # get comparison data of annotator (user)\n", + " cmp = graph.root.get_cmp(user)\n", + "\n", + " # list of responses' id\n", + " res_ids = [\n", + " id\n", + " for id in graph.root._next\n", + " # only keep response we are trying to rank\n", + " if graph.nodes[id].unit.source.name in order\n", + " ]\n", + "\n", + " # compare function for sorting based on comparison data `cmp`\n", + " def compare(res_id_1, res_id_2):\n", + " c = cmp.get_cmp(res_id_1, res_id_2)\n", + " if c == \">\":\n", + " return 1\n", + " elif c == \"<\":\n", + " return -1\n", + " elif c == \"=\":\n", + " return 0\n", + " assert False\n", + "\n", + " # sort response ids based on comparison data `cmp`\n", + " sorted_res_ids = sorted(res_ids, key=cmp_to_key(compare), reverse=True)\n", + "\n", + " # NOTE: if A > B = C > D\n", + " # then the rank will be\n", + " # A rank 1 true rank 1\n", + " # B rank 2 true rank 2.5\n", + " # C rank 2 true rank 2.5\n", + " # D rank 3 true rank 4\n", + " # we use true rank for percentile calculation\n", + " \n", + " # print(idx)\n", + " prev_res_id = None\n", + " rank = 1\n", + " count = 0\n", + " # mapping from raw ranking to true ranking\n", + " rank_map: Dict[int, float] = {}\n", + " for res_id in sorted_res_ids:\n", + " if prev_res_id is not None:\n", + " cmp_res = cmp.get_cmp(prev_res_id, res_id)\n", + " # print(cmp_res)\n", + " if cmp_res == \">\":\n", + " # compute true rank\n", + " rank_map[rank] = rank + count / 2\n", + " rank += 1 + count\n", + " count = 0\n", + " else:\n", + " count += 1\n", + " entry_rankings[graph.nodes[res_id].unit.source.name].append(rank)\n", + " # print(rank, graph.nodes[res_id].unit.source.name)\n", + " prev_res_id = res_id\n", + " rank_map[rank] = rank + count / 2\n", + " # print(\"rank_map\", rank_map)\n", + " total = len(sorted_res_ids)\n", + " # print(\"total\", total)\n", + " # print(entry_rankings)\n", + "\n", + " # go over each model\n", + " for name in order:\n", + " rankings = entry_rankings[name]\n", + " \n", + " # map ranking to true ranking\n", + " mapped_rankings = [rank_map[rank] for rank in rankings]\n", + " \n", + " # compute average rank\n", + " avg_rank = sum(mapped_rankings) / len(mapped_rankings)\n", + " \n", + " # print(name)\n", + " # print(\"mapped_rankings\", mapped_rankings)\n", + " # print(\"avg_rank\", avg_rank)\n", + " \n", + " # compute percentile\n", + " score = 1 - (avg_rank - 1) / (total - 1)\n", + " # print(\"score\", score)\n", + " \n", + " entries_score[name].append(score)\n", + " # print()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "b1b17e12-d482-458d-8dfc-8216ef59aae8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "84.73\t openai/chatgpt-4/2024-02-06\n", + "72.23\t openai/chatgpt-3.5/2024-02-06\n", + "62.57\t Thaweewat-oasst1_th\n", + "53.36\t llama2-7b-finetune-hf\n", + "52.45\t aisingapore/sealion7b-instruct-nc\n", + "52.36\t llama2-7b-finetune-hf/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4\n", + "45.55\t pythainlp/wangchanglm-7.5B-sft-enth\n", + "41.73\t SeaLLMs/SeaLLM-7B-v2\n", + "17.23\t mistralai/Mistral-7B-Instruct-v0.2\n", + "3.41\t scb10x/typhoon-7b\n" + ] + } + ], + "source": [ + "# compute average score\n", + "model_scores = []\n", + "for name in order:\n", + " scores = entries_score[name]\n", + " assert len(scores) == len(entries)\n", + " # sum and divide by total entires\n", + " score = sum(scores)/len(entries)*100\n", + " model_scores.append((score, name))\n", + "\n", + "# sort order by score\n", + "model_scores = sorted(model_scores, reverse=True)\n", + "for score, name in model_scores:\n", + " print(f\"{score:.2f}\\t\", name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46553161-a275-4032-a125-dd80d0320f1f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1282247-0d64-4221-a184-7c93c3c38004", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94b8ede8-207e-48ed-bcc3-fdaf1ef9c724", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fbb91ac2-c78b-4832-8443-09cbb68c17d0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/evaluation/pyproject.toml b/src/evaluation/pyproject.toml new file mode 100644 index 0000000..b8065a6 --- /dev/null +++ b/src/evaluation/pyproject.toml @@ -0,0 +1,17 @@ +[build-system] +requires = [ + "setuptools>=40.8.0", + "wheel" +] + +[project] +name = "openthaigpt_pretraining_evaluation" +version = "0.1.0" +description = "OpenThaiGPT Pretraining Task." +readme = "README.md" +requires-python = ">=3.8" +classifiers = [ + "Programming Language :: Python :: 3", +] +dependencies = [ +] \ No newline at end of file diff --git a/src/evaluation/scripts/README.md b/src/evaluation/scripts/README.md new file mode 100644 index 0000000..82916c1 --- /dev/null +++ b/src/evaluation/scripts/README.md @@ -0,0 +1 @@ +# Scripts \ No newline at end of file diff --git a/src/evaluation/setup.py b/src/evaluation/setup.py new file mode 100644 index 0000000..40ea508 --- /dev/null +++ b/src/evaluation/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup + +setup( + name="openthaigpt_pretraining_evaluation", + version="0.1", + packages=["openthaigpt_pretraining_evaluation"], +) diff --git a/src/model/README.md b/src/model/README.md new file mode 100644 index 0000000..50d91a6 --- /dev/null +++ b/src/model/README.md @@ -0,0 +1 @@ +# Model diff --git a/src/model/__init__.py b/src/model/__init__.py new file mode 100644 index 0000000..a137771 --- /dev/null +++ b/src/model/__init__.py @@ -0,0 +1,2 @@ +"""Top-level package for OpenThaiGPT Model.""" +__version__ = "0.1.0" diff --git a/src/model/configuration_example/README.md b/src/model/configuration_example/README.md new file mode 100644 index 0000000..1d9456e --- /dev/null +++ b/src/model/configuration_example/README.md @@ -0,0 +1,16 @@ +# Config + + - optimizer: .yaml file in folder optimizer + - model: .yaml file in folder model + - dataset: .yaml file in folder dataset + - training: .yaml file in folder training + +# Data preprocess + + - model: .yaml file in folder model + - dataset: .yaml file in folder dataset + - data_process: .yaml file in folder training + +# Spm training + + - spm: .yaml file in folder spm \ No newline at end of file diff --git a/src/model/configuration_example/config.yaml b/src/model/configuration_example/config.yaml new file mode 100644 index 0000000..419d0b3 --- /dev/null +++ b/src/model/configuration_example/config.yaml @@ -0,0 +1,5 @@ +defaults: + - optimizer: adamw_optimizer + - model: llama-hf-7b-from-scratch + - dataset: mc4 + - training: training_v1 \ No newline at end of file diff --git a/src/model/configuration_example/data_preprocess.yaml b/src/model/configuration_example/data_preprocess.yaml new file mode 100644 index 0000000..e592543 --- /dev/null +++ b/src/model/configuration_example/data_preprocess.yaml @@ -0,0 +1,4 @@ +defaults: + - model: llama-hf-7b-from-scratch + - dataset: mc4 + - data_process: data_process_v1 \ No newline at end of file diff --git a/src/model/configuration_example/data_process/README.md b/src/model/configuration_example/data_process/README.md new file mode 100644 index 0000000..fd6aa87 --- /dev/null +++ b/src/model/configuration_example/data_process/README.md @@ -0,0 +1,7 @@ +# Config + +- max_tokens: max length of dataset after preprocessed +- save_path: path to save preprocessed dataset +- batch_size: batch size for preprocess +- num_proc: number of cpus +- split: split of dataset for preprocess \ No newline at end of file diff --git a/src/model/configuration_example/data_process/data_process_v1.yaml b/src/model/configuration_example/data_process/data_process_v1.yaml new file mode 100644 index 0000000..6a303fb --- /dev/null +++ b/src/model/configuration_example/data_process/data_process_v1.yaml @@ -0,0 +1,7 @@ +max_tokens: 2048 +save_path: ./tokendata +batch_size: 1000 +num_proc: 128 +split: + - train + - eval \ No newline at end of file diff --git a/src/model/configuration_example/dataset/README.md b/src/model/configuration_example/dataset/README.md new file mode 100644 index 0000000..59ff7ea --- /dev/null +++ b/src/model/configuration_example/dataset/README.md @@ -0,0 +1,22 @@ +# Config + +## tokenized: +- path: path to dataset after preprocessed if null will use raw data +- train_split: split train of dataset +- eval_split: split validation of dataset + +## train: +- dataset_name: name or path to dataset +- split: split train of dataset +- shuffle: if true dataset will shuffle +- buffer_size: buffer for shuffle +- streaming: load as streaming when true +- from_disk: use true when want to load from local + +## eval: +- dataset_name: name or path to dataset +- split: split validation of dataset +- shuffle: if true dataset will shuffle +- buffer_size: buffer for shuffle +- streaming: load as streaming when true +- from_disk: use true when want to load from local \ No newline at end of file diff --git a/src/model/configuration_example/dataset/mc4.yaml b/src/model/configuration_example/dataset/mc4.yaml new file mode 100644 index 0000000..e7a3880 --- /dev/null +++ b/src/model/configuration_example/dataset/mc4.yaml @@ -0,0 +1,18 @@ +tokenized: + path: null + train_split: null + eval_split: null +train: + dataset_name: mc4 + split: train # type: ignore + shuffle: false + buffer_size: 10000 + streaming: false + from_disk: false +eval: + dataset_name: mc4 + split: validation # type: ignore + shuffle: false + buffer_size: 10000 + streaming: false + from_disk: false \ No newline at end of file diff --git a/src/model/configuration_example/example_config.yaml b/src/model/configuration_example/example_config.yaml new file mode 100644 index 0000000..554bc74 --- /dev/null +++ b/src/model/configuration_example/example_config.yaml @@ -0,0 +1,5 @@ +defaults: + - optimizer: adamw_optimizer + - model: falcon-7b-from-pretrained + - dataset: mc4 + - training: training_v1 \ No newline at end of file diff --git a/src/model/configuration_example/example_data_preprocess.yaml b/src/model/configuration_example/example_data_preprocess.yaml new file mode 100644 index 0000000..32af61b --- /dev/null +++ b/src/model/configuration_example/example_data_preprocess.yaml @@ -0,0 +1,4 @@ +defaults: + - model: falcon-7b-from-pretrained + - dataset: mc4 + - data_process: data_process_v1 \ No newline at end of file diff --git a/src/model/configuration_example/example_lora.yaml b/src/model/configuration_example/example_lora.yaml new file mode 100644 index 0000000..07bf780 --- /dev/null +++ b/src/model/configuration_example/example_lora.yaml @@ -0,0 +1,6 @@ +defaults: + - optimizer: adamw_optimizer + - model: llama-hf-7b-from-scratch + - dataset: mc4 + - training: training_v1 + - lora: default \ No newline at end of file diff --git a/src/model/configuration_example/example_spm_training.yaml b/src/model/configuration_example/example_spm_training.yaml new file mode 100644 index 0000000..939e056 --- /dev/null +++ b/src/model/configuration_example/example_spm_training.yaml @@ -0,0 +1,2 @@ +defaults: + - spm: training_v1 \ No newline at end of file diff --git a/src/model/configuration_example/lora/README.md b/src/model/configuration_example/lora/README.md new file mode 100644 index 0000000..8d5afa0 --- /dev/null +++ b/src/model/configuration_example/lora/README.md @@ -0,0 +1,13 @@ +# Config + +- r: the rank of the update matrices, expressed in int. Lower rank results in smaller update matrices with fewer trainable parameters. +- alpha: LoRA scaling factor. +- bias: Specifies if the bias parameters should be trained. Can be 'none', 'all' or 'lora_only'. +- task_type: task of model +- target_modules: The modules (for example, attention blocks) to apply the LoRA update matrices. +- modules_to_save: List of modules apart from LoRA layers to be set as trainable and saved in the final checkpoint. These typically include model’s custom head that is randomly initialized for the fine-tuning task. +- layers_to_transform: List of layers to be transformed by LoRA. If not specified, all layers in target_modules are transformed. +- layers_pattern: Pattern to match layer names in target_modules, if layers_to_transform is specified. By default PeftModel will look at common layer pattern (layers, h, blocks, etc.), use it for exotic and custom models. + + +read more on reference https://huggingface.co/docs/peft/conceptual_guides/lora \ No newline at end of file diff --git a/src/model/configuration_example/lora/falcon.yaml b/src/model/configuration_example/lora/falcon.yaml new file mode 100644 index 0000000..a2cf0eb --- /dev/null +++ b/src/model/configuration_example/lora/falcon.yaml @@ -0,0 +1,7 @@ +lora: + r: 128 + lora_alpha: 32 + lora_dropout: 0.05 + bias: "none" + task_type: "CAUSAL_LM" + target_modules: ["query_key_value"] \ No newline at end of file diff --git a/src/model/configuration_example/model/falcon-7b-from-pretrained.yaml b/src/model/configuration_example/model/falcon-7b-from-pretrained.yaml new file mode 100644 index 0000000..ac46b86 --- /dev/null +++ b/src/model/configuration_example/model/falcon-7b-from-pretrained.yaml @@ -0,0 +1,19 @@ +name: falcon +pretrained_model_name_or_path: tiiuae/falcon-7b +args: + hidden_size: 4544 + n_layer: 32 + n_head: 71 + layer_norm_epsilon: 1e-5 + initializer_range: 0.02 + use_cache: true + apply_residual_connection_post_layernorm: false + hidden_dropout: 0.0 + attention_dropout: 0.0 + multi_query: true + alibi: false + bias: false + parallel_attn: true +tokenizer: + pretrained_model_name_or_path: tiiuae/falcon-7b + tokenizer_class: AutoTokenizer \ No newline at end of file diff --git a/src/model/configuration_example/model/falcon-7b-from-scratch.yaml b/src/model/configuration_example/model/falcon-7b-from-scratch.yaml new file mode 100644 index 0000000..ee08164 --- /dev/null +++ b/src/model/configuration_example/model/falcon-7b-from-scratch.yaml @@ -0,0 +1,19 @@ +name: falcon +pretrained_model_name_or_path: null +args: + hidden_size: 4544 + n_layer: 32 + n_head: 71 + layer_norm_epsilon: 1e-5 + initializer_range: 0.02 + use_cache: true + apply_residual_connection_post_layernorm: false + hidden_dropout: 0.0 + attention_dropout: 0.0 + multi_query: true + alibi: false + bias: false + parallel_attn: true +tokenizer: + pretrained_model_name_or_path: tiiuae/falcon-7b + tokenizer_class: AutoTokenizer \ No newline at end of file diff --git a/src/model/configuration_example/model/gptj-6b-from-pretrained.yaml b/src/model/configuration_example/model/gptj-6b-from-pretrained.yaml new file mode 100644 index 0000000..d8a8d61 --- /dev/null +++ b/src/model/configuration_example/model/gptj-6b-from-pretrained.yaml @@ -0,0 +1,26 @@ +name: gptj +pretrained_model_name_or_path: EleutherAI/gpt-j-6b +args: + vocab_size: 50400 + n_positions: 2048 + n_embd: 4096 + n_layer: 28 + n_head: 16 + rotary_dim: 64 + n_inner: 16384 #4 times n_embd + activation_function: "gelu_new" + resid_pdrop: 0.0 + embd_pdrop: 0.0 + attn_pdrop: 0.0 + layer_norm_epsilon: 1e-5 + initializer_range: 0.02 + use_cache: True + bos_token_id: 50256 + eos_token_id: 50256 + tie_word_embeddings: False + use_checkpointing: True + checkpoint_only_attention: False + attention_mode: xformers +tokenizer: + pretrained_model_name_or_path: EleutherAI/gpt-j-6b + tokenizer_class: AutoTokenizer diff --git a/src/model/configuration_example/model/gptj-6b-from-scratch.yaml b/src/model/configuration_example/model/gptj-6b-from-scratch.yaml new file mode 100644 index 0000000..fe7c402 --- /dev/null +++ b/src/model/configuration_example/model/gptj-6b-from-scratch.yaml @@ -0,0 +1,26 @@ +name: gptj +pretrained_model_name_or_path: null +args: + vocab_size: 50400 + n_positions: 2048 + n_embd: 1024 + n_layer: 16 + n_head: 16 + rotary_dim: 64 + n_inner: 4096 #4 times n_embd + activation_function: "gelu_new" + resid_pdrop: 0.0 + embd_pdrop: 0.0 + attn_pdrop: 0.0 + layer_norm_epsilon: 1e-5 + initializer_range: 0.02 + use_cache: True + bos_token_id: 50256 + eos_token_id: 50256 + tie_word_embeddings: False + use_checkpointing: True + checkpoint_only_attention: True + attention_mode: xformers +tokenizer: + pretrained_model_name_or_path: EleutherAI/gpt-j-6b + tokenizer_class: AutoTokenizer diff --git a/src/model/configuration_example/model/llama-100m-from-scratch.yaml b/src/model/configuration_example/model/llama-100m-from-scratch.yaml new file mode 100644 index 0000000..c67a675 --- /dev/null +++ b/src/model/configuration_example/model/llama-100m-from-scratch.yaml @@ -0,0 +1,17 @@ +name: llama +pretrained_model_name_or_path: null +args: + dim: 768 + n_layers: 8 + n_heads: 8 + vocab_size: 32000 + multiple_of: 256 + norm_eps: 1e-5 + max_batch_size: 2 + max_seq_len: 2048 + attention_mode: origin # pytorch, xformers + use_checkpointing: False + checkpoint_only_attention: False +tokenizer: + pretrained_model_name_or_path: decapoda-research/llama-7b-hf + tokenizer_class: LlamaTokenizer diff --git a/src/model/configuration_example/model/llama-hf-7b-from-pretrained.yaml b/src/model/configuration_example/model/llama-hf-7b-from-pretrained.yaml new file mode 100644 index 0000000..736e5ea --- /dev/null +++ b/src/model/configuration_example/model/llama-hf-7b-from-pretrained.yaml @@ -0,0 +1,22 @@ +name: llama_hf +pretrained_model_name_or_path: decapoda-research/llama-7b-hf +args: + vocab_size: 32000 + hidden_size: 4096 + intermediate_size: 11008 + num_hidden_layers: 32 + num_attention_heads: 32 + hidden_act: "silu" + max_position_embeddings: 2048 + initializer_range: 0.02 + rms_norm_eps: 1e-6 + use_cache: True + pad_token_id: 0 + bos_token_id: 1 + eos_token_id: 2 + tie_word_embeddings: False + use_checkpointing: True + checkpoint_only_attention: False +tokenizer: + pretrained_model_name_or_path: decapoda-research/llama-7b-hf + tokenizer_class: LlamaTokenizer \ No newline at end of file diff --git a/src/model/configuration_example/model/llama-hf-7b-from-scratch.yaml b/src/model/configuration_example/model/llama-hf-7b-from-scratch.yaml new file mode 100644 index 0000000..9f58c26 --- /dev/null +++ b/src/model/configuration_example/model/llama-hf-7b-from-scratch.yaml @@ -0,0 +1,22 @@ +name: llama_hf +pretrained_model_name_or_path: null +args: + vocab_size: 32000 + hidden_size: 1024 #4096 + intermediate_size: 11008 + num_hidden_layers: 8 #32 + num_attention_heads: 8 #32 + hidden_act: "silu" + max_position_embeddings: 2048 + initializer_range: 0.02 + rms_norm_eps: 1e-6 + use_cache: True + pad_token_id: 0 + bos_token_id: 1 + eos_token_id: 2 + tie_word_embeddings: False + use_checkpointing: True + checkpoint_only_attention: False +tokenizer: + pretrained_model_name_or_path: decapoda-research/llama-7b-hf + tokenizer_class: LlamaTokenizer diff --git a/src/model/configuration_example/optimizer/adam1bit_optimizer.yaml b/src/model/configuration_example/optimizer/adam1bit_optimizer.yaml new file mode 100644 index 0000000..a5efd49 --- /dev/null +++ b/src/model/configuration_example/optimizer/adam1bit_optimizer.yaml @@ -0,0 +1,5 @@ +name: adam1bit +hyps: + lr: 1e-4 + weight_decay: 1e-2 + betas: [0.9, 0.95] diff --git a/src/model/configuration_example/optimizer/adam8bit_optimizer.yaml b/src/model/configuration_example/optimizer/adam8bit_optimizer.yaml new file mode 100644 index 0000000..68bb0e7 --- /dev/null +++ b/src/model/configuration_example/optimizer/adam8bit_optimizer.yaml @@ -0,0 +1,5 @@ +name: adam8bit +hyps: + lr: 1e-4 + weight_decay: 1e-2 + betas: [0.9, 0.95] diff --git a/src/model/configuration_example/optimizer/adamw_optimizer.yaml b/src/model/configuration_example/optimizer/adamw_optimizer.yaml new file mode 100644 index 0000000..bf26dbd --- /dev/null +++ b/src/model/configuration_example/optimizer/adamw_optimizer.yaml @@ -0,0 +1,6 @@ +name: adamw +hyps: + lr: 1e-4 + weight_decay: 1e-2 + betas: [0.9, 0.95] + fused: true diff --git a/src/model/configuration_example/optimizer/lion_optimizer.yaml b/src/model/configuration_example/optimizer/lion_optimizer.yaml new file mode 100644 index 0000000..1e612f3 --- /dev/null +++ b/src/model/configuration_example/optimizer/lion_optimizer.yaml @@ -0,0 +1,4 @@ +name: lion +hyps: + lr: 1e-4 + weight_decay: 1e-2 diff --git a/src/model/configuration_example/spm/README.md b/src/model/configuration_example/spm/README.md new file mode 100644 index 0000000..079626a --- /dev/null +++ b/src/model/configuration_example/spm/README.md @@ -0,0 +1,11 @@ +# Config + +- output_path: folder to save tokenizer +- vocab_size: vocab size of tokenizer +- streaming: streaming mode +- load_dataset_path: dataset name for load from huggingface don't need if have load_dataset_local_path +- load_dataset_name: split of dataset use for load_dataset_path +- load_dataset_local_path: path to load dataset from local if null will use load_dataset_path instead +- load_dataset_data_type: format type of dataset (ex: json, csv) if null will be huggingface format +- large_corpus: use true when want to train large dataset +- mode: mode of train tpkenizer sentencepiece (spm: sentencepiece, bpe: byte pair encoding) diff --git a/src/model/configuration_example/spm/training_v1.yaml b/src/model/configuration_example/spm/training_v1.yaml new file mode 100644 index 0000000..65fc540 --- /dev/null +++ b/src/model/configuration_example/spm/training_v1.yaml @@ -0,0 +1,9 @@ +output_path: "tokenizer" +vocab_size: 30000 +streaming: True +load_dataset_path: oscar +load_dataset_name: unshuffled_deduplicated_th +load_dataset_local_path: None +load_dataset_data_type: None +large_corpus: false +mode: spm # spm | bpe diff --git a/src/model/configuration_example/spm_training.yaml b/src/model/configuration_example/spm_training.yaml new file mode 100644 index 0000000..939e056 --- /dev/null +++ b/src/model/configuration_example/spm_training.yaml @@ -0,0 +1,2 @@ +defaults: + - spm: training_v1 \ No newline at end of file diff --git a/src/model/configuration_example/training/README.md b/src/model/configuration_example/training/README.md new file mode 100644 index 0000000..c2084a6 --- /dev/null +++ b/src/model/configuration_example/training/README.md @@ -0,0 +1,27 @@ +# Config +- accelerator: device (cuda , cpu) +- strategy: mode of parallel (dp | ddp | ddp_spawn | xla | deepspeed | fsdp) +- stage: stage of deepspeed +- offload_optimizer: true when want to offload optimizer +- offload_parameters: true when want to offload parameters +- gradient_clipping: gradient clip of deepspeed strategy +- num_gpus: number of gpus which each node use +- precision: data type (32-true | 32 | 16-mixed | bf16-mixed | 64-true) +- num_nodes: number of node +- seed: seed of this training (13, 21, 42, 87, 100) +- batch_size: batch size of model +- grad: gradient accumulation steps +- max_tokens: max sequence lenght +- num_shards: number chunk of dataset +- num_workers: number of worker in dataloader +- epochs: numbers of epochs +- start_epochs: start epoch for resume training +- start_steps: start steps of start epochs +- save_steps: save every n steps +- eval_steps: eval every n steps +- save_paths: path to save model +- load_weight_path: path to load weight of model +- decay_lr: when true will use learning rate scheduler +- warmup_iters: number of warmup iteration +- lr_decay_iters: number iteration to activate learning rate scheduler +- min_lr: minimun of learning rate \ No newline at end of file diff --git a/src/model/configuration_example/training/training_v1.yaml b/src/model/configuration_example/training/training_v1.yaml new file mode 100644 index 0000000..63aa16f --- /dev/null +++ b/src/model/configuration_example/training/training_v1.yaml @@ -0,0 +1,26 @@ +accelerator: cuda # cuda | cpu +strategy: auto # dp | ddp | ddp_spawn | xla | deepspeed | fsdp +stage: 2 +offload_optimizer: false +offload_parameters: false +gradient_clipping: 1. +num_gpus: 1 +precision: 32-true # 32-true | 32 | 16-mixed | bf16-mixed | 64-true +num_nodes: 1 +seed: 42 # {13|21|42|87|100} +batch_size: 2 +grad: 4 +max_tokens: 2048 +num_shards: 1024 +num_workers: 2 +epochs: 1 +start_epochs: 0 +start_steps: 0 +save_steps: 10000 +eval_steps: 10000 +save_paths: ./weight +load_weight_path: False +decay_lr: true +warmup_iters: 2000 +lr_decay_iters: 600000 +min_lr: 6e-5 \ No newline at end of file diff --git a/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/.gitignore b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/.gitignore new file mode 100644 index 0000000..7f2e3ac --- /dev/null +++ b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/.gitignore @@ -0,0 +1,2 @@ +/lora +/qlora_batchsize4 diff --git a/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-LoRA-finetune-summarize.ipynb b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-LoRA-finetune-summarize.ipynb new file mode 100644 index 0000000..732764c --- /dev/null +++ b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-LoRA-finetune-summarize.ipynb @@ -0,0 +1,8760 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "36a2f3b4", + "metadata": {}, + "source": [ + "# Fine-tune Falcon-40B with QLoRA" + ] + }, + { + "cell_type": "markdown", + "id": "639d3904", + "metadata": {}, + "source": [ + "--- \n", + "\n", + "In this demo notebook, we demonstrate how to fine-tune the Falcon-40B model using QLoRA, Hugging Face PEFT, and bitsandbytes. \n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "2ec1c5bb", + "metadata": {}, + "source": [ + "This notebook was tested in Amazon SageMaker Studio with Python 3 (Data Science 3.0) kernel with a ml.g5.12xlarge instance." + ] + }, + { + "cell_type": "markdown", + "id": "8df4c2bc", + "metadata": {}, + "source": [ + "Install the required libriaries, including the Hugging Face libraries, and restart the kernel." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "153d07ab-3e43-45b1-89fd-140352b1d6ce", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%pip install -q -U torch==2.0.1 bitsandbytes==0.39.1\n", + "%pip install -q -U datasets py7zr einops tensorboardX\n", + "%pip install -q -U git+https://github.com/huggingface/transformers.git@850cf4af0ce281d2c3e7ebfc12e0bc24a9c40714\n", + "%pip install -q -U git+https://github.com/huggingface/peft.git@e2b8e3260d3eeb736edf21a2424e89fe3ecf429d\n", + "%pip install -q -U git+https://github.com/huggingface/accelerate.git@b76409ba05e6fa7dfc59d50eee1734672126fdba" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0d6fc2fd-d42e-497e-8cb2-634ac267484a", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Collecting py7zr\n", + " Downloading py7zr-0.20.5-py3-none-any.whl (66 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.4/66.4 kB\u001b[0m \u001b[31m864.2 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m31m1.5 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting texttable (from py7zr)\n", + " Downloading texttable-1.6.7-py2.py3-none-any.whl (10 kB)\n", + "Collecting pycryptodomex>=3.6.6 (from py7zr)\n", + " Downloading pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mm eta \u001b[36m0:00:01\u001b[0m0:01\u001b[0m:01\u001b[0m\n", + "\u001b[?25hCollecting pyzstd>=0.14.4 (from py7zr)\n", + " Downloading pyzstd-0.15.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (412 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m412.3/412.3 kB\u001b[0m \u001b[31m9.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mm eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting pyppmd<1.1.0,>=0.18.1 (from py7zr)\n", + " Downloading pyppmd-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (138 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.7/138.7 kB\u001b[0m \u001b[31m2.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m1m291.6 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting pybcj>=0.6.0 (from py7zr)\n", + " Downloading pybcj-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.6/49.6 kB\u001b[0m \u001b[31m970.7 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting multivolumefile>=0.2.3 (from py7zr)\n", + " Downloading multivolumefile-0.2.3-py3-none-any.whl (17 kB)\n", + "Collecting brotli>=1.0.9 (from py7zr)\n", + " Downloading Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl (357 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m357.2/357.2 kB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting inflate64>=0.3.1 (from py7zr)\n", + " Downloading inflate64-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (92 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m93.0/93.0 kB\u001b[0m \u001b[31m1.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: psutil in /lustrefs/disk/home/tsaengsu/.local/lib/python3.9/site-packages (from py7zr) (5.9.5)\n", + "Installing collected packages: texttable, brotli, pyzstd, pyppmd, pycryptodomex, pybcj, multivolumefile, inflate64, py7zr\n", + "Successfully installed brotli-1.0.9 inflate64-0.3.1 multivolumefile-0.2.3 py7zr-0.20.5 pybcj-1.0.1 pycryptodomex-3.18.0 pyppmd-1.0.0 pyzstd-0.15.9 texttable-1.6.7\n" + ] + } + ], + "source": [ + "!pip install py7zr" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f5185bb8-3c83-483c-a145-dd4c0b9941f2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Add installed cuda runtime to path for bitsandbytes \n", + "import os\n", + "import nvidia\n", + "\n", + "cuda_install_dir = '/'.join(nvidia.__file__.split('/')[:-1]) + '/cuda_runtime/lib/'\n", + "os.environ['LD_LIBRARY_PATH'] = cuda_install_dir" + ] + }, + { + "cell_type": "markdown", + "id": "70b26c91", + "metadata": {}, + "source": [ + "\n", + "\n", + "To train our model, we need to convert our inputs (text) to token IDs. This is done by a Hugging Face Transformers Tokenizer. In addition to QLoRA, we will use bitsanbytes 4-bit precision to quantize out frozen LLM to 4-bit and attach LoRA adapters on it.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "85946e42-9f8a-488c-8b90-8afedf311b02", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "===================================BUG REPORT===================================\n", + "Welcome to bitsandbytes. For bug reports, please run\n", + "\n", + "python -m bitsandbytes\n", + "\n", + " and submit this information together with your error trace to: https://github.com/TimDettmers/bitsandbytes/issues\n", + "================================================================================\n", + "bin /home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/libbitsandbytes_cuda118.so\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/cuda_setup/main.py:149: UserWarning: Found duplicate ['libcudart.so', 'libcudart.so.11.0', 'libcudart.so.12.0'] files: {PosixPath('/home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so.11.0'), PosixPath('/home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so')}.. We'll flip a coin and try one of these, in order to fail forward.\n", + "Either way, this might cause trouble in the future:\n", + "If you get `CUDA error: invalid device function` errors, the above might be the cause and the solution is to make sure only one ['libcudart.so', 'libcudart.so.11.0', 'libcudart.so.12.0'] in the paths that we search based on your env.\n", + " warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CUDA SETUP: CUDA runtime path found: /home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so.11.0\n", + "CUDA SETUP: Highest compute capability among GPUs detected: 8.0\n", + "CUDA SETUP: Detected CUDA version 118\n", + "CUDA SETUP: Loading binary /home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/libbitsandbytes_cuda118.so...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1cea5a9469fd45049b962bdbb300882c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/2 [00:00\n" + ] + } + ], + "source": [ + "from random import randint\n", + "\n", + "# custom instruct prompt start\n", + "prompt_template = f\"Summarize the chat dialogue:\\n{{dialogue}}\\n---\\nSummary:\\n{{summary}}{{eos_token}}\"\n", + "\n", + "# template dataset to add prompt to each sample\n", + "def template_dataset(sample):\n", + " sample[\"text\"] = prompt_template.format(dialogue=sample[\"dialogue\"],\n", + " summary=sample[\"summary\"],\n", + " eos_token=tokenizer.eos_token)\n", + " return sample\n", + "\n", + "\n", + "# apply prompt template per sample\n", + "train_dataset = dataset[\"train\"].map(template_dataset, remove_columns=list(dataset[\"train\"].features))\n", + "\n", + "print(train_dataset[randint(0, len(dataset))][\"text\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "14571066-34fe-4fe1-97a9-697f1de79218", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-ae9ee88e80acf7ac.arrow\n" + ] + } + ], + "source": [ + "# apply prompt template per sample\n", + "test_dataset = dataset[\"test\"].map(template_dataset, remove_columns=list(dataset[\"test\"].features))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1c197761-eb0c-4712-a2e7-40c6a40eb74f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-d5ee9aed5e086afd.arrow\n", + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-6d6a396a4d20b7e3.arrow\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total number of train samples: 14732\n" + ] + } + ], + "source": [ + " # tokenize and chunk dataset\n", + "lm_train_dataset = train_dataset.map(\n", + " lambda sample: tokenizer(sample[\"text\"]), batched=True, batch_size=24, remove_columns=list(train_dataset.features)\n", + ")\n", + "\n", + "\n", + "lm_test_dataset = test_dataset.map(\n", + " lambda sample: tokenizer(sample[\"text\"]), batched=True, remove_columns=list(test_dataset.features)\n", + ")\n", + "\n", + "# Print total number of samples\n", + "print(f\"Total number of train samples: {len(lm_train_dataset)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "ade7f4fd", + "metadata": {}, + "source": [ + "Create a S3 bucket to log our metrics to TensorBoard." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a3864a9d-e17b-437d-bd68-52ee8e134b41", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "log_bucket = \"/project/lt200056-opgpth/teerapol/QLoRA_vs_LoRA/results-normal-lora\"" + ] + }, + { + "cell_type": "markdown", + "id": "a97f4fc7", + "metadata": {}, + "source": [ + "Use the Hugging Face Trainer class to fine-tune the model. Define the hyperparameters we want to use. We also create a DataCollator that will take care of padding our inputs and labels." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ca6e7c03-58b3-4057-afde-e8e2e249143d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import transformers\n", + "\n", + "# We set num_train_epochs=1 simply to run a demonstration\n", + "\n", + "trainer = transformers.Trainer(\n", + " model=model,\n", + " train_dataset=lm_train_dataset,\n", + " eval_dataset=lm_test_dataset,\n", + " args=transformers.TrainingArguments(\n", + " per_device_train_batch_size=4,\n", + " per_device_eval_batch_size=8,\n", + " #logging_dir=log_bucket,\n", + " logging_steps=2,\n", + " num_train_epochs=1,\n", + " learning_rate=2e-4,\n", + " bf16=True,\n", + " save_strategy = \"no\",\n", + " output_dir=\"outputs-normal-lora\",\n", + " report_to=\"tensorboard\",\n", + " ),\n", + " data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),\n", + ")\n", + "model.config.use_cache = False # silence the warnings. Please re-enable for inference!" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "30ff79f6", + "metadata": { + "pycharm": { + "name": "#%%\n" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [3683/3683 49:35, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
21.939700
41.638500
61.712300
81.711100
101.835100
121.671400
141.743100
161.807200
181.706500
201.684000
221.687100
241.707700
261.612900
281.542500
301.492500
321.625300
341.758900
361.672700
381.589100
401.784800
421.743700
441.845800
461.797600
481.639600
501.691400
521.661500
541.697800
561.603400
581.587900
601.561800
621.777300
641.550600
661.681700
681.551400
701.791200
721.607300
741.685100
761.679700
781.756600
801.798700
821.746000
841.561100
861.624100
881.767000
901.604900
921.633500
941.558800
961.501700
981.658000
1001.664800
1021.804700
1041.525600
1061.635300
1081.542600
1101.639600
1121.845900
1141.515800
1161.413600
1181.436400
1201.408200
1221.518100
1241.675700
1261.799100
1281.608800
1301.770100
1321.741200
1341.686300
1361.865500
1381.634300
1401.571600
1421.583600
1441.320700
1461.761600
1481.539300
1501.556600
1521.681300
1541.587100
1561.644300
1581.821000
1601.831800
1621.578600
1641.461100
1661.809000
1681.798300
1701.653000
1721.559100
1741.816000
1761.505900
1781.802200
1801.790000
1821.507900
1841.405900
1861.506100
1881.727600
1901.786300
1921.670300
1941.408100
1961.793000
1981.643300
2001.564900
2021.507400
2041.680500
2061.707300
2081.714300
2101.547900
2121.537200
2141.803300
2161.659700
2181.626300
2201.677500
2221.808200
2241.978100
2261.446500
2281.779900
2301.582800
2321.838100
2341.723700
2361.572700
2381.515200
2401.624500
2421.342800
2441.770000
2461.627200
2481.540600
2501.677700
2521.640400
2541.703500
2561.891300
2581.570200
2601.512600
2621.619400
2641.723000
2661.733000
2681.510800
2701.717200
2721.408200
2741.699300
2761.529700
2781.697700
2801.651400
2821.467200
2841.636500
2861.734900
2881.687900
2901.682100
2921.585700
2941.534500
2961.595800
2981.675800
3001.627100
3021.672400
3041.576600
3061.801700
3081.373100
3101.393700
3121.605200
3141.360000
3161.575500
3181.372800
3201.426800
3221.675200
3241.582400
3261.473100
3281.799000
3301.488000
3321.958200
3341.797700
3361.708600
3381.710000
3401.602800
3421.652600
3441.681200
3461.532300
3481.616500
3501.617200
3521.604000
3541.890300
3561.703400
3581.620200
3601.822800
3621.539100
3641.725600
3661.827500
3681.739400
3701.935400
3721.706500
3741.727200
3761.583900
3781.737300
3801.720000
3821.694200
3841.574200
3861.578600
3881.727700
3901.783200
3921.702500
3941.719100
3961.974900
3981.914400
4001.812800
4021.588900
4041.882500
4061.754700
4081.546800
4101.824000
4121.817200
4141.741000
4161.797800
4182.011600
4201.843500
4221.781300
4241.926700
4261.857900
4281.805300
4301.784100
4321.717500
4341.803700
4361.690800
4381.787100
4401.953700
4421.556200
4441.792200
4461.653000
4481.744600
4501.806500
4521.620800
4541.826000
4561.499500
4581.643900
4601.835500
4621.613700
4641.822200
4661.601500
4681.841400
4701.914700
4721.793600
4741.881900
4761.539100
4781.922400
4801.838700
4821.975400
4841.691200
4861.877600
4881.949300
4901.702900
4921.825800
4941.698700
4961.787700
4981.713700
5001.874900
5021.736400
5041.712700
5061.653000
5081.761100
5101.822800
5121.744400
5141.901000
5161.845800
5181.714300
5201.811100
5221.887300
5241.886600
5261.942900
5281.978400
5301.819600
5321.828800
5341.959600
5362.023700
5381.700000
5401.796100
5421.819400
5441.857700
5461.654400
5481.769900
5502.039900
5521.780400
5541.664700
5561.605400
5581.691700
5601.815500
5621.910800
5641.638600
5661.842000
5681.616300
5701.734000
5721.600100
5741.868400
5761.748200
5781.668200
5801.813600
5821.595000
5841.788800
5861.674400
5881.561800
5901.712000
5921.890200
5941.780000
5961.805100
5981.682700
6001.658000
6021.699400
6041.889900
6061.811600
6081.753800
6101.729600
6121.669200
6141.719800
6161.850500
6181.775600
6201.973100
6221.883200
6241.899600
6261.645200
6282.034500
6301.742600
6322.004200
6341.933800
6361.686900
6381.851400
6401.799700
6421.845700
6441.701900
6461.462900
6481.646800
6501.618900
6521.779800
6541.887100
6561.773700
6581.653100
6601.640600
6622.106000
6641.965700
6661.957700
6681.659400
6701.971300
6721.601100
6741.723200
6761.688000
6781.695200
6801.858800
6821.739600
6841.801100
6861.579100
6881.825100
6902.111900
6921.925900
6941.792600
6961.837900
6981.829200
7001.993800
7021.769400
7041.898700
7061.767500
7081.870800
7101.715400
7121.647800
7141.669300
7161.680900
7181.776500
7201.699300
7221.937400
7241.875300
7261.431400
7281.850300
7301.742700
7321.657900
7341.861800
7361.784100
7381.832300
7401.666900
7421.884500
7441.762700
7461.934000
7481.837400
7501.867700
7521.625600
7541.520200
7561.742800
7581.926700
7601.721800
7622.030400
7641.667400
7661.781800
7681.951400
7701.732400
7721.711800
7741.640200
7761.614000
7781.923400
7801.889000
7821.655600
7841.752000
7861.924200
7881.823700
7901.879100
7921.628900
7941.861200
7961.688100
7981.682500
8001.953000
8021.761200
8041.889800
8061.833800
8081.664400
8102.010300
8122.056800
8141.785200
8161.808000
8181.621000
8201.897700
8221.696200
8241.705200
8262.052700
8281.663500
8301.768200
8321.641300
8341.880700
8361.521700
8381.737700
8401.668800
8421.785500
8441.722700
8461.872100
8481.702400
8501.801500
8521.882200
8541.809900
8561.709400
8581.880900
8601.915000
8621.781300
8641.727300
8661.532100
8682.027100
8701.731000
8721.644200
8741.883100
8761.737100
8781.668000
8801.971000
8821.945300
8841.715200
8861.927400
8881.926800
8901.669900
8921.977200
8941.774000
8961.673400
8981.759500
9001.832500
9021.770000
9041.778600
9061.695600
9081.621900
9101.607600
9121.727900
9141.892600
9161.681700
9181.698500
9201.804500
9222.002200
9241.942800
9261.725000
9281.738600
9302.005200
9321.801200
9341.745300
9361.790400
9381.911000
9401.752200
9421.494400
9441.864400
9461.840100
9481.736600
9501.964800
9521.777100
9541.703500
9561.516500
9581.729000
9601.773100
9621.561000
9641.666800
9661.698400
9681.633900
9701.800900
9722.110300
9742.349400
9761.750000
9781.716100
9801.751700
9821.861100
9841.718100
9861.678300
9881.531900
9901.865700
9921.857100
9941.649000
9961.569400
9981.848300
10001.757500
10021.712600
10041.438000
10061.826400
10081.845000
10101.850400
10121.700000
10141.721500
10161.734400
10181.778800
10201.853500
10221.763200
10241.505500
10261.655100
10281.809000
10301.904900
10321.974200
10341.683700
10361.932800
10381.834700
10401.544800
10422.115900
10441.729800
10461.703500
10481.796800
10501.547200
10521.929600
10541.767700
10561.808300
10581.844700
10601.499400
10621.900000
10641.544200
10661.542400
10681.582000
10701.910400
10721.864700
10741.862900
10761.674600
10781.820400
10801.734400
10821.786100
10841.463900
10861.901100
10881.819200
10901.779400
10921.799800
10941.794800
10961.671800
10981.808300
11001.867800
11021.513200
11041.732500
11061.699000
11081.797600
11101.734600
11121.799900
11141.832000
11161.798100
11181.753800
11201.770200
11221.800000
11241.658100
11261.674200
11281.749400
11301.618400
11321.690800
11341.814500
11361.749300
11381.670800
11401.927000
11421.883300
11441.868600
11461.488400
11481.653700
11501.586100
11521.578800
11541.685200
11561.626000
11581.665300
11601.802100
11621.725900
11641.757700
11661.509200
11681.827200
11701.692300
11721.782300
11741.686600
11761.692900
11782.001400
11801.533000
11821.751000
11841.717700
11861.578900
11881.882400
11901.634400
11921.563600
11941.508500
11961.882800
11981.555800
12001.608500
12021.755900
12041.728400
12061.563200
12081.935800
12101.602800
12122.093000
12141.944500
12161.827800
12181.873200
12201.825100
12221.985900
12241.810800
12261.673700
12281.644500
12301.858000
12321.563200
12341.869200
12361.590500
12381.584600
12401.662100
12421.760300
12441.736100
12461.673800
12481.667200
12501.751100
12521.801100
12541.682700
12561.778000
12581.850600
12601.880900
12621.680000
12641.723600
12661.689100
12681.839100
12701.922200
12721.619900
12741.681500
12761.843600
12781.776900
12801.747600
12821.632800
12841.698700
12861.868900
12881.879600
12901.573000
12921.753900
12941.506200
12961.797300
12981.599400
13001.853600
13021.643600
13042.119500
13061.764500
13081.768800
13101.642800
13121.881400
13141.624700
13161.813100
13181.731200
13201.642700
13221.630000
13241.777100
13261.582500
13281.578000
13301.819300
13321.741600
13341.662600
13361.604200
13381.540800
13401.820800
13421.849900
13441.632000
13461.873100
13481.814300
13501.683700
13521.779700
13541.914900
13561.754100
13581.858600
13601.631900
13621.991900
13641.768800
13661.493300
13681.765400
13701.847200
13721.971400
13741.862300
13761.905200
13781.743400
13801.685800
13821.593000
13841.732000
13862.051000
13881.904800
13901.647100
13921.661300
13941.777200
13961.746600
13981.714600
14001.754200
14021.553700
14041.578000
14061.836800
14081.622600
14101.526900
14121.750700
14141.710000
14161.669500
14181.940000
14201.510800
14221.744100
14241.794000
14261.833600
14281.578600
14301.808200
14321.767000
14341.716100
14361.775200
14381.824500
14401.578000
14421.754000
14441.732100
14461.779000
14481.724600
14501.659000
14521.689600
14541.572000
14561.806900
14581.740300
14601.757600
14621.859500
14641.549700
14661.764600
14681.692600
14701.724900
14721.927600
14742.005700
14761.641300
14781.606800
14801.719100
14821.733100
14841.834000
14861.866000
14881.724500
14901.590200
14921.823200
14942.083500
14961.797000
14981.541000
15001.797300
15021.689300
15041.649100
15061.729200
15081.604800
15101.694000
15121.832200
15141.746700
15162.063700
15181.658300
15201.742900
15221.813400
15241.657000
15261.854600
15281.989600
15301.654000
15321.831200
15341.687000
15361.791300
15381.696500
15401.587400
15421.786500
15441.831900
15461.900400
15481.778300
15501.933300
15521.713800
15541.835600
15561.825600
15581.721100
15601.538800
15621.529700
15641.474900
15662.015600
15681.686900
15701.732100
15721.717100
15741.754900
15761.956200
15781.779900
15801.652200
15821.770600
15841.456700
15861.732600
15881.708200
15901.672900
15921.674800
15941.878000
15961.703100
15981.724300
16001.813800
16021.948300
16041.740500
16061.530200
16081.707500
16101.788500
16121.724700
16141.761500
16161.765400
16181.930800
16201.769900
16221.647800
16241.736000
16261.563500
16281.572600
16301.613900
16321.744500
16341.819600
16361.913800
16381.681500
16401.903900
16421.647800
16441.827300
16461.806500
16481.718100
16501.814600
16521.886100
16541.765300
16561.772900
16581.643900
16601.790200
16621.729000
16641.787800
16661.677100
16681.841900
16701.776300
16721.659400
16741.776300
16761.912900
16781.708100
16801.797900
16821.563400
16841.559400
16861.871600
16881.752200
16901.680900
16921.641500
16941.862500
16961.862100
16981.597700
17001.669100
17021.599000
17041.724600
17061.849700
17081.724000
17101.943400
17121.591700
17141.657900
17161.896800
17181.623500
17201.850900
17221.668200
17241.710300
17261.590500
17281.672100
17301.637300
17321.707500
17341.917400
17361.766200
17381.698000
17401.742200
17421.748000
17441.808300
17461.877600
17481.873800
17501.965400
17521.748200
17541.695300
17561.657300
17581.975400
17601.890200
17621.769100
17641.748400
17661.867600
17681.681200
17701.754100
17721.849100
17741.813700
17761.824400
17781.788800
17801.670200
17821.639300
17841.579500
17861.838200
17881.655100
17901.586500
17921.817200
17941.612700
17961.640700
17981.834700
18001.751400
18021.735200
18041.686600
18061.606700
18081.599900
18101.428300
18121.642700
18141.777700
18161.609700
18181.657800
18201.756300
18221.782700
18242.053200
18261.882300
18281.823000
18301.743900
18321.748700
18341.703800
18361.955000
18381.661000
18401.710700
18421.634700
18442.034000
18461.420700
18481.779900
18501.707400
18521.873400
18541.713600
18561.624200
18581.801500
18601.669000
18621.788100
18641.706000
18661.638900
18681.620200
18701.442900
18721.633800
18741.814900
18761.765500
18781.872400
18801.917300
18821.948600
18841.454300
18861.733500
18881.884400
18901.759700
18921.793200
18941.812300
18961.748100
18981.843700
19001.723800
19021.771600
19041.629600
19061.846000
19081.849100
19101.695500
19121.713800
19141.662700
19161.673500
19181.758700
19201.652700
19221.727700
19241.802300
19261.466500
19281.743200
19301.624600
19321.622300
19341.687700
19361.858300
19381.449400
19401.624500
19421.618100
19441.848000
19461.558900
19481.861400
19501.611000
19521.471600
19541.727100
19561.574300
19581.637200
19601.785600
19621.751300
19641.803000
19661.822600
19681.627300
19701.841800
19721.631400
19741.817400
19762.060400
19781.709200
19801.804400
19821.844800
19841.736700
19861.686800
19881.619800
19901.676400
19921.764600
19941.793100
19961.610500
19981.719300
20001.839500
20021.542600
20041.736800
20061.787900
20081.635100
20101.893900
20121.632300
20141.635700
20161.738900
20181.627300
20201.609000
20221.894900
20241.720600
20261.697000
20281.545200
20301.841900
20321.687400
20341.575800
20361.588700
20381.906400
20401.727400
20421.595300
20441.430600
20461.763800
20481.806500
20501.611400
20521.929300
20541.842700
20561.504800
20581.824000
20601.831700
20621.745400
20641.746400
20661.567800
20681.796700
20702.051600
20721.793600
20741.852200
20761.800100
20781.750200
20801.605000
20822.004700
20841.574600
20861.752400
20881.745600
20901.861300
20921.628100
20941.659800
20961.650100
20981.768100
21001.861800
21021.821400
21041.659100
21061.708000
21081.754200
21101.663100
21121.905500
21141.801700
21161.838100
21181.835100
21201.712700
21221.509800
21241.990100
21261.719400
21281.546000
21301.737900
21321.695300
21341.746300
21361.835900
21381.971800
21401.659100
21421.866100
21441.902700
21461.973600
21481.713200
21501.678800
21521.884700
21541.508300
21561.623100
21581.779700
21601.674400
21621.738100
21641.712500
21661.640600
21681.811100
21701.657300
21721.785700
21741.834300
21761.711600
21781.734300
21801.796900
21822.009800
21841.618800
21861.734300
21881.590500
21901.767300
21921.573400
21941.566800
21961.608500
21981.736400
22001.726500
22021.722900
22041.745700
22061.825100
22081.665700
22101.845200
22121.666400
22141.834600
22161.668100
22181.680400
22201.658500
22221.750800
22241.707600
22261.527600
22281.672000
22301.786600
22321.764500
22341.741800
22361.775900
22381.473400
22401.452900
22422.076800
22441.716700
22461.823600
22482.014800
22501.787800
22521.914100
22541.674700
22561.912100
22581.843700
22601.647800
22621.739000
22641.707800
22661.755300
22681.710600
22701.799400
22721.810500
22741.786100
22761.588500
22781.802700
22801.873200
22821.783300
22841.565100
22861.806800
22881.738100
22902.232700
22921.993600
22941.705300
22961.634800
22982.002700
23001.626200
23021.679300
23041.745800
23061.773200
23081.861700
23101.607100
23121.704000
23141.891400
23161.900800
23181.637900
23201.737500
23221.497100
23241.562300
23261.646200
23281.744900
23301.708900
23321.757100
23341.744600
23361.669000
23381.891400
23401.714700
23421.762400
23441.739600
23461.686000
23481.626400
23501.707800
23521.545100
23541.713100
23561.724700
23581.672300
23601.991500
23621.975900
23641.778600
23661.768000
23681.688500
23701.822000
23721.914800
23741.727000
23761.613100
23781.640800
23801.975300
23821.804700
23841.911900
23861.943400
23881.746700
23901.791000
23921.706000
23941.600400
23961.658300
23981.605200
24001.829100
24021.836200
24041.733400
24061.708000
24081.560500
24101.793100
24121.818100
24141.672500
24161.712200
24181.731600
24201.842000
24221.817800
24241.744900
24261.882800
24281.856900
24301.662400
24321.491400
24342.122300
24361.816900
24381.773000
24401.565200
24422.182300
24441.492100
24461.857400
24481.676600
24501.544200
24521.785700
24541.850200
24561.764700
24581.685300
24601.683900
24621.681200
24641.602000
24661.952000
24681.649000
24701.735500
24721.665200
24741.935200
24761.704500
24781.764900
24801.838500
24821.726400
24841.907400
24861.694600
24881.622500
24901.651000
24921.642800
24941.684000
24961.672400
24981.753100
25001.707400
25021.855600
25041.751500
25061.801800
25081.617100
25101.779000
25121.825400
25141.724900
25161.495100
25181.676300
25201.531700
25221.634800
25241.884600
25261.642400
25281.950300
25301.751700
25321.621800
25341.620600
25361.850500
25381.667500
25401.659300
25421.589800
25441.816700
25461.705700
25481.559800
25501.867300
25521.721400
25541.817200
25561.851600
25581.511900
25601.941200
25621.730500
25641.609400
25661.857100
25681.830700
25701.703600
25721.711200
25741.730000
25761.827200
25781.663000
25801.691600
25821.684800
25841.654400
25861.678000
25881.720300
25901.652400
25921.612700
25941.854900
25961.763000
25981.580900
26001.595500
26021.812300
26041.547800
26061.633100
26081.675000
26101.770800
26121.663300
26141.845400
26161.828900
26181.675300
26201.767200
26221.757500
26241.599000
26261.629000
26281.812600
26301.792500
26321.667900
26341.651500
26361.639400
26381.644600
26401.605900
26421.549600
26441.824600
26461.778700
26481.645800
26501.632500
26521.953400
26541.693600
26561.790200
26581.934700
26601.740400
26621.532700
26641.778200
26661.888100
26681.587000
26702.015300
26721.653300
26741.730100
26761.614400
26781.836300
26801.468500
26821.674900
26841.541400
26861.621500
26881.545000
26901.763800
26921.729700
26941.581900
26961.902600
26981.670600
27001.700000
27021.544800
27041.628200
27061.643000
27082.161700
27101.582400
27121.663200
27141.545300
27161.615700
27181.663900
27201.953800
27221.733100
27241.939700
27261.516100
27281.855200
27301.628200
27321.651000
27341.701200
27361.631100
27381.897300
27401.815300
27421.752700
27441.690500
27461.782700
27481.718400
27501.715500
27521.622700
27541.482800
27561.824400
27581.994400
27601.766400
27621.750200
27641.788200
27661.667300
27681.639700
27701.814300
27721.468700
27741.934700
27761.992600
27781.794000
27801.442000
27821.776900
27842.041000
27861.739100
27881.958500
27901.631800
27921.792700
27941.892400
27961.639300
27981.597300
28001.862700
28021.809300
28041.626400
28061.562600
28081.666900
28101.745200
28121.664400
28141.688000
28161.783000
28181.662300
28201.576700
28221.731700
28241.589900
28261.704700
28281.565000
28301.643000
28321.713900
28341.734800
28361.848600
28381.624400
28401.558600
28421.901600
28441.823700
28461.813700
28481.658200
28501.774100
28521.539500
28541.677900
28561.717100
28581.646700
28601.922200
28621.825300
28641.985800
28662.068700
28681.564000
28701.751600
28721.958200
28741.800900
28761.785600
28781.898700
28801.606600
28821.697500
28841.766700
28861.661700
28881.688600
28901.670500
28921.554000
28941.894800
28961.638700
28981.622900
29001.754900
29021.881000
29041.718300
29061.812600
29081.587600
29101.777400
29122.094600
29141.760800
29161.815300
29181.678600
29201.940100
29221.576200
29241.978100
29261.861700
29281.933000
29302.043900
29321.758700
29341.852500
29361.723400
29381.644500
29401.773000
29421.710900
29441.606800
29461.750200
29481.888200
29501.583500
29521.640500
29541.836100
29561.680700
29581.738200
29601.971200
29621.704700
29641.583100
29661.641700
29681.717600
29701.790300
29721.543800
29741.841400
29761.668100
29781.662400
29801.925000
29821.744300
29841.685100
29861.835700
29881.631000
29901.740800
29921.701100
29941.517300
29961.689700
29981.896100
30001.870100
30021.880300
30041.546200
30061.647200
30081.756900
30101.547700
30121.654300
30141.689500
30161.691300
30181.565700
30201.750800
30221.845200
30241.656700
30261.934400
30281.542900
30301.703700
30321.866300
30341.484700
30361.641900
30381.952300
30401.998500
30421.697100
30441.621500
30461.766500
30481.490500
30501.761600
30521.739200
30541.613000
30561.672200
30581.730100
30601.726100
30621.770300
30641.682200
30661.610700
30681.737400
30701.662700
30721.933300
30741.730900
30761.683700
30781.828700
30801.795100
30821.704400
30841.636200
30861.737200
30881.744100
30901.790300
30921.569600
30941.696300
30961.859100
30981.597400
31001.498300
31021.668300
31041.709600
31061.491300
31081.687400
31101.776700
31121.738900
31141.713900
31161.644500
31181.786900
31201.597000
31221.799700
31241.753300
31262.094900
31281.753300
31301.808000
31321.842800
31341.618500
31361.783800
31381.592300
31401.638300
31421.787600
31441.491700
31461.873600
31481.745300
31501.768000
31521.993000
31541.874000
31561.894300
31581.670300
31601.734200
31621.733600
31641.749800
31661.633500
31681.651900
31702.008600
31721.783800
31741.605100
31761.623600
31781.814700
31801.902100
31821.696700
31841.729000
31861.621900
31881.799600
31901.600000
31921.703500
31941.817200
31961.646400
31981.913000
32001.891100
32021.679000
32041.688100
32061.869900
32081.616300
32101.750100
32121.758900
32141.909900
32161.709500
32181.778500
32201.753500
32221.752900
32241.808400
32261.796400
32281.744000
32301.856200
32321.579700
32341.587400
32362.076400
32381.873500
32401.702400
32421.631100
32441.884600
32462.138000
32481.768000
32501.683100
32521.611500
32541.511600
32562.064000
32581.535000
32601.765500
32621.763400
32641.755200
32661.827000
32681.844800
32701.741200
32721.716200
32741.622700
32761.844100
32781.891600
32801.945000
32821.814000
32841.582400
32861.717200
32881.832100
32901.644700
32921.586100
32941.725200
32961.573900
32981.864000
33001.664400
33021.767900
33041.875500
33061.663900
33081.581700
33101.483600
33121.731800
33141.626600
33161.917500
33181.896100
33201.647200
33221.762300
33241.756800
33261.857600
33281.590600
33301.722100
33321.928900
33341.859700
33361.761400
33381.661800
33401.823900
33421.729500
33441.812400
33461.602900
33481.580000
33501.974300
33521.693300
33541.669700
33561.830700
33581.816500
33601.628800
33621.753400
33641.651900
33661.730900
33681.634100
33701.850100
33721.681900
33741.780200
33761.558200
33781.784200
33801.728200
33821.683900
33841.574000
33861.680000
33881.595300
33901.525600
33921.727800
33941.871400
33961.601200
33981.654400
34001.636000
34021.797000
34041.664900
34061.665700
34081.759800
34101.687000
34121.767700
34141.686400
34161.706700
34181.673100
34201.798300
34221.844000
34241.817200
34261.659700
34281.864500
34301.703600
34321.508100
34341.879700
34361.581200
34381.603400
34401.706200
34421.773700
34441.718800
34461.828200
34481.555300
34501.853900
34521.846600
34541.858100
34561.698600
34581.481900
34601.792400
34621.646800
34641.725400
34661.555100
34681.704300
34701.583900
34721.839600
34741.613700
34761.759600
34781.587800
34801.732000
34821.670100
34841.694500
34861.743200
34881.433500
34901.695800
34921.676900
34941.756100
34961.538000
34981.858700
35001.619900
35021.884700
35041.774900
35061.711800
35081.623200
35101.591300
35121.789500
35141.904100
35161.876500
35181.612400
35201.519800
35221.744800
35241.611000
35261.763700
35281.785300
35301.788000
35321.641200
35341.766500
35362.041600
35381.639600
35401.634500
35421.651300
35441.695600
35461.835100
35481.651300
35501.615800
35521.603300
35541.950200
35561.686600
35581.531700
35601.483600
35621.667900
35641.730700
35661.848500
35681.587400
35701.666200
35721.906100
35741.318500
35761.860700
35781.630100
35801.728800
35821.634800
35841.600500
35861.582500
35881.832600
35901.771700
35922.000300
35941.597700
35961.803700
35981.877900
36001.700000
36021.764300
36041.469300
36061.821200
36081.860500
36101.757400
36121.623800
36141.837800
36161.724000
36181.455000
36201.810100
36221.741800
36241.705000
36261.876200
36281.669600
36301.689000
36321.702300
36341.841100
36361.450600
36381.670500
36401.903300
36421.675300
36441.768400
36461.667500
36481.597200
36501.781900
36521.889900
36541.656900
36561.828400
36581.957300
36601.763000
36621.827900
36641.635100
36661.641300
36681.582200
36701.833200
36721.695700
36741.795600
36761.481900
36781.707300
36801.533000
36821.747500

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 40min 59s, sys: 2.42 s, total: 41min 1s\n", + "Wall time: 49min 40s\n" + ] + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=3683, training_loss=1.7337735593561696, metrics={'train_runtime': 2980.4569, 'train_samples_per_second': 4.943, 'train_steps_per_second': 1.236, 'total_flos': 1.980004545250345e+17, 'train_loss': 1.7337735593561696, 'epoch': 1.0})" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "# Start training\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "b12267be-fbfe-4aeb-bb11-3454d9a70416", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [103/103 00:43]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'eval_loss': 1.7533047199249268,\n", + " 'eval_runtime': 43.851,\n", + " 'eval_samples_per_second': 18.677,\n", + " 'eval_steps_per_second': 2.349,\n", + " 'epoch': 1.0}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#evaluate and return the metrics\n", + "trainer.evaluate()" + ] + }, + { + "cell_type": "markdown", + "id": "9351292f", + "metadata": {}, + "source": [ + "Load a test dataset and try a random sample for summarization." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "2f220ba3-f782-4a86-a349-ed8d8cda405e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Found cached dataset samsum (/home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summarize the chat dialogue:\n", + "Richie: Pogba\n", + "Clay: Pogboom\n", + "Richie: what a s strike yoh!\n", + "Clay: was off the seat the moment he chopped the ball back to his right foot\n", + "Richie: me too dude\n", + "Clay: hope his form lasts\n", + "Richie: This season he's more mature\n", + "Clay: Yeah, Jose has his trust in him\n", + "Richie: everyone does\n", + "Clay: yeah, he really deserved to score after his first 60 minutes\n", + "Richie: reward\n", + "Clay: yeah man\n", + "Richie: cool then \n", + "Clay: cool\n", + "---\n", + "Summary:\n", + "\n" + ] + } + ], + "source": [ + "# Load dataset from the hub\n", + "test_dataset = load_dataset(\"samsum\", split=\"test\")\n", + "\n", + "# select a random test sample\n", + "sample = test_dataset[randint(0, len(test_dataset))]\n", + "\n", + "# format sample\n", + "prompt_template = f\"Summarize the chat dialogue:\\n{{dialogue}}\\n---\\nSummary:\\n\"\n", + "\n", + "test_sample = prompt_template.format(dialogue=sample[\"dialogue\"])\n", + "\n", + "print(test_sample)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "413c44ae-35b3-47fa-b3b4-9eaeafec9da6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "input_ids = tokenizer(test_sample, return_tensors=\"pt\").input_ids" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1af86337-48b6-4165-a105-d4650eb07762", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.\n", + "Setting `pad_token_id` to `eos_token_id`:11 for open-end generation.\n" + ] + }, + { + "ename": "RuntimeError", + "evalue": "Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument index in method wrapper_CUDA__index_select)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[23], line 5\u001b[0m\n\u001b[1;32m 2\u001b[0m tokens_for_summary \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m30\u001b[39m\n\u001b[1;32m 3\u001b[0m output_tokens \u001b[38;5;241m=\u001b[39m input_ids\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m+\u001b[39m tokens_for_summary\n\u001b[0;32m----> 5\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate\u001b[49m\u001b[43m(\u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minput_ids\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdo_sample\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_length\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_tokens\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6\u001b[0m gen_text \u001b[38;5;241m=\u001b[39m tokenizer\u001b[38;5;241m.\u001b[39mbatch_decode(outputs)[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28mprint\u001b[39m(gen_text)\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/peft/peft_model.py:912\u001b[0m, in \u001b[0;36mPeftModelForCausalLM.generate\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 910\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbase_model\u001b[38;5;241m.\u001b[39mgeneration_config \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgeneration_config\n\u001b[1;32m 911\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 912\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbase_model\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 913\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m:\n\u001b[1;32m 914\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbase_model\u001b[38;5;241m.\u001b[39mprepare_inputs_for_generation \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbase_model_prepare_inputs_for_generation\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/torch/utils/_contextlib.py:115\u001b[0m, in \u001b[0;36mcontext_decorator..decorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecorate_context\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m ctx_factory():\n\u001b[0;32m--> 115\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/transformers/generation/utils.py:1577\u001b[0m, in \u001b[0;36mGenerationMixin.generate\u001b[0;34m(self, inputs, generation_config, logits_processor, stopping_criteria, prefix_allowed_tokens_fn, synced_gpus, assistant_model, streamer, **kwargs)\u001b[0m\n\u001b[1;32m 1569\u001b[0m input_ids, model_kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_expand_inputs_for_generation(\n\u001b[1;32m 1570\u001b[0m input_ids\u001b[38;5;241m=\u001b[39minput_ids,\n\u001b[1;32m 1571\u001b[0m expand_size\u001b[38;5;241m=\u001b[39mgeneration_config\u001b[38;5;241m.\u001b[39mnum_return_sequences,\n\u001b[1;32m 1572\u001b[0m is_encoder_decoder\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39mis_encoder_decoder,\n\u001b[1;32m 1573\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mmodel_kwargs,\n\u001b[1;32m 1574\u001b[0m )\n\u001b[1;32m 1576\u001b[0m \u001b[38;5;66;03m# 13. run sample\u001b[39;00m\n\u001b[0;32m-> 1577\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msample\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1578\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1579\u001b[0m \u001b[43m \u001b[49m\u001b[43mlogits_processor\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlogits_processor\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1580\u001b[0m \u001b[43m \u001b[49m\u001b[43mlogits_warper\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlogits_warper\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1581\u001b[0m \u001b[43m \u001b[49m\u001b[43mstopping_criteria\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstopping_criteria\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1582\u001b[0m \u001b[43m \u001b[49m\u001b[43mpad_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgeneration_config\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpad_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1583\u001b[0m \u001b[43m \u001b[49m\u001b[43meos_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgeneration_config\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43meos_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1584\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_scores\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgeneration_config\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutput_scores\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1585\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict_in_generate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgeneration_config\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreturn_dict_in_generate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1586\u001b[0m \u001b[43m \u001b[49m\u001b[43msynced_gpus\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msynced_gpus\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1587\u001b[0m \u001b[43m \u001b[49m\u001b[43mstreamer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstreamer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1588\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mmodel_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1589\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1591\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m is_beam_gen_mode:\n\u001b[1;32m 1592\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m generation_config\u001b[38;5;241m.\u001b[39mnum_return_sequences \u001b[38;5;241m>\u001b[39m generation_config\u001b[38;5;241m.\u001b[39mnum_beams:\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/transformers/generation/utils.py:2629\u001b[0m, in \u001b[0;36mGenerationMixin.sample\u001b[0;34m(self, input_ids, logits_processor, stopping_criteria, logits_warper, max_length, pad_token_id, eos_token_id, output_attentions, output_hidden_states, output_scores, return_dict_in_generate, synced_gpus, streamer, **model_kwargs)\u001b[0m\n\u001b[1;32m 2626\u001b[0m model_inputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprepare_inputs_for_generation(input_ids, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mmodel_kwargs)\n\u001b[1;32m 2628\u001b[0m \u001b[38;5;66;03m# forward pass to get next token\u001b[39;00m\n\u001b[0;32m-> 2629\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2630\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mmodel_inputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2631\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 2632\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2633\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2634\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2636\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m synced_gpus \u001b[38;5;129;01mand\u001b[39;00m this_peer_finished:\n\u001b[1;32m 2637\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m \u001b[38;5;66;03m# don't waste resources running the code we don't need\u001b[39;00m\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/.cache/huggingface/modules/transformers_modules/tiiuae/falcon-7b/2f5c3cd4eace6be6c0f12981f377fb35e5bf6ee5/modelling_RW.py:753\u001b[0m, in \u001b[0;36mRWForCausalLM.forward\u001b[0;34m(self, input_ids, past_key_values, attention_mask, head_mask, inputs_embeds, labels, use_cache, output_attentions, output_hidden_states, return_dict, **deprecated_arguments)\u001b[0m\n\u001b[1;32m 749\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mGot unexpected arguments: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdeprecated_arguments\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 751\u001b[0m return_dict \u001b[38;5;241m=\u001b[39m return_dict \u001b[38;5;28;01mif\u001b[39;00m return_dict \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39muse_return_dict\n\u001b[0;32m--> 753\u001b[0m transformer_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransformer\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 754\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 755\u001b[0m \u001b[43m \u001b[49m\u001b[43mpast_key_values\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpast_key_values\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 756\u001b[0m \u001b[43m \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 757\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 758\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs_embeds\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs_embeds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 759\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 760\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 761\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 762\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreturn_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 763\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 764\u001b[0m hidden_states \u001b[38;5;241m=\u001b[39m transformer_outputs[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 766\u001b[0m lm_logits \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlm_head(hidden_states)\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m~/.cache/huggingface/modules/transformers_modules/tiiuae/falcon-7b/2f5c3cd4eace6be6c0f12981f377fb35e5bf6ee5/modelling_RW.py:590\u001b[0m, in \u001b[0;36mRWModel.forward\u001b[0;34m(self, input_ids, past_key_values, attention_mask, head_mask, inputs_embeds, use_cache, output_attentions, output_hidden_states, return_dict, **deprecated_arguments)\u001b[0m\n\u001b[1;32m 587\u001b[0m head_mask \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_head_mask(head_mask, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39mn_layer)\n\u001b[1;32m 589\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m inputs_embeds \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 590\u001b[0m inputs_embeds \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mword_embeddings\u001b[49m\u001b[43m(\u001b[49m\u001b[43minput_ids\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 592\u001b[0m hidden_states \u001b[38;5;241m=\u001b[39m inputs_embeds\n\u001b[1;32m 594\u001b[0m presents \u001b[38;5;241m=\u001b[39m () \u001b[38;5;28;01mif\u001b[39;00m use_cache \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/torch/nn/modules/module.py:1538\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1535\u001b[0m bw_hook \u001b[38;5;241m=\u001b[39m hooks\u001b[38;5;241m.\u001b[39mBackwardHook(\u001b[38;5;28mself\u001b[39m, full_backward_hooks, backward_pre_hooks)\n\u001b[1;32m 1536\u001b[0m args \u001b[38;5;241m=\u001b[39m bw_hook\u001b[38;5;241m.\u001b[39msetup_input_hook(args)\n\u001b[0;32m-> 1538\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1539\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks:\n\u001b[1;32m 1540\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m hook_id, hook \u001b[38;5;129;01min\u001b[39;00m (\n\u001b[1;32m 1541\u001b[0m \u001b[38;5;241m*\u001b[39m_global_forward_hooks\u001b[38;5;241m.\u001b[39mitems(),\n\u001b[1;32m 1542\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks\u001b[38;5;241m.\u001b[39mitems(),\n\u001b[1;32m 1543\u001b[0m ):\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/torch/nn/modules/sparse.py:162\u001b[0m, in \u001b[0;36mEmbedding.forward\u001b[0;34m(self, input)\u001b[0m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;28minput\u001b[39m: Tensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 162\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mF\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43membedding\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 163\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpadding_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmax_norm\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 164\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnorm_type\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mscale_grad_by_freq\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msparse\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.local/lib/python3.9/site-packages/torch/nn/functional.py:2210\u001b[0m, in \u001b[0;36membedding\u001b[0;34m(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)\u001b[0m\n\u001b[1;32m 2204\u001b[0m \u001b[38;5;66;03m# Note [embedding_renorm set_grad_enabled]\u001b[39;00m\n\u001b[1;32m 2205\u001b[0m \u001b[38;5;66;03m# XXX: equivalent to\u001b[39;00m\n\u001b[1;32m 2206\u001b[0m \u001b[38;5;66;03m# with torch.no_grad():\u001b[39;00m\n\u001b[1;32m 2207\u001b[0m \u001b[38;5;66;03m# torch.embedding_renorm_\u001b[39;00m\n\u001b[1;32m 2208\u001b[0m \u001b[38;5;66;03m# remove once script supports set_grad_enabled\u001b[39;00m\n\u001b[1;32m 2209\u001b[0m _no_grad_embedding_renorm_(weight, \u001b[38;5;28minput\u001b[39m, max_norm, norm_type)\n\u001b[0;32m-> 2210\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43membedding\u001b[49m\u001b[43m(\u001b[49m\u001b[43mweight\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpadding_idx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mscale_grad_by_freq\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msparse\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mRuntimeError\u001b[0m: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument index in method wrapper_CUDA__index_select)" + ] + } + ], + "source": [ + "#set the tokens for the summary evaluation\n", + "tokens_for_summary = 30\n", + "output_tokens = input_ids.shape[1] + tokens_for_summary\n", + "\n", + "outputs = model.generate(inputs=input_ids, do_sample=True, max_length=output_tokens)\n", + "gen_text = tokenizer.batch_decode(outputs)[0]\n", + "print(gen_text)" + ] + } + ], + "metadata": { + "availableInstances": [ + { + "_defaultOrder": 0, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.t3.medium", + "vcpuNum": 2 + }, + { + "_defaultOrder": 1, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.t3.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 2, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.t3.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 3, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.t3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 4, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 5, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 6, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 7, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 8, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 9, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 10, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 11, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 12, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5d.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 13, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5d.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 14, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5d.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 15, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5d.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 16, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5d.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 17, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5d.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 18, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5d.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 19, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 20, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": true, + "memoryGiB": 0, + "name": "ml.geospatial.interactive", + "supportedImageNames": [ + "sagemaker-geospatial-v1-0" + ], + "vcpuNum": 0 + }, + { + "_defaultOrder": 21, + "_isFastLaunch": true, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.c5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 22, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.c5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 23, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.c5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 24, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.c5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 25, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 72, + "name": "ml.c5.9xlarge", + "vcpuNum": 36 + }, + { + "_defaultOrder": 26, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 96, + "name": "ml.c5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 27, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 144, + "name": "ml.c5.18xlarge", + "vcpuNum": 72 + }, + { + "_defaultOrder": 28, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.c5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 29, + "_isFastLaunch": true, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g4dn.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 30, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g4dn.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 31, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g4dn.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 32, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g4dn.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 33, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g4dn.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 34, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g4dn.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 35, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 61, + "name": "ml.p3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 36, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 244, + "name": "ml.p3.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 37, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 488, + "name": "ml.p3.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 38, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.p3dn.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 39, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.r5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 40, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.r5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 41, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.r5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 42, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.r5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 43, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.r5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 44, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.r5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 45, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.r5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 46, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.r5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 47, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 48, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 49, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 50, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 51, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 52, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 53, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.g5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 54, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.g5.48xlarge", + "vcpuNum": 192 + }, + { + "_defaultOrder": 55, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.g5.12xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 56, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.g5.12xlarge", + "vcpuNum": 96 + } + ], + "instance_type": "ml.g5.12xlarge", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-qlora-finetune-summarize-4batch.ipynb b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-qlora-finetune-summarize-4batch.ipynb new file mode 100644 index 0000000..78b53fc --- /dev/null +++ b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-qlora-finetune-summarize-4batch.ipynb @@ -0,0 +1,8754 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "36a2f3b4", + "metadata": {}, + "source": [ + "# Fine-tune Falcon-40B with QLoRA" + ] + }, + { + "cell_type": "markdown", + "id": "639d3904", + "metadata": {}, + "source": [ + "--- \n", + "\n", + "In this demo notebook, we demonstrate how to fine-tune the Falcon-40B model using QLoRA, Hugging Face PEFT, and bitsandbytes. \n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "2ec1c5bb", + "metadata": {}, + "source": [ + "This notebook was tested in Amazon SageMaker Studio with Python 3 (Data Science 3.0) kernel with a ml.g5.12xlarge instance." + ] + }, + { + "cell_type": "markdown", + "id": "8df4c2bc", + "metadata": {}, + "source": [ + "Install the required libriaries, including the Hugging Face libraries, and restart the kernel." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "153d07ab-3e43-45b1-89fd-140352b1d6ce", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%pip install -q -U torch==2.0.1 bitsandbytes==0.39.1\n", + "%pip install -q -U datasets py7zr einops tensorboardX\n", + "%pip install -q -U git+https://github.com/huggingface/transformers.git@850cf4af0ce281d2c3e7ebfc12e0bc24a9c40714\n", + "%pip install -q -U git+https://github.com/huggingface/peft.git@e2b8e3260d3eeb736edf21a2424e89fe3ecf429d\n", + "%pip install -q -U git+https://github.com/huggingface/accelerate.git@b76409ba05e6fa7dfc59d50eee1734672126fdba" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0d6fc2fd-d42e-497e-8cb2-634ac267484a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Collecting py7zr\n", + " Downloading py7zr-0.20.5-py3-none-any.whl (66 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.4/66.4 kB\u001b[0m \u001b[31m864.2 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m31m1.5 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting texttable (from py7zr)\n", + " Downloading texttable-1.6.7-py2.py3-none-any.whl (10 kB)\n", + "Collecting pycryptodomex>=3.6.6 (from py7zr)\n", + " Downloading pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mm eta \u001b[36m0:00:01\u001b[0m0:01\u001b[0m:01\u001b[0m\n", + "\u001b[?25hCollecting pyzstd>=0.14.4 (from py7zr)\n", + " Downloading pyzstd-0.15.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (412 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m412.3/412.3 kB\u001b[0m \u001b[31m9.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mm eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting pyppmd<1.1.0,>=0.18.1 (from py7zr)\n", + " Downloading pyppmd-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (138 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.7/138.7 kB\u001b[0m \u001b[31m2.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m1m291.6 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting pybcj>=0.6.0 (from py7zr)\n", + " Downloading pybcj-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.6/49.6 kB\u001b[0m \u001b[31m970.7 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting multivolumefile>=0.2.3 (from py7zr)\n", + " Downloading multivolumefile-0.2.3-py3-none-any.whl (17 kB)\n", + "Collecting brotli>=1.0.9 (from py7zr)\n", + " Downloading Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl (357 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m357.2/357.2 kB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting inflate64>=0.3.1 (from py7zr)\n", + " Downloading inflate64-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (92 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m93.0/93.0 kB\u001b[0m \u001b[31m1.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: psutil in /lustrefs/disk/home/tsaengsu/.local/lib/python3.9/site-packages (from py7zr) (5.9.5)\n", + "Installing collected packages: texttable, brotli, pyzstd, pyppmd, pycryptodomex, pybcj, multivolumefile, inflate64, py7zr\n", + "Successfully installed brotli-1.0.9 inflate64-0.3.1 multivolumefile-0.2.3 py7zr-0.20.5 pybcj-1.0.1 pycryptodomex-3.18.0 pyppmd-1.0.0 pyzstd-0.15.9 texttable-1.6.7\n" + ] + } + ], + "source": [ + "!pip install py7zr" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f5185bb8-3c83-483c-a145-dd4c0b9941f2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Add installed cuda runtime to path for bitsandbytes \n", + "import os\n", + "import nvidia\n", + "\n", + "cuda_install_dir = '/'.join(nvidia.__file__.split('/')[:-1]) + '/cuda_runtime/lib/'\n", + "os.environ['LD_LIBRARY_PATH'] = cuda_install_dir" + ] + }, + { + "cell_type": "markdown", + "id": "70b26c91", + "metadata": {}, + "source": [ + "\n", + "\n", + "To train our model, we need to convert our inputs (text) to token IDs. This is done by a Hugging Face Transformers Tokenizer. In addition to QLoRA, we will use bitsanbytes 4-bit precision to quantize out frozen LLM to 4-bit and attach LoRA adapters on it.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "85946e42-9f8a-488c-8b90-8afedf311b02", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "===================================BUG REPORT===================================\n", + "Welcome to bitsandbytes. For bug reports, please run\n", + "\n", + "python -m bitsandbytes\n", + "\n", + " and submit this information together with your error trace to: https://github.com/TimDettmers/bitsandbytes/issues\n", + "================================================================================\n", + "bin /home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/libbitsandbytes_cuda118.so\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/cuda_setup/main.py:149: UserWarning: Found duplicate ['libcudart.so', 'libcudart.so.11.0', 'libcudart.so.12.0'] files: {PosixPath('/home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so.11.0'), PosixPath('/home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so')}.. We'll flip a coin and try one of these, in order to fail forward.\n", + "Either way, this might cause trouble in the future:\n", + "If you get `CUDA error: invalid device function` errors, the above might be the cause and the solution is to make sure only one ['libcudart.so', 'libcudart.so.11.0', 'libcudart.so.12.0'] in the paths that we search based on your env.\n", + " warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CUDA SETUP: CUDA runtime path found: /home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so.11.0\n", + "CUDA SETUP: Highest compute capability among GPUs detected: 8.0\n", + "CUDA SETUP: Detected CUDA version 118\n", + "CUDA SETUP: Loading binary /home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/libbitsandbytes_cuda118.so...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7412bdcab9e94b7493d39d63229ae1eb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/2 [00:00\n" + ] + } + ], + "source": [ + "from random import randint\n", + "\n", + "# custom instruct prompt start\n", + "prompt_template = f\"Summarize the chat dialogue:\\n{{dialogue}}\\n---\\nSummary:\\n{{summary}}{{eos_token}}\"\n", + "\n", + "# template dataset to add prompt to each sample\n", + "def template_dataset(sample):\n", + " sample[\"text\"] = prompt_template.format(dialogue=sample[\"dialogue\"],\n", + " summary=sample[\"summary\"],\n", + " eos_token=tokenizer.eos_token)\n", + " return sample\n", + "\n", + "\n", + "# apply prompt template per sample\n", + "train_dataset = dataset[\"train\"].map(template_dataset, remove_columns=list(dataset[\"train\"].features))\n", + "\n", + "print(train_dataset[randint(0, len(dataset))][\"text\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "14571066-34fe-4fe1-97a9-697f1de79218", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-ae9ee88e80acf7ac.arrow\n" + ] + } + ], + "source": [ + "# apply prompt template per sample\n", + "test_dataset = dataset[\"test\"].map(template_dataset, remove_columns=list(dataset[\"test\"].features))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1c197761-eb0c-4712-a2e7-40c6a40eb74f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-d5ee9aed5e086afd.arrow\n", + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-6d6a396a4d20b7e3.arrow\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total number of train samples: 14732\n" + ] + } + ], + "source": [ + " # tokenize and chunk dataset\n", + "lm_train_dataset = train_dataset.map(\n", + " lambda sample: tokenizer(sample[\"text\"]), batched=True, batch_size=24, remove_columns=list(train_dataset.features)\n", + ")\n", + "\n", + "\n", + "lm_test_dataset = test_dataset.map(\n", + " lambda sample: tokenizer(sample[\"text\"]), batched=True, remove_columns=list(test_dataset.features)\n", + ")\n", + "\n", + "# Print total number of samples\n", + "print(f\"Total number of train samples: {len(lm_train_dataset)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "ade7f4fd", + "metadata": {}, + "source": [ + "Create a S3 bucket to log our metrics to TensorBoard." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a3864a9d-e17b-437d-bd68-52ee8e134b41", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "log_bucket = \"/project/lt200056-opgpth/teerapol/QLoRA_vs_LoRA/results\"" + ] + }, + { + "cell_type": "markdown", + "id": "a97f4fc7", + "metadata": {}, + "source": [ + "Use the Hugging Face Trainer class to fine-tune the model. Define the hyperparameters we want to use. We also create a DataCollator that will take care of padding our inputs and labels." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ca6e7c03-58b3-4057-afde-e8e2e249143d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import transformers\n", + "\n", + "# We set num_train_epochs=1 simply to run a demonstration\n", + "\n", + "trainer = transformers.Trainer(\n", + " model=model,\n", + " train_dataset=lm_train_dataset,\n", + " eval_dataset=lm_test_dataset,\n", + " args=transformers.TrainingArguments(\n", + " per_device_train_batch_size=4,\n", + " per_device_eval_batch_size=8,\n", + " logging_dir=log_bucket,\n", + " logging_steps=2,\n", + " num_train_epochs=1,\n", + " learning_rate=2e-4,\n", + " bf16=True,\n", + " save_strategy = \"no\",\n", + " output_dir=\"outputs\",\n", + " report_to=\"tensorboard\",\n", + " ),\n", + " data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),\n", + ")\n", + "model.config.use_cache = False # silence the warnings. Please re-enable for inference!" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "30ff79f6", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + }, + "scrolled": true, + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [3683/3683 59:01, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
21.744500
41.780700
61.780500
82.013700
101.753300
121.708300
141.825000
161.825300
181.888300
201.812100
221.661000
241.933600
261.758900
282.022800
301.710900
321.784900
341.715700
361.674500
381.841200
402.011000
421.648900
441.844600
461.689900
481.679400
501.748500
521.968100
541.877500
561.959300
581.718100
602.049100
621.751900
641.772400
661.726000
681.792600
701.881700
721.815300
741.637700
761.637000
781.763600
801.895400
821.686100
841.826300
861.932300
881.670100
901.942200
921.655200
941.701100
961.770200
981.684700
1001.705500
1022.040400
1041.818100
1061.724300
1081.830500
1101.705800
1121.899800
1141.922000
1161.939300
1181.703200
1201.904200
1221.772600
1241.875400
1261.735400
1281.719100
1301.848300
1321.750200
1342.085200
1361.704300
1382.008200
1401.763200
1421.917200
1441.835700
1461.703400
1481.772500
1501.598900
1521.723300
1541.612600
1561.631400
1581.747400
1601.640400
1621.803400
1641.746700
1661.959700
1681.965300
1701.842000
1721.780300
1741.751300
1761.683000
1781.900800
1801.696300
1821.616600
1841.749300
1861.707400
1881.678000
1901.814100
1921.797200
1941.665200
1961.819800
1981.819800
2001.600900
2021.901100
2042.010400
2061.733500
2081.668300
2101.605900
2121.803000
2141.814900
2161.644100
2181.874700
2201.677800
2221.832200
2241.579900
2261.758200
2281.498400
2301.774200
2321.721400
2341.848200
2361.926000
2381.704800
2401.640700
2421.725800
2441.662700
2461.906000
2481.685400
2501.704700
2521.716200
2541.858300
2561.711000
2581.780200
2601.725400
2621.791100
2642.071800
2661.641800
2681.983100
2701.872000
2722.162900
2741.708800
2761.828900
2781.777000
2801.970300
2821.673900
2841.994900
2861.739500
2881.855800
2901.869600
2921.631300
2941.623300
2961.834800
2981.500500
3001.914000
3021.658400
3041.940200
3061.724200
3081.899600
3101.797500
3121.751800
3141.758200
3161.785400
3181.725600
3201.879100
3221.786900
3241.580000
3261.652600
3281.687700
3301.833000
3321.830800
3341.818000
3361.862300
3381.648100
3401.691700
3421.720700
3441.740100
3461.703600
3481.748700
3501.707300
3521.654500
3541.895400
3561.699500
3582.014900
3601.581500
3621.692200
3641.919600
3661.798900
3681.932800
3701.760800
3721.926800
3741.888800
3761.672600
3781.685400
3801.742500
3821.857400
3841.734700
3861.728800
3881.813800
3902.064400
3921.884500
3941.923000
3961.780200
3981.708800
4001.679500
4021.610100
4041.790200
4061.652400
4081.800100
4101.466000
4121.720000
4141.837900
4161.687800
4181.890200
4201.739800
4221.889300
4241.890100
4261.900400
4282.112200
4301.832200
4321.884900
4341.731900
4361.710300
4381.803200
4401.879000
4421.761300
4441.632200
4461.895200
4481.826900
4501.848100
4521.437700
4541.625600
4562.017900
4581.810500
4601.789800
4621.689300
4641.939700
4661.994400
4681.764300
4701.819500
4721.800200
4741.498300
4762.016200
4781.849100
4801.843900
4821.664200
4841.722800
4861.747600
4881.886800
4901.641200
4921.590100
4941.762800
4961.833400
4981.964400
5001.802200
5021.827200
5041.783400
5061.674900
5081.874500
5101.971800
5121.553100
5141.659000
5161.949800
5181.808100
5201.917200
5221.845700
5241.819400
5261.841600
5281.685500
5301.628300
5321.982900
5341.707900
5361.893800
5381.760200
5401.853000
5421.626900
5441.760600
5462.065100
5481.754300
5501.984800
5521.796800
5541.921400
5561.743700
5581.623500
5601.880200
5621.746500
5641.785400
5661.620700
5681.752100
5701.769000
5721.649700
5741.967900
5761.800700
5781.764700
5801.622500
5821.819000
5841.644300
5861.817500
5881.504300
5901.871200
5921.719800
5941.972900
5961.837700
5981.849000
6001.685200
6021.899300
6041.938600
6061.662200
6081.722500
6101.806400
6121.806500
6141.708600
6161.810800
6181.756700
6201.631200
6221.706000
6241.763600
6261.756900
6281.665500
6301.614600
6321.750900
6341.921000
6361.800600
6381.836200
6401.606500
6421.685000
6441.851800
6461.818400
6481.926800
6501.672400
6521.815800
6541.648700
6561.862000
6581.759400
6601.511400
6621.630500
6641.657400
6661.839100
6681.833100
6702.191800
6721.986500
6741.743500
6761.752600
6781.706800
6801.851200
6821.796900
6841.784900
6861.525300
6881.638500
6901.763700
6921.639600
6941.673000
6961.695200
6981.882200
7001.502800
7022.073000
7041.821900
7061.827800
7081.705200
7101.627300
7121.639000
7141.752200
7161.606700
7181.517900
7201.626300
7221.718600
7241.738000
7261.749400
7281.775900
7301.785500
7321.785500
7341.558300
7361.930800
7381.877700
7401.891300
7421.539700
7441.620000
7461.909800
7482.098000
7501.612400
7521.720500
7541.748300
7561.769800
7581.931600
7601.872300
7621.743900
7641.782400
7661.771200
7681.784300
7701.548000
7721.870900
7741.675500
7761.753900
7781.894300
7801.758700
7821.740600
7841.649000
7861.780100
7881.924700
7901.756600
7921.770500
7941.670900
7961.705100
7981.604100
8001.723500
8021.595600
8041.756100
8061.705200
8081.697700
8101.605900
8121.777100
8141.909200
8161.619800
8181.851600
8201.709200
8221.873500
8241.967800
8261.850500
8281.877100
8301.754400
8321.708500
8341.821300
8361.588800
8381.862900
8401.842400
8421.747900
8441.754000
8461.726500
8481.650300
8501.866000
8521.931500
8541.696700
8561.732400
8582.022100
8601.882400
8621.706900
8641.651000
8661.554800
8681.827500
8701.767300
8721.783100
8741.918000
8761.518100
8781.760200
8802.068000
8821.907800
8841.913000
8861.648500
8881.743700
8901.861400
8921.701300
8941.868800
8962.051800
8981.577900
9001.706200
9021.658300
9041.746000
9061.872500
9081.822000
9101.759300
9121.737000
9141.652200
9161.948100
9181.696200
9201.879300
9221.576600
9241.723200
9261.744100
9281.818900
9301.760100
9321.866000
9341.444900
9361.848000
9381.764800
9401.585100
9421.825600
9441.838700
9461.474100
9481.608300
9501.646800
9521.759200
9541.626100
9561.669100
9581.614800
9601.707500
9621.808500
9641.716000
9661.650300
9681.600900
9701.767900
9721.758000
9741.662200
9761.650700
9781.730400
9801.834100
9821.633900
9841.948800
9861.960600
9881.730100
9901.771100
9921.565100
9941.797700
9961.695100
9981.801600
10001.686100
10021.678600
10041.714600
10061.710000
10081.427600
10101.685300
10121.753800
10141.748900
10161.979300
10181.736900
10201.502800
10221.736600
10241.630100
10261.794400
10281.717400
10301.888800
10321.709900
10341.767500
10361.694000
10381.793000
10401.726500
10421.842500
10441.820600
10461.840000
10481.866100
10501.721700
10521.870800
10541.528200
10561.726700
10581.721000
10601.873200
10621.753700
10641.767400
10661.785200
10681.760000
10701.842800
10721.805400
10741.686500
10761.803200
10781.901100
10801.797200
10821.753700
10841.797100
10861.802000
10881.922900
10901.629900
10921.634100
10941.599900
10961.984000
10981.890300
11001.579400
11021.693100
11041.931500
11061.662900
11081.629000
11101.814900
11121.664500
11141.654900
11161.755100
11181.766900
11201.807800
11221.821400
11241.910800
11261.636000
11281.515000
11301.839600
11321.597100
11341.650900
11361.745400
11382.051100
11401.727100
11421.771600
11441.650200
11461.817400
11481.593000
11501.681000
11521.543300
11541.902300
11561.664300
11581.772500
11601.902000
11622.086500
11641.743900
11661.710300
11681.955700
11701.703300
11721.862200
11741.731900
11761.665400
11781.670900
11801.820600
11821.937800
11841.816400
11861.943500
11881.860700
11901.909100
11921.792200
11941.924600
11961.648200
11981.631000
12001.542200
12021.952500
12041.741700
12061.744800
12081.625200
12101.854800
12121.762800
12141.826800
12161.704800
12181.679300
12201.738300
12221.750600
12241.761300
12262.041100
12281.699300
12301.813300
12321.961100
12341.744800
12361.717600
12381.709200
12401.579900
12421.732200
12441.682500
12461.619700
12481.566500
12501.638600
12521.612200
12541.734000
12561.764300
12581.972400
12601.665500
12621.772000
12641.861600
12661.952200
12681.594300
12701.734800
12721.757800
12741.887700
12761.525000
12781.822700
12801.653800
12821.698100
12841.845700
12861.586600
12881.871400
12901.593600
12921.747300
12941.973300
12961.957200
12981.698300
13001.672300
13021.917000
13041.764400
13061.767800
13081.665600
13101.725800
13121.707000
13141.843100
13161.654200
13181.664300
13201.874800
13221.710300
13241.864600
13261.650400
13281.625400
13301.713700
13321.724200
13341.872900
13361.848000
13381.703400
13401.765300
13421.698600
13441.765500
13461.492300
13481.800300
13502.128000
13521.677600
13541.756000
13561.762800
13581.848300
13601.794900
13621.708600
13641.841700
13661.918300
13681.961600
13701.626500
13721.699300
13741.604000
13761.832700
13781.973500
13801.828700
13821.646900
13841.720900
13861.796900
13882.107900
13901.849800
13921.870200
13941.901800
13961.625800
13981.878300
14001.608200
14021.780500
14041.788700
14061.770400
14081.912600
14101.611100
14121.604400
14141.895500
14161.788000
14181.900200
14201.675400
14221.720500
14241.762300
14262.010800
14282.084700
14301.733700
14321.699200
14341.743100
14361.722900
14381.707800
14401.693800
14421.901500
14441.879600
14461.974400
14481.691500
14501.860800
14521.639100
14541.912200
14561.762500
14581.860900
14601.828400
14621.515500
14641.894400
14661.558000
14681.611700
14701.670600
14721.617000
14741.743500
14761.734500
14781.806900
14801.851700
14821.719700
14841.701700
14861.896800
14881.643800
14901.798900
14921.864700
14941.478300
14961.906100
14981.821200
15001.780100
15021.836100
15041.645800
15061.871400
15081.621200
15101.747500
15121.843000
15141.670800
15161.644800
15181.720500
15201.753700
15221.788700
15241.947700
15261.781700
15281.720100
15301.732500
15321.588500
15341.885600
15361.646600
15381.541400
15401.820400
15421.969200
15442.054300
15461.638700
15481.697000
15501.704400
15521.725800
15541.687600
15561.778900
15581.673000
15601.669200
15621.656700
15641.799400
15661.820200
15681.507100
15701.748400
15721.838700
15741.995500
15761.789300
15781.902600
15801.897300
15821.992100
15841.861900
15861.578000
15881.719800
15901.575400
15921.787700
15941.655800
15961.577700
15981.734600
16001.795600
16021.703400
16041.932000
16061.710100
16081.848600
16101.804000
16121.812500
16141.728900
16161.700700
16181.749500
16201.869700
16221.763700
16241.659900
16261.907800
16281.824300
16301.728400
16321.769200
16341.801900
16362.109900
16381.563300
16401.798900
16421.636800
16441.675800
16461.740900
16481.725400
16501.681300
16521.747500
16541.778900
16561.722000
16581.700700
16601.722000
16621.690800
16641.723900
16661.729600
16681.740400
16701.795400
16721.866000
16741.642400
16761.916100
16781.792400
16801.661400
16821.829500
16841.720900
16861.643700
16881.804800
16901.658400
16921.790200
16941.766400
16961.969700
16981.614900
17001.638400
17021.749800
17041.710600
17061.983900
17082.041600
17101.735500
17121.820900
17141.939100
17161.986000
17181.965400
17201.832400
17221.651200
17241.912100
17261.808900
17281.736500
17302.030400
17321.730400
17341.634300
17361.835200
17381.552700
17401.734600
17421.960300
17442.014500
17461.887900
17481.711200
17501.761800
17521.759600
17541.709400
17561.765100
17581.620800
17601.701600
17621.722500
17641.719200
17661.912200
17681.801700
17701.784600
17721.635600
17741.261900
17761.564700
17781.789900
17801.742800
17821.566600
17841.581000
17861.542700
17881.832100
17901.641600
17921.752600
17941.739300
17961.647600
17981.757500
18001.843700
18021.532800
18041.579600
18061.723100
18081.647500
18101.500900
18121.776400
18142.053000
18161.515400
18181.600900
18201.588700
18221.635000
18241.522700
18261.808800
18281.728400
18301.814500
18321.887900
18341.656300
18361.986900
18381.884200
18401.789400
18421.902900
18441.720900
18461.708400
18481.824700
18501.635000
18521.773000
18541.658400
18562.056000
18581.998400
18601.733800
18621.592700
18641.979100
18661.720100
18681.735300
18701.837800
18721.837900
18741.946000
18761.686100
18781.743800
18801.571300
18821.518400
18841.665000
18861.652200
18881.792100
18901.895500
18921.687700
18941.793700
18962.022800
18981.768800
19001.625300
19021.804000
19041.788700
19061.603500
19081.656300
19101.656800
19121.821600
19141.923900
19161.616000
19181.735800
19201.743800
19221.724700
19241.717800
19261.907600
19281.842700
19301.930800
19321.857500
19341.559100
19361.678700
19381.854000
19401.720700
19421.998700
19441.960400
19461.726300
19481.944400
19501.603100
19521.681300
19541.615700
19561.672600
19581.816800
19601.547600
19621.779200
19641.595000
19661.694000
19681.624900
19701.651000
19722.155600
19741.630000
19761.868800
19781.712600
19801.778200
19821.615700
19841.720700
19861.699100
19881.651000
19901.696400
19921.742100
19941.569400
19961.898400
19981.638000
20001.991100
20021.666600
20041.892100
20061.935700
20081.510200
20101.851300
20121.911300
20141.677100
20162.114100
20181.831500
20201.819300
20221.625600
20241.912000
20261.708500
20281.903700
20301.724200
20321.874100
20341.656400
20361.748300
20381.627100
20401.908400
20421.729500
20441.741000
20461.710200
20481.646500
20501.730200
20521.980400
20541.562700
20561.769700
20581.669200
20601.778100
20621.805200
20641.948100
20661.880800
20681.573300
20701.725900
20721.594300
20741.382800
20761.624400
20781.904500
20801.746600
20821.729000
20841.646400
20861.704800
20881.778400
20901.850000
20921.666700
20941.598000
20961.901100
20981.533000
21001.973500
21021.777000
21041.736300
21061.592400
21081.859900
21101.570800
21121.642500
21141.663800
21161.633100
21181.704000
21201.778200
21221.923000
21241.476700
21261.976900
21281.712500
21301.795700
21321.681600
21341.806400
21361.896200
21381.739600
21401.818800
21421.955900
21441.826000
21461.574400
21481.615100
21501.718700
21521.667100
21541.636500
21561.739900
21581.818800
21601.499100
21621.699600
21641.606200
21661.827600
21681.765000
21701.611500
21721.929100
21741.562900
21761.856200
21781.653100
21801.495700
21821.713000
21841.677800
21861.768300
21881.700300
21901.777900
21921.673500
21941.679100
21961.953000
21981.795300
22001.938100
22021.490100
22041.913200
22061.735000
22081.854000
22101.736300
22121.584700
22141.740300
22161.670400
22181.880000
22201.858800
22221.714500
22241.470800
22261.728400
22281.716400
22301.826300
22321.773700
22341.800900
22361.904500
22381.575000
22401.825500
22421.632500
22441.757400
22461.757600
22481.783800
22501.521800
22521.567100
22541.658800
22561.687200
22581.797300
22601.800300
22621.525900
22641.692700
22661.741000
22681.843400
22701.579500
22721.684100
22741.615700
22761.761900
22781.735100
22801.782700
22821.576000
22841.930800
22861.599700
22882.067700
22901.577700
22921.795700
22941.696200
22961.662300
22981.660100
23001.440600
23021.605600
23041.786500
23061.896300
23081.948100
23101.645500
23121.785400
23141.759700
23161.831600
23181.728800
23201.693300
23221.917500
23241.899200
23261.593300
23281.652900
23302.010600
23321.611700
23341.691300
23361.780100
23381.796100
23401.688100
23421.810100
23441.978400
23461.711200
23481.853700
23501.750800
23521.900100
23541.813400
23561.848300
23581.651900
23601.553000
23621.796600
23641.662400
23661.698600
23681.750100
23701.697800
23721.790200
23741.617200
23761.772800
23781.774700
23801.817500
23821.587700
23841.895400
23861.622000
23881.820400
23902.098600
23921.787000
23941.726100
23961.660700
23981.596500
24001.683000
24021.941900
24041.904800
24061.786200
24081.815700
24101.826800
24121.773500
24141.668700
24161.820400
24181.723100
24201.805400
24221.903100
24241.887000
24262.000200
24281.697200
24301.693600
24321.704000
24341.883900
24361.637600
24381.738300
24401.570500
24421.605100
24441.555900
24461.689700
24481.743700
24501.810000
24521.815400
24541.617900
24561.742700
24581.668800
24601.787300
24621.877800
24641.669400
24662.097400
24681.599400
24701.661500
24721.953400
24741.751700
24761.774000
24782.171800
24801.590100
24821.913200
24841.753100
24861.695500
24881.619000
24901.941400
24921.576500
24941.889900
24961.664200
24981.826600
25001.930100
25021.818600
25041.614000
25061.968200
25081.875500
25101.704000
25121.974400
25141.578600
25161.570500
25181.923500
25201.579700
25221.557500
25241.680000
25261.852000
25281.708500
25301.928300
25321.731100
25341.668600
25361.620600
25381.783700
25401.552700
25421.807200
25441.828200
25461.784600
25481.948800
25501.727300
25521.884700
25541.884900
25561.723100
25581.651200
25601.595300
25621.803100
25641.773700
25661.665800
25681.693700
25701.890700
25721.708900
25741.593900
25761.958200
25781.705100
25801.755000
25822.076800
25841.753000
25861.690100
25881.910300
25901.636500
25921.812500
25941.612100
25961.762800
25981.671200
26001.794700
26021.629600
26041.852900
26061.685900
26081.783600
26101.618300
26121.806900
26141.616300
26161.772000
26181.685200
26201.681500
26221.492800
26241.791900
26261.978100
26281.646900
26301.604700
26321.930900
26341.640200
26361.684000
26381.772400
26401.861300
26421.952700
26441.760700
26461.761800
26481.806000
26501.659900
26521.830400
26541.847200
26561.710800
26581.727100
26601.621800
26621.869400
26641.831800
26661.623300
26681.826600
26701.756600
26721.763900
26741.604000
26761.587000
26781.884700
26801.545700
26821.721300
26841.856600
26861.872900
26881.839000
26901.919700
26921.631000
26941.700800
26961.653900
26981.432000
27001.617200
27021.530000
27041.727000
27061.730600
27081.710900
27101.703100
27121.694100
27141.501500
27161.725700
27181.667900
27201.831200
27221.719000
27241.694100
27261.577300
27281.716500
27301.670700
27321.502700
27341.795700
27361.584700
27381.654800
27401.784700
27421.462700
27441.543200
27461.678700
27481.578000
27501.561600
27521.585100
27541.655300
27561.796700
27581.758200
27601.813400
27621.706700
27641.658600
27661.738000
27681.593000
27701.595900
27721.668100
27741.669400
27761.571500
27781.984500
27801.724200
27821.550700
27841.815900
27861.680800
27881.760100
27901.728900
27921.704000
27941.753700
27961.555400
27981.860900
28001.703400
28021.849000
28041.878700
28061.792400
28081.808100
28101.702400
28121.871300
28141.702600
28161.726300
28181.597400
28201.806100
28221.781900
28241.700800
28261.752500
28281.788700
28301.566700
28321.481900
28341.602500
28361.881500
28381.634900
28401.759000
28421.714600
28441.804600
28461.838600
28481.794000
28501.755900
28521.840200
28541.526600
28561.745300
28581.708800
28601.684800
28621.551300
28641.783500
28661.685500
28681.751600
28701.769000
28721.828100
28741.858800
28761.726300
28781.669600
28801.529700
28821.661100
28841.526800
28861.648200
28881.768800
28901.742100
28921.750900
28941.857800
28961.846500
28981.508300
29001.837000
29021.660100
29041.595700
29061.736100
29081.713500
29101.556400
29121.691700
29141.620200
29161.649100
29181.763100
29201.733500
29221.605500
29241.638300
29261.728400
29281.764600
29301.980800
29321.681500
29341.807800
29361.782800
29381.585000
29401.654900
29421.587800
29441.956000
29461.608100
29481.697300
29501.728400
29521.746300
29541.816300
29561.576900
29581.518000
29601.667700
29621.420900
29641.564900
29661.670600
29681.822500
29701.965200
29721.731900
29741.473800
29761.661900
29781.781300
29801.985600
29821.656100
29841.787500
29861.715000
29882.027800
29901.717500
29921.650300
29941.511600
29961.846600
29981.636900
30001.619500
30021.522500
30041.641700
30061.790700
30081.750600
30101.945600
30121.720100
30141.905100
30161.892700
30181.595800
30201.690800
30221.578500
30241.520400
30261.758700
30281.623900
30301.711900
30321.812700
30341.507900
30361.697300
30381.637700
30401.668000
30421.617600
30441.658900
30461.570500
30481.594500
30501.818300
30521.657500
30541.662100
30561.907900
30581.954100
30601.816000
30621.886700
30641.841500
30661.763300
30681.639700
30701.435500
30721.436500
30741.823300
30762.030500
30781.575300
30801.923500
30821.737700
30841.481700
30861.737900
30881.568500
30901.662100
30921.805200
30941.713900
30961.728700
30981.633700
31001.755600
31021.561300
31041.680400
31061.853700
31081.771200
31101.478000
31121.659000
31141.624300
31161.689400
31181.921100
31201.803400
31221.836100
31242.018800
31261.599400
31281.530400
31301.796200
31321.633800
31341.661200
31361.740000
31381.865500
31401.544100
31421.880700
31441.730700
31461.561500
31481.689100
31501.836800
31521.665300
31541.698200
31561.606400
31581.606000
31601.949500
31621.737100
31641.766600
31661.757800
31681.745800
31701.997000
31721.700100
31741.942000
31761.742400
31781.637900
31801.798100
31821.685000
31841.695400
31861.752300
31881.482300
31901.477000
31921.589500
31941.976000
31961.650300
31981.900600
32001.571500
32021.750900
32041.781400
32061.787900
32081.681200
32101.702200
32121.824800
32141.895200
32161.718200
32181.959700
32201.765500
32221.905800
32241.689600
32261.748900
32281.717900
32301.715200
32321.470300
32341.767500
32361.786800
32381.795200
32401.685700
32421.916200
32441.828600
32461.850700
32481.627900
32501.704500
32521.556200
32541.968000
32561.902600
32581.540900
32601.562800
32621.829300
32641.829000
32661.547100
32681.725200
32701.834500
32721.852900
32741.725100
32761.888000
32781.720900
32801.741000
32821.755900
32841.769200
32861.890600
32881.634600
32901.727300
32921.981700
32941.607900
32961.575700
32981.479100
33001.853000
33021.786200
33041.581600
33061.621300
33081.846200
33101.546600
33121.758200
33141.797800
33161.718300
33181.556700
33201.687100
33221.711100
33241.630300
33261.695700
33281.621900
33301.893600
33321.465800
33341.678300
33361.819500
33382.053200
33401.672200
33421.757100
33441.948700
33461.501800
33481.824900
33501.870600
33521.539400
33541.628400
33561.416700
33581.966900
33601.583400
33621.964300
33641.753800
33661.505700
33681.678300
33701.704600
33721.519500
33741.672400
33761.658300
33781.590500
33801.513000
33821.701900
33841.504500
33861.794700
33881.655800
33901.706100
33921.678700
33941.412000
33961.673700
33981.959000
34001.946600
34021.857600
34041.707700
34061.679700
34081.499900
34101.616800
34121.609800
34141.882500
34161.795500
34181.629100
34201.984100
34221.591100
34241.621000
34261.751900
34281.896800
34301.632900
34321.638900
34341.707700
34361.685300
34381.639700
34401.563100
34421.720900
34441.703800
34461.827100
34481.803200
34501.843000
34521.683800
34542.029100
34562.200200
34581.851800
34601.807400
34621.946200
34641.716200
34661.502500
34681.673900
34701.671500
34721.651700
34741.970600
34761.660500
34782.127300
34801.622900
34821.848300
34841.795200
34861.805800
34881.785300
34901.837200
34921.791100
34941.878900
34961.857700
34981.405000
35001.579900
35021.671300
35041.775400
35061.926300
35081.956200
35101.780300
35121.841900
35141.566500
35161.740500
35181.816000
35201.765100
35221.666900
35241.637900
35261.777500
35281.719600
35301.791400
35321.756000
35341.777600
35361.664900
35381.658000
35401.713100
35421.646100
35441.763800
35461.617900
35481.623100
35501.976900
35521.656600
35541.847700
35561.848400
35581.619900
35601.731500
35621.745300
35641.897500
35661.883300
35681.576600
35701.750600
35721.547300
35741.748000
35761.820000
35781.885800
35801.574100
35821.804300
35841.888000
35861.657900
35881.775800
35901.660000
35921.784900
35941.827600
35961.805700
35981.802800
36001.639100
36021.586200
36041.678900
36062.011000
36081.763400
36101.731900
36121.517600
36141.762600
36161.768100
36181.780000
36201.614000
36221.597700
36241.619100
36261.655400
36281.846100
36301.791800
36321.808000
36341.802100
36361.788400
36381.928200
36401.846100
36421.754200
36441.644000
36461.620400
36481.561200
36501.716900
36521.565400
36541.650300
36561.568100
36581.552500
36601.703800
36621.671700
36641.735600
36661.581700
36681.503100
36701.668600
36721.510900
36741.765000
36761.765500
36781.892400
36801.647200
36822.062200

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 49min 21s, sys: 2.94 s, total: 49min 24s\n", + "Wall time: 59min 3s\n" + ] + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=3683, training_loss=1.7498929358810438, metrics={'train_runtime': 3542.9465, 'train_samples_per_second': 4.158, 'train_steps_per_second': 1.04, 'total_flos': 9.935770252348416e+16, 'train_loss': 1.7498929358810438, 'epoch': 1.0})" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "# Start training\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b12267be-fbfe-4aeb-bb11-3454d9a70416", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [103/103 00:50]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'eval_loss': 1.7595417499542236,\n", + " 'eval_runtime': 50.7983,\n", + " 'eval_samples_per_second': 16.123,\n", + " 'eval_steps_per_second': 2.028,\n", + " 'epoch': 1.0}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#evaluate and return the metrics\n", + "trainer.evaluate()" + ] + }, + { + "cell_type": "markdown", + "id": "9351292f", + "metadata": {}, + "source": [ + "Load a test dataset and try a random sample for summarization." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "2f220ba3-f782-4a86-a349-ed8d8cda405e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Found cached dataset samsum (/home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summarize the chat dialogue:\n", + "Richie: Pogba\n", + "Clay: Pogboom\n", + "Richie: what a s strike yoh!\n", + "Clay: was off the seat the moment he chopped the ball back to his right foot\n", + "Richie: me too dude\n", + "Clay: hope his form lasts\n", + "Richie: This season he's more mature\n", + "Clay: Yeah, Jose has his trust in him\n", + "Richie: everyone does\n", + "Clay: yeah, he really deserved to score after his first 60 minutes\n", + "Richie: reward\n", + "Clay: yeah man\n", + "Richie: cool then \n", + "Clay: cool\n", + "---\n", + "Summary:\n", + "\n" + ] + } + ], + "source": [ + "# Load dataset from the hub\n", + "test_dataset = load_dataset(\"samsum\", split=\"test\")\n", + "\n", + "# select a random test sample\n", + "sample = test_dataset[randint(0, len(test_dataset))]\n", + "\n", + "# format sample\n", + "prompt_template = f\"Summarize the chat dialogue:\\n{{dialogue}}\\n---\\nSummary:\\n\"\n", + "\n", + "test_sample = prompt_template.format(dialogue=sample[\"dialogue\"])\n", + "\n", + "print(test_sample)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "413c44ae-35b3-47fa-b3b4-9eaeafec9da6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "input_ids = tokenizer(test_sample, return_tensors=\"pt\").input_ids" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "1af86337-48b6-4165-a105-d4650eb07762", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/tsaengsu/.local/lib/python3.9/site-packages/transformers/generation/utils.py:1264: UserWarning: You have modified the pretrained model configuration to control generation. This is a deprecated strategy to control generation and will be removed soon, in a future version. Please use a generation configuration file (see https://huggingface.co/docs/transformers/main_classes/text_generation )\n", + " warnings.warn(\n", + "The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.\n", + "Setting `pad_token_id` to `eos_token_id`:11 for open-end generation.\n", + "/home/tsaengsu/.local/lib/python3.9/site-packages/transformers/generation/utils.py:1457: UserWarning: You are calling .generate() with the `input_ids` being on a device type different than your model's device. `input_ids` is on cpu, whereas the model is on cuda. You may experience unexpected behaviors or slower generation. Please make sure that you have put `input_ids` to the correct device by calling for example input_ids = input_ids.to('cuda') before running `.generate()`.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Summarize the chat dialogue:\n", + "Richie: Pogba\n", + "Clay: Pogboom\n", + "Richie: what a s strike yoh!\n", + "Clay: was off the seat the moment he chopped the ball back to his right foot\n", + "Richie: me too dude\n", + "Clay: hope his form lasts\n", + "Richie: This season he's more mature\n", + "Clay: Yeah, Jose has his trust in him\n", + "Richie: everyone does\n", + "Clay: yeah, he really deserved to score after his first 60 minutes\n", + "Richie: reward\n", + "Clay: yeah man\n", + "Richie: cool then \n", + "Clay: cool\n", + "---\n", + "Summary:\n", + "Clay and Richie both find Pogba's strike for Manchester United cool. Pogba's behaviour on the field is really great. They\n" + ] + } + ], + "source": [ + "#set the tokens for the summary evaluation\n", + "tokens_for_summary = 30\n", + "output_tokens = input_ids.shape[1] + tokens_for_summary\n", + "\n", + "outputs = model.generate(inputs=input_ids, do_sample=True, max_length=output_tokens)\n", + "gen_text = tokenizer.batch_decode(outputs)[0]\n", + "print(gen_text)" + ] + } + ], + "metadata": { + "availableInstances": [ + { + "_defaultOrder": 0, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.t3.medium", + "vcpuNum": 2 + }, + { + "_defaultOrder": 1, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.t3.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 2, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.t3.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 3, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.t3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 4, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 5, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 6, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 7, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 8, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 9, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 10, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 11, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 12, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5d.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 13, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5d.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 14, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5d.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 15, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5d.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 16, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5d.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 17, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5d.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 18, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5d.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 19, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 20, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": true, + "memoryGiB": 0, + "name": "ml.geospatial.interactive", + "supportedImageNames": [ + "sagemaker-geospatial-v1-0" + ], + "vcpuNum": 0 + }, + { + "_defaultOrder": 21, + "_isFastLaunch": true, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.c5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 22, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.c5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 23, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.c5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 24, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.c5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 25, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 72, + "name": "ml.c5.9xlarge", + "vcpuNum": 36 + }, + { + "_defaultOrder": 26, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 96, + "name": "ml.c5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 27, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 144, + "name": "ml.c5.18xlarge", + "vcpuNum": 72 + }, + { + "_defaultOrder": 28, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.c5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 29, + "_isFastLaunch": true, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g4dn.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 30, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g4dn.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 31, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g4dn.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 32, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g4dn.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 33, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g4dn.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 34, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g4dn.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 35, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 61, + "name": "ml.p3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 36, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 244, + "name": "ml.p3.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 37, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 488, + "name": "ml.p3.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 38, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.p3dn.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 39, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.r5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 40, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.r5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 41, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.r5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 42, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.r5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 43, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.r5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 44, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.r5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 45, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.r5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 46, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.r5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 47, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 48, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 49, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 50, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 51, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 52, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 53, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.g5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 54, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.g5.48xlarge", + "vcpuNum": 192 + }, + { + "_defaultOrder": 55, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.g5.12xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 56, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.g5.12xlarge", + "vcpuNum": 96 + } + ], + "instance_type": "ml.g5.12xlarge", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-qlora-finetune-summarize.ipynb b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-qlora-finetune-summarize.ipynb new file mode 100644 index 0000000..80f66c8 --- /dev/null +++ b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/Final_falcon-7b-qlora-finetune-summarize.ipynb @@ -0,0 +1,8793 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "36a2f3b4", + "metadata": {}, + "source": [ + "# Fine-tune Falcon-40B with QLoRA" + ] + }, + { + "cell_type": "markdown", + "id": "639d3904", + "metadata": {}, + "source": [ + "--- \n", + "\n", + "In this demo notebook, we demonstrate how to fine-tune the Falcon-40B model using QLoRA, Hugging Face PEFT, and bitsandbytes. \n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "2ec1c5bb", + "metadata": {}, + "source": [ + "This notebook was tested in Amazon SageMaker Studio with Python 3 (Data Science 3.0) kernel with a ml.g5.12xlarge instance." + ] + }, + { + "cell_type": "markdown", + "id": "8df4c2bc", + "metadata": {}, + "source": [ + "Install the required libriaries, including the Hugging Face libraries, and restart the kernel." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "153d07ab-3e43-45b1-89fd-140352b1d6ce", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%pip install -q -U torch==2.0.1 bitsandbytes==0.39.1\n", + "%pip install -q -U datasets py7zr einops tensorboardX\n", + "%pip install -q -U git+https://github.com/huggingface/transformers.git@850cf4af0ce281d2c3e7ebfc12e0bc24a9c40714\n", + "%pip install -q -U git+https://github.com/huggingface/peft.git@e2b8e3260d3eeb736edf21a2424e89fe3ecf429d\n", + "%pip install -q -U git+https://github.com/huggingface/accelerate.git@b76409ba05e6fa7dfc59d50eee1734672126fdba" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "0d6fc2fd-d42e-497e-8cb2-634ac267484a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Collecting py7zr\n", + " Downloading py7zr-0.20.5-py3-none-any.whl (66 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.4/66.4 kB\u001b[0m \u001b[31m864.2 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m31m1.5 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting texttable (from py7zr)\n", + " Downloading texttable-1.6.7-py2.py3-none-any.whl (10 kB)\n", + "Collecting pycryptodomex>=3.6.6 (from py7zr)\n", + " Downloading pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m6.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mm eta \u001b[36m0:00:01\u001b[0m0:01\u001b[0m:01\u001b[0m\n", + "\u001b[?25hCollecting pyzstd>=0.14.4 (from py7zr)\n", + " Downloading pyzstd-0.15.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (412 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m412.3/412.3 kB\u001b[0m \u001b[31m9.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0mm eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting pyppmd<1.1.0,>=0.18.1 (from py7zr)\n", + " Downloading pyppmd-1.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (138 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.7/138.7 kB\u001b[0m \u001b[31m2.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m1m291.6 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting pybcj>=0.6.0 (from py7zr)\n", + " Downloading pybcj-1.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.6/49.6 kB\u001b[0m \u001b[31m970.7 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting multivolumefile>=0.2.3 (from py7zr)\n", + " Downloading multivolumefile-0.2.3-py3-none-any.whl (17 kB)\n", + "Collecting brotli>=1.0.9 (from py7zr)\n", + " Downloading Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl (357 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m357.2/357.2 kB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m[36m0:00:01\u001b[0m\n", + "\u001b[?25hCollecting inflate64>=0.3.1 (from py7zr)\n", + " Downloading inflate64-0.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (92 kB)\n", + "\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m93.0/93.0 kB\u001b[0m \u001b[31m1.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m0m eta \u001b[36m0:00:01\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: psutil in /lustrefs/disk/home/tsaengsu/.local/lib/python3.9/site-packages (from py7zr) (5.9.5)\n", + "Installing collected packages: texttable, brotli, pyzstd, pyppmd, pycryptodomex, pybcj, multivolumefile, inflate64, py7zr\n", + "Successfully installed brotli-1.0.9 inflate64-0.3.1 multivolumefile-0.2.3 py7zr-0.20.5 pybcj-1.0.1 pycryptodomex-3.18.0 pyppmd-1.0.0 pyzstd-0.15.9 texttable-1.6.7\n" + ] + } + ], + "source": [ + "!pip install py7zr" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f5185bb8-3c83-483c-a145-dd4c0b9941f2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Add installed cuda runtime to path for bitsandbytes \n", + "import os\n", + "import nvidia\n", + "\n", + "cuda_install_dir = '/'.join(nvidia.__file__.split('/')[:-1]) + '/cuda_runtime/lib/'\n", + "os.environ['LD_LIBRARY_PATH'] = cuda_install_dir" + ] + }, + { + "cell_type": "markdown", + "id": "70b26c91", + "metadata": {}, + "source": [ + "\n", + "\n", + "To train our model, we need to convert our inputs (text) to token IDs. This is done by a Hugging Face Transformers Tokenizer. In addition to QLoRA, we will use bitsanbytes 4-bit precision to quantize out frozen LLM to 4-bit and attach LoRA adapters on it.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "85946e42-9f8a-488c-8b90-8afedf311b02", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "===================================BUG REPORT===================================\n", + "Welcome to bitsandbytes. For bug reports, please run\n", + "\n", + "python -m bitsandbytes\n", + "\n", + " and submit this information together with your error trace to: https://github.com/TimDettmers/bitsandbytes/issues\n", + "================================================================================\n", + "bin /home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/libbitsandbytes_cuda118.so\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/cuda_setup/main.py:149: UserWarning: Found duplicate ['libcudart.so', 'libcudart.so.11.0', 'libcudart.so.12.0'] files: {PosixPath('/home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so.11.0'), PosixPath('/home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so')}.. We'll flip a coin and try one of these, in order to fail forward.\n", + "Either way, this might cause trouble in the future:\n", + "If you get `CUDA error: invalid device function` errors, the above might be the cause and the solution is to make sure only one ['libcudart.so', 'libcudart.so.11.0', 'libcudart.so.12.0'] in the paths that we search based on your env.\n", + " warn(msg)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CUDA SETUP: CUDA runtime path found: /home/tsaengsu/.conda/envs/lora-mpt-2/lib/libcudart.so.11.0\n", + "CUDA SETUP: Highest compute capability among GPUs detected: 8.0\n", + "CUDA SETUP: Detected CUDA version 118\n", + "CUDA SETUP: Loading binary /home/tsaengsu/.local/lib/python3.9/site-packages/bitsandbytes/libbitsandbytes_cuda118.so...\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4974631b505048cab178084dc4668480", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/2 [00:00\n" + ] + } + ], + "source": [ + "from random import randint\n", + "\n", + "# custom instruct prompt start\n", + "prompt_template = f\"Summarize the chat dialogue:\\n{{dialogue}}\\n---\\nSummary:\\n{{summary}}{{eos_token}}\"\n", + "\n", + "# template dataset to add prompt to each sample\n", + "def template_dataset(sample):\n", + " sample[\"text\"] = prompt_template.format(dialogue=sample[\"dialogue\"],\n", + " summary=sample[\"summary\"],\n", + " eos_token=tokenizer.eos_token)\n", + " return sample\n", + "\n", + "\n", + "# apply prompt template per sample\n", + "train_dataset = dataset[\"train\"].map(template_dataset, remove_columns=list(dataset[\"train\"].features))\n", + "\n", + "print(train_dataset[randint(0, len(dataset))][\"text\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "14571066-34fe-4fe1-97a9-697f1de79218", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-ae9ee88e80acf7ac.arrow\n" + ] + } + ], + "source": [ + "# apply prompt template per sample\n", + "test_dataset = dataset[\"test\"].map(template_dataset, remove_columns=list(dataset[\"test\"].features))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1c197761-eb0c-4712-a2e7-40c6a40eb74f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-d5ee9aed5e086afd.arrow\n", + "Loading cached processed dataset at /home/tsaengsu/.cache/huggingface/datasets/samsum/samsum/0.0.0/f1d7c6b7353e6de335d444e424dc002ef70d1277109031327bc9cc6af5d3d46e/cache-6d6a396a4d20b7e3.arrow\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total number of train samples: 14732\n" + ] + } + ], + "source": [ + " # tokenize and chunk dataset\n", + "lm_train_dataset = train_dataset.map(\n", + " lambda sample: tokenizer(sample[\"text\"]), batched=True, batch_size=24, remove_columns=list(train_dataset.features)\n", + ")\n", + "\n", + "\n", + "lm_test_dataset = test_dataset.map(\n", + " lambda sample: tokenizer(sample[\"text\"]), batched=True, remove_columns=list(test_dataset.features)\n", + ")\n", + "\n", + "# Print total number of samples\n", + "print(f\"Total number of train samples: {len(lm_train_dataset)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "ade7f4fd", + "metadata": {}, + "source": [ + "Create a S3 bucket to log our metrics to TensorBoard." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a3864a9d-e17b-437d-bd68-52ee8e134b41", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "log_bucket = \"/project/lt200056-opgpth/teerapol/QLoRA_vs_LoRA/results-qlora-8btachsize\"" + ] + }, + { + "cell_type": "markdown", + "id": "a97f4fc7", + "metadata": {}, + "source": [ + "Use the Hugging Face Trainer class to fine-tune the model. Define the hyperparameters we want to use. We also create a DataCollator that will take care of padding our inputs and labels." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ca6e7c03-58b3-4057-afde-e8e2e249143d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import transformers\n", + "\n", + "# We set num_train_epochs=1 simply to run a demonstration\n", + "\n", + "trainer = transformers.Trainer(\n", + " model=model,\n", + " train_dataset=lm_train_dataset,\n", + " eval_dataset=lm_test_dataset,\n", + " args=transformers.TrainingArguments(\n", + " per_device_train_batch_size=8,\n", + " per_device_eval_batch_size=8,\n", + " logging_dir=log_bucket,\n", + " logging_steps=2,\n", + " num_train_epochs=1,\n", + " learning_rate=2e-4,\n", + " bf16=True,\n", + " save_strategy = \"no\",\n", + " output_dir=\"outputs-qlora-8batch\",\n", + " report_to=\"tensorboard\",\n", + " optim=\"paged_adamw_8bit\"\n", + " ),\n", + " data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),\n", + ")\n", + "model.config.use_cache = False # silence the warnings. Please re-enable for inference!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "16dccd50", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "You're using a PreTrainedTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [1842/1842 55:10, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
22.404700
42.151100
62.019000
81.962900
101.935400
121.934100
141.811800
161.727000
181.927000
201.839900
221.990500
241.920500
261.794300
281.826400
301.750600
321.837600
341.822100
361.868100
381.847300
401.946800
421.784300
441.846100
461.820600
481.730200
501.832400
521.889800
541.775400
562.037700
581.680600
601.627700
621.829500
641.936400
661.932100
681.952000
701.768700
721.613900
741.844100
761.856100
781.819700
802.057800
821.750900
842.016900
861.854300
881.856400
901.986200
921.675600
941.870500
961.940800
981.875500
1001.800800
1021.857800
1041.905400
1061.790600
1081.916000
1101.880400
1122.142100
1141.817300
1161.902000
1181.919600
1201.851300
1221.803000
1241.836100
1261.871200
1282.029800
1301.781500
1321.953900
1341.893000
1361.813200
1381.897500
1401.939400
1421.878700
1442.011800
1461.889900
1481.829800
1501.938600
1521.889200
1541.827500
1561.796200
1581.777700
1601.680400
1621.891300
1641.923000
1662.025000
1682.004600
1701.902000
1721.949800
1741.832400
1761.830600
1782.021800
1801.950600
1821.808800
1841.977400
1861.926000
1881.778900
1901.855200
1921.747800
1941.756700
1961.839100
1982.003900
2002.004000
2021.831900
2041.731800
2061.916000
2081.940900
2102.038000
2121.930300
2141.966700
2161.860900
2181.895500
2202.012200
2221.786700
2241.823600
2261.851300
2281.751700
2301.868900
2321.855000
2341.835400
2361.971700
2381.840600
2402.042600
2422.027700
2442.025000
2461.911500
2481.922100
2501.954800
2521.940800
2541.857300
2561.941200
2582.029900
2601.896000
2622.033900
2642.206400
2662.032200
2682.156400
2701.887000
2722.004600
2741.827200
2762.091300
2781.789000
2801.955100
2821.959900
2841.931900
2861.840300
2881.976900
2901.895100
2921.831200
2941.757600
2961.958100
2981.973000
3001.815600
3021.950600
3041.927600
3061.908600
3081.950300
3102.070300
3122.079200
3142.020700
3162.088500
3182.018200
3202.050000
3221.976100
3241.723300
3261.940500
3282.045500
3301.802600
3322.269200
3341.984900
3361.968600
3381.920900
3401.956400
3422.015500
3441.879100
3462.188600
3482.028600
3502.116600
3522.052400
3542.020100
3561.911400
3581.923200
3601.967500
3622.116800
3641.800000
3661.952100
3682.039300
3701.927100
3722.056200
3742.157800
3761.935800
3781.853000
3802.117500
3822.091700
3842.208800
3861.957300
3881.902700
3902.185700
3921.929900
3942.123800
3961.982800
3982.009600
4002.083500
4022.098600
4042.059600
4062.321100
4082.046000
4102.018700
4121.942700
4142.077700
4161.934100
4181.928500
4201.992000
4221.963000
4242.032000
4262.121900
4282.003900
4302.168300
4322.036400
4342.049100
4361.929300
4382.080600
4402.131800
4422.159700
4442.181200
4462.050000
4481.974300
4502.028700
4522.025700
4541.940500
4561.918100
4582.045000
4602.009400
4622.275500
4642.008300
4662.209100
4682.060800
4702.145700
4721.955200
4742.044600
4762.142200
4781.898600
4802.062100
4821.877500
4841.897400
4862.330000
4882.337000
4901.988200
4922.127000
4941.879500
4962.137200
4981.897700
5002.098300
5021.886400
5042.116600
5062.054400
5081.976400
5102.063900
5121.808400
5141.969800
5162.197000
5182.101200
5202.020100
5222.216200
5241.994000
5262.044000
5282.053800
5302.022700
5322.031900
5341.838800
5362.211200
5382.037500
5402.083800
5421.911300
5442.118700
5462.085700
5481.986700
5502.101800
5521.902100
5542.032200
5562.068100
5582.233300
5602.050300
5622.042900
5642.018000
5661.957700
5682.062700
5702.104400
5722.182600
5741.844800
5761.848000
5781.957600
5802.046800
5822.115300
5841.969400
5862.049600
5881.973800
5902.075700
5921.991500
5942.066700
5961.960900
5982.038800
6001.878100
6022.117300
6042.120900
6062.147000
6082.170600
6102.178700
6122.247400
6142.035300
6162.018300
6182.099900
6201.995900
6222.097200
6241.982800
6262.150300
6282.040800
6302.195900
6321.995800
6342.068400
6362.133200
6382.121100
6402.119000
6421.974000
6442.269100
6462.000000
6481.915000
6502.050100
6522.215100
6542.128600
6562.100700
6582.035900
6601.960200
6622.052400
6641.867800
6662.091000
6681.926500
6702.014500
6722.025100
6742.251100
6762.055200
6782.208700
6802.053400
6822.186500
6841.942700
6862.257400
6882.223800
6901.986200
6921.952100
6942.367000
6962.000000
6982.156400
7002.113100
7021.893700
7041.999100
7062.008400
7081.995800
7102.052400
7122.118300
7141.962800
7162.140900
7182.068600
7201.990900
7222.041200
7242.027700
7261.995400
7282.003100
7302.119200
7322.003600
7342.069200
7362.181200
7382.122500
7402.010800
7422.113400
7442.231800
7462.043000
7482.321000
7501.993500
7522.040600
7541.996400
7562.118800
7582.276500
7601.995700
7622.060900
7642.246600
7662.084300
7682.142000
7701.934100
7722.135200
7742.223900
7762.145600
7782.132700
7801.909300
7821.795400
7842.209700
7862.062100
7882.196100
7902.097600
7921.920600
7942.067700
7961.977000
7982.130600
8002.064300
8022.189800
8041.902400
8062.181400
8082.085800
8102.187200
8121.990700
8141.853500
8162.013400
8182.193000
8202.135000
8222.056700
8242.100500
8262.160700
8282.148400
8302.015300
8322.052800
8342.127400
8362.011400
8382.218800
8402.052200
8421.852600
8442.292900
8461.925400
8482.232400
8501.924700
8522.041500
8542.075000
8562.052500
8582.110100
8602.009700
8621.940300
8641.930700
8662.005600
8682.189400
8702.034000
8722.081500
8742.275700
8762.333200
8782.011400
8802.307600
8822.064400
8842.038600
8862.205400
8882.184700
8902.049300
8921.912800
8942.058200
8961.986300
8981.990900
9002.127800
9022.067000
9041.926100
9061.877100
9081.995300
9101.989900
9122.215700
9142.158000
9162.076600
9182.151800
9202.016800
9222.177700
9241.939400
9262.129800
9281.971600
9302.025400
9322.074100
9341.925200
9361.851000
9382.110500
9402.256700
9422.089400
9442.209800
9462.101600
9482.135200
9502.064700
9521.989300
9542.180800
9562.027600
9581.966600
9602.046400
9622.114900
9641.899700
9661.943600
9682.098600
9701.871900
9722.038300
9742.001100
9761.881700
9781.976200
9802.058900
9822.070100
9842.041400
9862.057300
9882.272800
9902.087000
9922.066500
9942.005200
9961.987900
9982.011500
10002.152600
10021.918700
10042.031500
10062.097100
10082.047400
10101.899300
10122.114100
10141.925400
10162.100300
10181.901600
10202.153000
10221.780600
10242.142000
10262.057000
10282.027100
10302.135500
10322.120800
10341.971300
10362.204500
10382.128800
10402.002600
10422.220000
10442.105400
10462.081000
10481.930700
10502.133400
10522.023800
10542.085700
10562.113900
10582.178500
10602.053800
10622.051900
10641.974200
10662.016100
10682.055400
10702.104100
10722.230000
10742.163400
10761.930300
10781.846200
10801.992400
10822.006400
10842.027400
10862.054600
10882.174500
10902.092500
10922.075800
10941.935100
10961.967800
10981.882000
11002.015000
11021.984100
11042.056600
11062.109000
11082.027300
11101.917400
11122.055800
11141.840900
11162.101800
11182.081900
11201.733500
11222.221000
11242.299000
11262.228400
11282.118800
11302.051900
11322.043100
11342.016700
11362.128400
11381.957200
11402.158500
11422.032900
11442.092300
11462.446400
11482.012100
11502.137800
11522.008800
11542.108500
11561.890600
11582.164400
11601.966700
11621.809400
11641.976700
11662.050800
11681.971300
11702.099300
11722.087000
11741.973800
11761.943800
11781.997900
11802.169400
11822.179900
11841.974800
11862.151100
11881.951300
11902.107300
11922.191900
11942.156400
11962.010400
11981.855400
12002.012400
12022.010000
12041.869400
12062.075700
12081.967600
12102.120200
12122.042800
12142.224100
12161.833600
12182.265200
12201.904100
12222.182600
12242.022100
12261.925600
12282.112200
12301.923800
12321.868400
12342.097600
12361.904800
12382.104500
12402.136600
12422.073600
12441.888500
12461.885300
12481.927600
12501.991000
12522.062900
12541.962100
12562.059300
12581.883000
12601.857800
12622.089100
12642.173400
12661.885500
12681.985600
12701.910000
12721.985400
12741.927300
12762.047700
12782.077500
12801.958000
12821.974500
12842.098100
12861.926700
12882.069400
12902.063800
12921.934100
12941.900000
12961.876200
12982.179700
13001.797100
13021.888800
13041.889000
13062.002700
13082.131300
13101.962300
13121.933800
13141.973400
13161.941200
13181.891600
13201.845000
13221.974000
13241.930000
13262.023800
13281.961900
13302.042900
13321.882100
13341.936400
13362.091900
13381.914600
13401.878200
13421.827900
13441.803400
13461.975500
13481.964500
13502.021500
13521.867600
13542.153300
13561.898400
13581.796900
13602.014800
13622.125800
13641.938500
13661.825500
13681.829500
13702.099000
13721.911500
13741.970200
13761.933700
13781.882600
13802.198100
13821.994500
13841.886800
13861.863400
13882.219800
13901.787600
13922.202000
13942.007300
13961.921700
13982.030000
14001.953500
14021.918600
14041.826800
14061.921600
14081.972100
14101.848900
14121.863200
14141.870000
14161.900300
14181.952600
14201.784700
14222.110400
14241.904600
14261.933700
14281.894300
14301.988900
14322.084700
14342.027300
14362.022300
14381.991400
14401.979800
14421.976300
14441.902300
14461.842300
14482.016400
14501.920800
14522.030300
14541.865400
14562.165400
14581.976400
14602.001500
14621.993400
14642.135300
14662.072800
14681.989600
14701.908900
14721.831500
14742.042000
14761.834600
14781.956900
14802.051800
14821.857200
14841.826000
14861.848900
14881.919000
14902.022100
14921.893400
14941.908200
14961.914800
14981.765500
15002.081200
15021.865100
15041.871300
15061.763000
15081.925400
15101.834500
15121.922100
15141.972500
15162.019000
15181.747900
15202.155100
15221.849600
15241.778400
15261.902600
15281.826300
15301.915600
15321.924700
15341.868700
15361.973000
15381.873000
15401.979300
15421.827000
15441.972100
15461.904300
15482.082400
15501.803100
15521.855400
15541.764000
15561.937700
15581.837400
15601.868600
15621.939100
15642.101000
15661.999700
15681.837000
15701.765400
15721.890400
15741.994600
15762.041400
15782.049400
15801.847300
15821.922000
15841.788600
15862.066300
15881.750000
15902.046100
15921.830300
15941.929600
15961.791400
15981.877100
16002.069200
16021.907800
16041.887000
16061.935300
16081.959900
16101.922200
16121.918700
16141.927400
16161.938700
16182.002700
16201.941900
16221.944200
16242.088600
16261.771600
16281.963900
16301.819600
16321.901400
16341.982600
16361.849000
16381.874100
16402.058500
16421.807100
16441.919200
16461.753500
16481.787600
16501.907700
16521.972400
16541.739600
16561.739300
16581.954800
16601.949900
16621.878500
16641.868500
16661.957500
16681.959100
16701.887400
16721.908500
16741.677700
16761.960000
16781.925800
16801.822500
16821.804500
16841.837600
16861.913100
16881.837900
16901.924000
16921.740000
16941.738300
16961.747700
16981.875600
17001.796500
17021.848000
17041.873400
17061.842100
17081.839200
17101.858200
17121.952700
17141.928900
17161.731000
17181.843000
17201.782700
17221.856400
17241.797700
17261.995300
17281.881100
17301.755500
17321.805100
17341.797000
17361.847300
17381.766000
17401.775800
17421.830100
17441.689000
17461.775900
17481.753500
17501.883300
17522.002800
17541.812300
17561.823600
17582.014900
17601.689700
17621.790200
17641.912700
17661.785400
17682.037000
17701.755400
17721.757600
17741.806600
17761.743900
17781.949300
17801.592700
17821.831800
17841.853900
17861.888600
17881.717500
17901.771900
17921.657800
17941.801800
17962.007100
17981.810600
18001.905300
18021.712600
18041.946700
18061.798800
18081.907100
18101.671100
18121.829000
18141.915200
18161.805600
18181.774300
18201.880600
18221.817000
18241.739000
18261.977800
18281.871200
18301.964600
18321.853700
18341.718300
18361.869900
18381.733200
18401.705000
18421.737800

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 48min 4s, sys: 2.42 s, total: 48min 7s\n", + "Wall time: 55min 24s\n" + ] + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=1842, training_loss=1.978349237566274, metrics={'train_runtime': 3324.6602, 'train_samples_per_second': 4.431, 'train_steps_per_second': 0.554, 'total_flos': 1.2008930119345152e+17, 'train_loss': 1.978349237566274, 'epoch': 1.0})" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "# Start training\n", + "#second run 8-bit adam\n", + "\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "30ff79f6", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [1842/1842 56:50, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
21.762500
41.993000
62.012800
81.968100
101.876500
121.885600
141.824500
161.972300
181.895400
201.731800
221.942900
241.911300
261.744500
281.875000
301.766400
321.745000
341.942600
361.890400
381.878400
401.936300
421.837300
441.648200
461.912600
481.816500
501.922800
521.668600
541.741300
561.784100
581.867000
601.744000
621.788100
641.748700
661.724900
681.908300
701.833900
721.836300
741.897900
761.961500
781.705600
801.669400
821.636800
841.637000
861.740300
881.834900
901.834500
921.785000
941.963300
961.794600
981.729300
1001.891400
1021.796900
1041.749000
1061.795900
1081.825300
1101.774700
1121.793100
1141.606200
1161.907500
1182.082100
1201.743100
1221.943000
1241.867400
1261.836300
1281.721200
1301.691900
1321.751500
1341.722600
1361.790700
1381.891600
1401.769700
1421.989200
1441.819300
1461.815200
1481.737100
1501.617600
1521.873600
1541.768500
1561.977800
1581.828000
1601.859200
1621.681800
1641.804500
1661.809500
1681.708400
1701.698500
1721.889000
1741.826400
1761.821100
1781.670800
1801.897300
1821.702900
1841.874500
1861.792300
1881.886600
1901.695100
1921.778800
1941.650400
1961.774300
1981.754800
2001.813900
2021.815400
2041.830300
2061.827800
2081.746700
2101.640700
2121.858900
2141.766800
2161.799400
2181.652400
2201.725000
2221.838200
2241.891400
2261.782800
2281.633600
2301.766300
2321.799000
2341.803900
2361.761900
2381.680900
2401.977100
2421.742200
2441.869700
2461.598600
2481.761500
2501.720600
2521.740200
2541.832600
2561.830200
2581.753300
2601.555200
2621.983700
2641.595400
2661.670100
2681.687800
2701.783500
2721.836000
2741.700200
2761.629400
2781.717300
2801.849900
2821.764300
2841.709000
2861.735400
2881.802900
2901.767700
2921.828200
2941.807600
2961.706600
2981.712600
3001.709800
3021.686400
3041.813400
3061.839900
3081.732000
3101.648000
3121.877900
3141.672400
3161.756800
3181.754600
3201.793500
3221.731700
3241.703700
3261.608500
3281.851000
3301.718100
3321.802100
3341.814500
3361.758400
3381.718800
3401.936900
3421.664200
3441.816600
3461.745400
3481.688500
3501.729000
3521.830400
3541.766500
3561.659800
3581.931700
3601.681200
3622.015500
3641.750700
3661.843200
3681.760300
3701.935200
3721.633400
3741.756500
3761.751600
3781.701700
3801.866700
3821.893900
3841.781000
3861.870300
3881.895000
3901.778400
3921.771400
3941.619400
3961.759100
3981.804400
4001.928400
4021.860800
4041.624600
4061.830500
4081.686000
4101.848700
4121.853600
4141.599100
4161.791300
4181.700700
4201.742800
4221.720000
4241.652400
4261.626800
4281.732600
4301.612600
4321.854100
4341.740100
4361.797800
4381.850100
4401.768200
4421.718100
4441.812500
4461.916900
4481.784900
4501.754300
4521.717900
4541.648100
4561.713800
4581.711600
4601.726400
4621.693600
4641.970600
4661.757500
4681.658100
4701.876100
4721.880600
4741.812200
4761.872100
4781.724500
4801.772600
4821.824700
4841.719000
4861.690200
4881.895600
4901.771800
4921.901900
4941.906900
4961.794200
4981.677500
5001.598500
5021.683300
5041.708100
5061.772500
5081.845200
5101.871600
5121.828100
5141.846400
5161.777800
5181.722900
5201.976700
5221.864000
5241.789200
5261.711000
5281.803300
5301.747200
5321.666000
5341.773200
5361.937800
5381.731000
5401.840400
5421.797700
5441.675100
5462.043600
5481.641900
5501.808600
5521.868900
5541.755100
5561.864200
5581.751800
5601.809000
5621.896300
5641.899600
5661.777600
5681.752400
5701.762100
5721.740900
5741.614500
5761.865800
5781.755500
5801.817200
5821.763600
5841.752600
5861.698400
5881.711800
5901.632000
5921.804200
5941.878600
5961.754200
5981.655300
6001.765400
6021.978200
6041.809300
6061.781100
6081.808300
6101.862600
6121.724200
6141.679800
6161.693600
6181.781700
6201.798400
6221.616500
6241.853900
6261.772100
6281.842500
6301.633300
6321.813900
6341.826800
6361.814900
6381.679000
6401.856600
6421.752100
6441.595500
6461.881400
6481.645100
6501.725400
6521.901500
6541.753600
6561.733300
6581.786700
6601.846100
6621.643600
6641.707900
6661.569000
6681.774300
6701.755700
6721.811600
6741.712900
6761.771200
6781.871200
6801.710200
6821.664800
6841.783300
6861.886800
6881.963700
6901.828400
6921.819500
6941.730300
6961.838500
6981.607400
7001.689600
7021.784100
7041.824900
7061.745600
7081.800200
7101.832500
7121.726300
7141.707400
7161.537000
7181.885900
7201.762300
7221.825400
7241.759000
7261.731500
7281.854000
7301.792100
7321.810000
7341.773000
7361.687000
7381.768900
7401.840400
7421.717400
7441.811900
7461.767800
7481.826800
7501.844000
7521.703200
7541.861000
7561.622900
7581.749300
7601.861500
7621.793800
7641.644600
7661.854900
7681.927300
7701.752100
7721.638300
7741.796500
7761.899900
7781.785000
7801.805400
7821.703100
7841.794000
7861.720300
7881.758500
7901.560100
7921.735200
7941.731200
7961.726600
7981.718400
8001.863600
8021.693600
8041.950100
8061.741200
8081.823700
8101.812300
8121.861100
8141.865500
8161.819200
8181.760300
8201.660100
8221.715600
8241.697400
8262.043500
8281.696700
8301.610800
8321.756000
8341.791000
8361.890000
8381.894000
8401.773300
8421.748100
8441.768600
8461.703000
8481.729600
8501.749700
8521.774200
8541.904000
8561.783800
8581.719100
8601.648600
8621.839100
8641.850300
8661.734600
8681.745800
8701.709400
8721.707100
8741.980800
8761.710900
8781.732500
8801.658800
8821.764000
8841.674800
8861.771000
8881.646400
8901.700100
8921.742800
8941.825900
8961.750300
8981.894800
9001.803300
9021.658800
9041.787300
9061.704700
9081.750000
9101.771600
9121.591700
9141.943400
9161.724800
9181.688200
9201.939700
9221.664700
9241.752200
9261.697100
9281.753600
9301.888800
9321.803400
9342.077200
9361.809800
9381.762700
9401.795600
9421.923900
9441.803500
9461.853900
9481.766200
9501.806100
9521.735700
9541.660800
9561.768700
9581.755300
9601.853400
9621.763400
9641.928800
9661.853900
9681.708500
9701.779700
9721.641900
9741.706400
9761.800100
9781.719600
9801.701800
9821.720200
9841.693400
9861.799200
9881.647900
9901.650300
9921.655000
9941.746400
9961.684900
9981.694600
10001.774500
10021.778100
10041.673200
10061.709700
10081.684300
10101.750700
10121.790900
10141.742500
10161.618300
10181.545800
10201.703700
10221.617900
10241.618300
10261.837300
10281.585000
10301.613200
10321.737800
10341.911200
10361.734600
10381.698800
10401.499200
10421.681500
10441.805000
10461.910700
10481.728000
10501.822600
10521.732600
10541.814900
10561.717600
10581.866400
10601.605600
10621.661800
10641.833400
10661.734000
10681.690800
10701.747000
10721.740600
10741.752800
10761.611900
10781.826700
10801.765200
10821.704000
10841.792200
10861.754600
10881.698800
10901.675700
10921.887600
10941.670100
10961.737700
10981.898500
11001.744000
11021.831100
11041.900000
11061.732500
11081.838000
11101.672100
11121.747900
11141.664800
11161.768900
11181.919000
11201.744500
11221.843900
11241.845900
11261.801100
11281.648000
11301.616700
11321.911400
11341.654500
11361.973500
11381.740700
11401.589200
11421.922500
11441.680700
11461.726100
11481.776800
11501.661600
11521.802200
11541.597500
11561.778600
11581.765400
11601.710600
11621.828900
11641.751800
11661.907000
11681.762000
11701.736300
11721.605300
11741.790300
11761.717300
11781.748000
11801.703100
11821.755200
11841.813500
11861.611000
11881.686400
11901.722600
11921.769400
11941.743000
11961.637200
11981.711300
12001.679400
12021.602500
12041.717200
12061.670500
12081.664000
12101.682000
12121.749900
12141.676600
12161.889000
12181.705300
12201.757200
12221.834400
12241.686200
12261.627800
12281.672300
12301.702100
12321.772000
12341.809500
12361.691100
12381.763400
12401.670700
12421.777700
12441.882300
12461.771200
12481.763900
12501.803500
12521.648000
12541.616000
12561.736300
12581.739100
12601.883500
12621.690800
12642.020900
12661.777400
12681.722700
12701.744500
12721.646400
12741.586300
12761.744400
12781.747800
12801.915500
12821.885000
12841.876500
12861.757800
12881.665200
12901.680600
12921.794300
12941.679000
12961.688800
12981.845600
13001.849000
13021.785200
13041.792600
13061.655400
13081.807000
13101.809400
13121.627400
13141.758300
13161.808700
13181.769400
13201.499500
13221.880700
13241.783400
13261.627500
13281.779900
13301.611800
13321.799400
13341.571500
13361.694300
13381.681400
13401.743200
13421.873900
13441.873300
13461.709700
13481.648700
13501.729100
13521.786100
13541.781300
13561.899400
13581.804800
13601.695200
13621.672800
13641.909900
13661.770500
13681.828700
13701.847400
13721.586500
13741.773700
13761.997100
13781.687100
13801.759800
13821.759900
13841.830600
13861.652500
13881.896700
13901.817100
13921.606900
13941.857600
13961.712100
13981.831100
14001.691800
14021.766100
14041.855000
14061.628700
14081.716600
14101.689700
14121.776400
14141.683200
14161.686600
14181.775600
14201.660600
14221.856400
14241.823300
14261.765700
14281.786900
14301.753000
14321.805300
14341.748100
14361.816400
14381.770600
14401.654200
14421.757200
14441.799900
14461.739600
14481.669500
14501.767300
14521.706800
14541.763400
14561.777800
14581.706500
14601.666400
14621.638900
14641.751600
14661.830500
14681.830100
14701.739200
14721.700400
14741.803100
14761.717800
14781.607300
14801.723500
14821.716600
14841.811800
14861.801800
14881.793100
14901.684900
14921.842500
14941.903100
14961.669400
14981.764600
15001.824600
15022.020800
15041.769800
15061.835100
15081.883000
15101.805700
15121.802400
15141.894100
15161.818700
15181.924900
15201.840100
15221.759000
15241.816700
15261.747800
15281.665800
15301.741300
15321.809100
15341.774300
15361.744900
15381.703800
15401.788000
15421.686400
15441.839900
15461.758400
15481.833900
15501.754100
15521.759400
15541.714100
15561.706700
15581.583500
15601.729900
15621.975600
15641.750300
15661.724700
15681.942400
15701.734600
15721.706200
15741.878500
15761.866500
15781.777700
15801.823100
15821.795800
15841.828500
15861.712900
15881.901600
15901.711400
15921.674800
15941.863800
15961.801600
15981.758600
16001.876700
16021.643100
16041.571300
16061.773200
16081.741000
16101.639600
16121.692300
16141.675200
16161.783200
16181.672100
16201.825500
16221.765000
16241.842300
16261.740200
16281.764600
16301.719500
16321.905800
16341.922600
16361.643700
16381.714600
16401.830900
16421.678800
16441.680300
16461.774300
16481.689200
16501.774000
16521.683800
16541.895400
16561.615500
16581.696200
16601.615400
16621.731300
16641.594400
16661.877400
16681.667000
16701.790100
16721.652300
16741.832900
16761.756400
16781.753300
16801.682400
16821.781100
16841.934200
16861.760200
16881.753300
16901.734000
16921.754600
16941.650800
16961.756900
16981.732400
17001.675500
17021.763400
17041.767800
17061.705500
17081.705000
17101.697200
17121.735200
17141.693400
17161.653800
17181.882700
17201.671700
17221.788100
17241.694400
17261.670600
17281.592900
17301.798600
17321.788800
17341.754500
17361.679400
17381.741400
17401.768500
17421.929000
17441.620800
17461.664000
17481.753300
17501.704200
17521.643500
17541.734200
17561.732200
17581.624000
17601.742200
17621.760500
17641.676000
17661.659200
17681.589000
17701.542100
17721.850300
17741.806100
17761.717900
17781.786600
17801.667800
17821.816200
17841.690200
17861.780600
17881.833300
17901.773800
17921.929000
17941.774300
17961.684800
17981.714800
18001.693700
18021.718300
18041.756300
18061.734400
18081.679600
18101.574700
18121.749900
18141.657100
18161.754300
18181.701100
18201.769400
18221.653800
18241.913100
18261.686400
18281.794900
18301.622600
18321.881600
18341.565700
18361.720700
18381.662300
18401.851500
18421.821800

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 47min 49s, sys: 5.42 s, total: 47min 55s\n", + "Wall time: 56min 52s\n" + ] + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=1842, training_loss=1.7642962910582785, metrics={'train_runtime': 3412.1604, 'train_samples_per_second': 4.317, 'train_steps_per_second': 0.54, 'total_flos': 1.197906765452544e+17, 'train_loss': 1.7642962910582785, 'epoch': 1.0})" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "# Start training\n", + "#first run\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "b12267be-fbfe-4aeb-bb11-3454d9a70416", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [103/103 01:06]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'eval_loss': 1.7630722522735596,\n", + " 'eval_runtime': 68.3611,\n", + " 'eval_samples_per_second': 11.981,\n", + " 'eval_steps_per_second': 1.507,\n", + " 'epoch': 1.0}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#evaluate and return the metrics\n", + "trainer.evaluate()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87413637-f537-4d50-9bd3-022f124834a8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [ 50/103 00:26 < 00:29, 1.82 it/s]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#second\n", + "#evaluate and return the metrics\n", + "trainer.evaluate()" + ] + }, + { + "cell_type": "markdown", + "id": "9351292f", + "metadata": {}, + "source": [ + "Load a test dataset and try a random sample for summarization." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f220ba3-f782-4a86-a349-ed8d8cda405e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Load dataset from the hub\n", + "test_dataset = load_dataset(\"samsum\", split=\"test\")\n", + "\n", + "# select a random test sample\n", + "sample = test_dataset[randint(0, len(test_dataset))]\n", + "\n", + "# format sample\n", + "prompt_template = f\"Summarize the chat dialogue:\\n{{dialogue}}\\n---\\nSummary:\\n\"\n", + "\n", + "test_sample = prompt_template.format(dialogue=sample[\"dialogue\"])\n", + "\n", + "print(test_sample)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "413c44ae-35b3-47fa-b3b4-9eaeafec9da6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "input_ids = tokenizer(test_sample, return_tensors=\"pt\").input_ids" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1af86337-48b6-4165-a105-d4650eb07762", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#set the tokens for the summary evaluation\n", + "tokens_for_summary = 30\n", + "output_tokens = input_ids.shape[1] + tokens_for_summary\n", + "\n", + "outputs = model.generate(inputs=input_ids, do_sample=True, max_length=output_tokens)\n", + "gen_text = tokenizer.batch_decode(outputs)[0]\n", + "print(gen_text)" + ] + } + ], + "metadata": { + "availableInstances": [ + { + "_defaultOrder": 0, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.t3.medium", + "vcpuNum": 2 + }, + { + "_defaultOrder": 1, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.t3.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 2, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.t3.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 3, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.t3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 4, + "_isFastLaunch": true, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 5, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 6, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 7, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 8, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 9, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 10, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 11, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 12, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.m5d.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 13, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.m5d.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 14, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.m5d.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 15, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.m5d.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 16, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.m5d.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 17, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.m5d.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 18, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.m5d.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 19, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.m5d.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 20, + "_isFastLaunch": false, + "category": "General purpose", + "gpuNum": 0, + "hideHardwareSpecs": true, + "memoryGiB": 0, + "name": "ml.geospatial.interactive", + "supportedImageNames": [ + "sagemaker-geospatial-v1-0" + ], + "vcpuNum": 0 + }, + { + "_defaultOrder": 21, + "_isFastLaunch": true, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 4, + "name": "ml.c5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 22, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 8, + "name": "ml.c5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 23, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.c5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 24, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.c5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 25, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 72, + "name": "ml.c5.9xlarge", + "vcpuNum": 36 + }, + { + "_defaultOrder": 26, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 96, + "name": "ml.c5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 27, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 144, + "name": "ml.c5.18xlarge", + "vcpuNum": 72 + }, + { + "_defaultOrder": 28, + "_isFastLaunch": false, + "category": "Compute optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.c5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 29, + "_isFastLaunch": true, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g4dn.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 30, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g4dn.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 31, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g4dn.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 32, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g4dn.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 33, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g4dn.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 34, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g4dn.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 35, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 61, + "name": "ml.p3.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 36, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 244, + "name": "ml.p3.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 37, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 488, + "name": "ml.p3.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 38, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.p3dn.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 39, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.r5.large", + "vcpuNum": 2 + }, + { + "_defaultOrder": 40, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.r5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 41, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.r5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 42, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.r5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 43, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.r5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 44, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.r5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 45, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 512, + "name": "ml.r5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 46, + "_isFastLaunch": false, + "category": "Memory Optimized", + "gpuNum": 0, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.r5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 47, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 16, + "name": "ml.g5.xlarge", + "vcpuNum": 4 + }, + { + "_defaultOrder": 48, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 32, + "name": "ml.g5.2xlarge", + "vcpuNum": 8 + }, + { + "_defaultOrder": 49, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 64, + "name": "ml.g5.4xlarge", + "vcpuNum": 16 + }, + { + "_defaultOrder": 50, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 128, + "name": "ml.g5.8xlarge", + "vcpuNum": 32 + }, + { + "_defaultOrder": 51, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 1, + "hideHardwareSpecs": false, + "memoryGiB": 256, + "name": "ml.g5.16xlarge", + "vcpuNum": 64 + }, + { + "_defaultOrder": 52, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 192, + "name": "ml.g5.12xlarge", + "vcpuNum": 48 + }, + { + "_defaultOrder": 53, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 4, + "hideHardwareSpecs": false, + "memoryGiB": 384, + "name": "ml.g5.24xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 54, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 768, + "name": "ml.g5.48xlarge", + "vcpuNum": 192 + }, + { + "_defaultOrder": 55, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.g5.12xlarge", + "vcpuNum": 96 + }, + { + "_defaultOrder": 56, + "_isFastLaunch": false, + "category": "Accelerated computing", + "gpuNum": 8, + "hideHardwareSpecs": false, + "memoryGiB": 1152, + "name": "ml.g5.12xlarge", + "vcpuNum": 96 + } + ], + "instance_type": "ml.g5.12xlarge", + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/LoRA.png b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/LoRA.png new file mode 100644 index 0000000..93bc9cd Binary files /dev/null and b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/LoRA.png differ diff --git a/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/QLoRA.png b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/QLoRA.png new file mode 100644 index 0000000..68c0e65 Binary files /dev/null and b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/QLoRA.png differ diff --git a/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/README.md b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/README.md new file mode 100644 index 0000000..23347b1 --- /dev/null +++ b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/README.md @@ -0,0 +1,20 @@ +# QLoRA vs LoRA Experiment interm of Training time and tflops used + +Train via runing the ipynb file with an A100 GPU
+Control: Same dataset, batch_size, optimizer, and other settings
+Independent variable: quantization_config argument in the model loading method: AutoModelForCausalLM.from_pretrained()

+ +LoRA Tensorboard: https://colab.research.google.com/drive/1UFi3WgozGlP1OrswuIlCSbnBZRNdRXuy?usp=sharing
+QLoRA Tensorboard: https://colab.research.google.com/drive/1kgXey6DsPeitXMa_ziGOKqdSCwZork9k?usp=sharing +

+ +## LoRA training time + +

+## QLoRA training time + + +
+the reference for code: https://github.com/aws-samples/amazon-sagemaker-generativeai/blob/main/studio-notebook-fine-tuning/falcon-40b-qlora-finetune-summarize.ipynb +

+Observation: quantized peft model take longer time to be trained with the same setup than normal peft model. \ No newline at end of file diff --git a/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/qlora_batchsize4.dvc b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/qlora_batchsize4.dvc new file mode 100644 index 0000000..5e6b9c2 --- /dev/null +++ b/src/model/notebook/QLoRA_vs_LoRA Report(Training time + tflops)/qlora_batchsize4.dvc @@ -0,0 +1,6 @@ +outs: +- md5: 9f2cbda9517675bbd5ef1fe9fe6175ad.dir + size: 159572 + nfiles: 3 + hash: md5 + path: qlora_batchsize4 diff --git a/src/model/notebook/finetune_llama2/OpenThaiGPT_FineTune_Llama.ipynb b/src/model/notebook/finetune_llama2/OpenThaiGPT_FineTune_Llama.ipynb new file mode 100644 index 0000000..0c9aeb5 --- /dev/null +++ b/src/model/notebook/finetune_llama2/OpenThaiGPT_FineTune_Llama.ipynb @@ -0,0 +1,1474 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "HWZlfOlXaJQZ" + }, + "source": [ + "# Fine-Tuning Llama OpenThaiGPT" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4MzwQ_1IaYKn" + }, + "source": [ + "Credit: [younesbelkada](https://gist.github.com/younesbelkada/9f7f75c94bdc1981c8ca5cc937d4a4da)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eqTIqK3bad86" + }, + "source": [ + "## Install Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "utHMekXTZw9S", + "outputId": "ffffb42a-db27-43ec-d85b-20f01af47aa7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", + " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + " Building wheel for peft (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.10/dist-packages (0.1.99)\n" + ] + } + ], + "source": [ + "!pip install -q accelerate==0.21.0 peft==0.4.0 bitsandbytes==0.40.2 transformers==4.31.0 trl==0.4.7\n", + "!pip install -q -U trl transformers accelerate git+https://github.com/huggingface/peft.git\n", + "!pip install -q datasets bitsandbytes einops wandb\n", + "!pip install sentencepiece" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fhBIZnGJa6T5" + }, + "source": [ + "## Import Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "QK0LYCwSa_Y1" + }, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "from datasets import load_dataset, Dataset,DatasetDict\n", + "from transformers import (\n", + " LlamaForCausalLM,\n", + " LlamaTokenizer,\n", + " BitsAndBytesConfig,\n", + " HfArgumentParser,\n", + " TrainingArguments,\n", + " pipeline,\n", + " logging,\n", + ")\n", + "from peft import LoraConfig, PeftModel\n", + "from trl import SFTTrainer\n", + "import sentencepiece\n", + "import pandas as pd\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aHZZPkJlbNo-" + }, + "source": [ + "## Model Setting" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "dg3_IH7UbXXM" + }, + "outputs": [], + "source": [ + "# The model that you want to train from the Hugging Face hub\n", + "model_name = \"openthaigpt/openthaigpt-1.0.0-alpha-7b-chat-ckpt-hf\"\n", + "\n", + "# Fine-tuned model name\n", + "new_model = \"openthaigpt-alpha-7b-thai-med-pack\"\n", + "\n", + "################################################################################\n", + "# QLoRA parameters\n", + "################################################################################\n", + "\n", + "# LoRA attention dimension\n", + "lora_r = 64\n", + "\n", + "# Alpha parameter for LoRA scaling\n", + "lora_alpha = 16\n", + "\n", + "# Dropout probability for LoRA layers\n", + "lora_dropout = 0.1\n", + "\n", + "################################################################################\n", + "# bitsandbytes parameters\n", + "################################################################################\n", + "\n", + "# Activate 4-bit precision base model loading\n", + "use_4bit = True\n", + "\n", + "# Compute dtype for 4-bit base models\n", + "bnb_4bit_compute_dtype = \"float16\"\n", + "\n", + "# Quantization type (fp4 or nf4)\n", + "bnb_4bit_quant_type = \"nf4\"\n", + "\n", + "# Activate nested quantization for 4-bit base models (double quantization)\n", + "use_nested_quant = False\n", + "\n", + "################################################################################\n", + "# TrainingArguments parameters\n", + "################################################################################\n", + "\n", + "# Output directory where the model predictions and checkpoints will be stored\n", + "output_dir = \"./results\"\n", + "\n", + "# Number of training epochs\n", + "num_train_epochs = 1\n", + "\n", + "# Enable fp16/bf16 training (set bf16 to True with an A100)\n", + "fp16 = False\n", + "bf16 = False\n", + "\n", + "# Batch size per GPU for training\n", + "per_device_train_batch_size = 4\n", + "\n", + "# Batch size per GPU for evaluation\n", + "per_device_eval_batch_size = 4\n", + "\n", + "# Number of update steps to accumulate the gradients for\n", + "gradient_accumulation_steps = 1\n", + "\n", + "# Enable gradient checkpointing\n", + "gradient_checkpointing = True\n", + "\n", + "# Maximum gradient normal (gradient clipping)\n", + "max_grad_norm = 0.3\n", + "\n", + "# Initial learning rate (AdamW optimizer)\n", + "learning_rate = 1e-5\n", + "\n", + "# Weight decay to apply to all layers except bias/LayerNorm weights\n", + "weight_decay = 0.001\n", + "\n", + "# Optimizer to use\n", + "optim = \"paged_adamw_32bit\"\n", + "\n", + "# Learning rate schedule\n", + "lr_scheduler_type = \"cosine\"\n", + "\n", + "# Number of training steps (overrides num_train_epochs)\n", + "max_steps = -1\n", + "\n", + "# Ratio of steps for a linear warmup (from 0 to learning rate)\n", + "warmup_ratio = 0.03\n", + "\n", + "# Group sequences into batches with same length\n", + "# Saves memory and speeds up training considerably\n", + "group_by_length = True\n", + "\n", + "# Save checkpoint every X updates steps\n", + "save_steps = 0\n", + "\n", + "# Log every X updates steps\n", + "logging_steps = 25\n", + "\n", + "################################################################################\n", + "# SFT parameters\n", + "################################################################################\n", + "\n", + "# Maximum sequence length to use\n", + "max_seq_length = None\n", + "\n", + "# Pack multiple short examples in the same input sequence to increase efficiency\n", + "packing = False\n", + "\n", + "# Load the entire model on the GPU 0\n", + "device_map = {\"\": 0}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YqadKLAp7NXQ" + }, + "source": [ + "## Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QKdQmDMs7ShU", + "outputId": "16f17839-99d6-4677-be75-6226b047ea01" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Dataset({\n", + " features: ['instruction', 'output', 'input'],\n", + " num_rows: 5452\n", + "})" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Load Dataset from Huggingface Hub\n", + "\n", + "# The instruction dataset to use\n", + "dataset_name = \"Thaweewat/chatmed-5k-th\" #\"mlabonne/guanaco-llama2-1k\"\n", + "\n", + "# dataset for train\n", + "dataset = load_dataset(dataset_name, split=\"train\")\n", + "dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JxGyd391AsWf", + "outputId": "87ec9540-7b64-48cb-d56c-75558ea3cee6" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'instruction': ' ฉันประสบกับอาการตื่นตระหนกกะทันหันและบ่อยครั้ง ฉันไม่รู้จะทำยังไงดี',\n", + " 'output': 'ก็ ตามที่คุณบอกมา ดูเหมือนว่าคุณอาจจะเป็นโรคตื่นตระหนก แนวทางปฏิบัติที่ดีที่สุดคือเริ่มด้วยการทำจิตบำบัดและการให้คำปรึกษาด้านสุขภาพจิต นอกจากนี้ เราควรทำการตรวจคลื่นไฟฟ้าหัวใจเพื่อให้แน่ใจว่าไม่มีปัญหาทางกายภาพที่ทำให้คุณมีอาการตื่นตระหนก เรายังต้องทำการตรวจคัดกรองภาวะซึมเศร้าและการตรวจพิษวิทยาเพื่อแยกแยะสาเหตุอื่นๆ สุดท้ายนี้ ฉันขอแนะนำการประเมินและการบำบัดทางจิตวิทยาและจิตเวชที่ครอบคลุมเพื่อช่วยจัดการกับอาการของคุณ',\n", + " 'input': '',\n", + " 'text': '[INST] ฉันประสบกับอาการตื่นตระหนกกะทันหันและบ่อยครั้ง ฉันไม่รู้จะทำยังไงดี [INST] ก็ ตามที่คุณบอกมา ดูเหมือนว่าคุณอาจจะเป็นโรคตื่นตระหนก แนวทางปฏิบัติที่ดีที่สุดคือเริ่มด้วยการทำจิตบำบัดและการให้คำปรึกษาด้านสุขภาพจิต นอกจากนี้ เราควรทำการตรวจคลื่นไฟฟ้าหัวใจเพื่อให้แน่ใจว่าไม่มีปัญหาทางกายภาพที่ทำให้คุณมีอาการตื่นตระหนก เรายังต้องทำการตรวจคัดกรองภาวะซึมเศร้าและการตรวจพิษวิทยาเพื่อแยกแยะสาเหตุอื่นๆ สุดท้ายนี้ ฉันขอแนะนำการประเมินและการบำบัดทางจิตวิทยาและจิตเวชที่ครอบคลุมเพื่อช่วยจัดการกับอาการของคุณ '}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset = dataset.map(lambda example: {\n", + " 'text': f\"[INST] {example['instruction']} [INST] {example['output']} \",\n", + "})\n", + "dataset[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "bszmAbXG74A4" + }, + "outputs": [], + "source": [ + "# # Load Dataset from Local Files\n", + "\n", + "# df = pd.read_csv(\"path/to/your/datasets.csv\")\n", + "\n", + "# # Split train dataset\n", + "# train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)\n", + "\n", + "# # Convert to DatasetDict\n", + "# train_dataset_dict = DatasetDict({\n", + "# \"train\": Dataset.from_pandas(train_df),\n", + "# })\n", + "\n", + "# # dataset for train\n", + "# dataset = train_dataset_dict['train']" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V9fp6ZjycAid" + }, + "source": [ + "# Fine-Tuning" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000, + "referenced_widgets": [ + "ed78d6fe9e454a9285bffcf79eb9e52e", + "6eeb2a57a28c4683bbb4b4b400854de0", + "dcb0f4a390b047c5a3c4d80be8711084", + "d3d830d36b8f4bb195bffe14058a2ccd", + "0ec0881f6eb0436caceb052f66097b49", + "4aa3e70244d440f9b3721795d2a40e8c", + "1152e8a4879640c5b0d7ac24272ab3d1", + "26fea2af913c43179188483f40ecc959", + "69a832e0f0984b2781e5c39099e06754", + "3b0dbc597c4b41d993305c5ad6dfd5c2", + "544ee250905c493082aee7f67e80e300", + "913fb94ed8f444faa78d03b7cb808cbb", + "ba3dae16eb8241a7be40c435f1295e9f", + "4a985c58e4b14ec08b8c719157cf2484", + "12f821b2624f4c3ebff046214616a34f", + "1b5d5d69331c4d3785371f866b1b1373", + "6063d7eff7904ed2a9b0971c877fa481", + "460de5dac5ca4a3eb55d3808b06be495", + "4833b52dea444674bd077f713543b0e1", + "77b9441f266c4b5e8386b421979a16fb", + "e0b21b13438d4d698cc61b09b541deb7", + "bc86b0bd0a0f450194565d7de1bbf78d" + ] + }, + "id": "NtlAS1Gwbyx7", + "outputId": "ef1258d2-5911-4191-cc8e-14d05fb49091" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ed78d6fe9e454a9285bffcf79eb9e52e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/39 [00:00. This means that tokens that come after special tokens will not be properly handled. We recommend you to read the related pull request available at https://github.com/huggingface/transformers/pull/24565\n", + "/usr/local/lib/python3.10/dist-packages/peft/utils/other.py:119: FutureWarning: prepare_model_for_int8_training is deprecated and will be removed in a future version. Use prepare_model_for_kbit_training instead.\n", + " warnings.warn(\n", + "/usr/local/lib/python3.10/dist-packages/trl/trainer/sft_trainer.py:166: UserWarning: You didn't pass a `max_seq_length` argument to the SFTTrainer, this will default to 1024\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "913fb94ed8f444faa78d03b7cb808cbb", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Map: 0%| | 0/5452 [00:00\n", + " \n", + " \n", + " [1363/1363 1:43:38, Epoch 1/1]\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
250.952400
501.246900
750.888700
1001.117200
1250.843400
1500.997600
1750.786900
2000.924800
2250.793400
2500.847700
2750.721300
3000.829800
3250.704500
3500.784000
3750.713200
4000.741000
4250.690000
4500.777200
4750.711800
5000.754700
5250.688400
5500.750800
5750.671000
6000.735800
6250.677700
6500.751500
6750.676600
7000.759700
7250.656800
7500.753400
7750.662200
8000.719100
8250.689600
8500.719900
8750.638900
9000.754100
9250.650500
9500.760300
9750.687300
10000.716500
10250.653800
10500.719500
10750.659800
11000.726400
11250.659000
11500.733000
11750.643800
12000.701700
12250.637300
12500.699400
12750.632500
13000.725700
13250.671400
13500.695000

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Load tokenizer and model with QLoRA configuration\n", + "compute_dtype = getattr(torch, bnb_4bit_compute_dtype)\n", + "\n", + "bnb_config = BitsAndBytesConfig(\n", + " load_in_4bit=use_4bit,\n", + " bnb_4bit_quant_type=bnb_4bit_quant_type,\n", + " bnb_4bit_compute_dtype=compute_dtype,\n", + " bnb_4bit_use_double_quant=use_nested_quant,\n", + ")\n", + "\n", + "# Check GPU compatibility with bfloat16\n", + "if compute_dtype == torch.float16 and use_4bit:\n", + " major, _ = torch.cuda.get_device_capability()\n", + " if major >= 8:\n", + " print(\"=\" * 80)\n", + " print(\"Your GPU supports bfloat16: accelerate training with bf16=True\")\n", + " print(\"=\" * 80)\n", + "\n", + "# Load base model\n", + "model = LlamaForCausalLM.from_pretrained(\n", + " model_name,\n", + " quantization_config=bnb_config,\n", + " device_map=device_map\n", + ")\n", + "model.config.use_cache = False\n", + "model.config.pretraining_tp = 1\n", + "\n", + "# Load LLaMA tokenizer\n", + "tokenizer = LlamaTokenizer.from_pretrained(model_name, trust_remote_code=True)\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "tokenizer.padding_side = \"right\" # Fix weird overflow issue with fp16 training\n", + "\n", + "# Load LoRA configuration\n", + "peft_config = LoraConfig(\n", + " lora_alpha=lora_alpha,\n", + " lora_dropout=lora_dropout,\n", + " r=lora_r,\n", + " bias=\"none\",\n", + " task_type=\"CAUSAL_LM\",\n", + ")\n", + "\n", + "# Set training parameters\n", + "training_arguments = TrainingArguments(\n", + " output_dir=output_dir,\n", + " num_train_epochs=num_train_epochs,\n", + " per_device_train_batch_size=per_device_train_batch_size,\n", + " gradient_accumulation_steps=gradient_accumulation_steps,\n", + " optim=optim,\n", + " save_steps=save_steps,\n", + " logging_steps=logging_steps,\n", + " learning_rate=learning_rate,\n", + " weight_decay=weight_decay,\n", + " fp16=fp16,\n", + " bf16=bf16,\n", + " max_grad_norm=max_grad_norm,\n", + " max_steps=max_steps,\n", + " warmup_ratio=warmup_ratio,\n", + " group_by_length=group_by_length,\n", + " lr_scheduler_type=lr_scheduler_type,\n", + " report_to=\"tensorboard\"\n", + ")\n", + "\n", + "# Set supervised fine-tuning parameters\n", + "trainer = SFTTrainer(\n", + " model=model,\n", + " train_dataset=dataset,\n", + " peft_config=peft_config,\n", + " dataset_text_field=\"text\", # Name of the field in the dataset that contains the text.\n", + " max_seq_length=max_seq_length,\n", + " tokenizer=tokenizer,\n", + " args=training_arguments,\n", + " packing=packing,\n", + ")\n", + "\n", + "# Train model\n", + "trainer.train()\n", + "\n", + "# Save trained model\n", + "trainer.model.save_pretrained(new_model)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ilvYX6LYcFwf", + "outputId": "5b2a5da1-65a1-4cf4-bfe8-a5d66aff0254" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INST] ปวดหัวมาก เป็นมาสองวันแล้ว [/INST] จากอาการของคุณ ดูเหมือนว่าคุณอาจเป็นโรคเมนิโกรอยด์ ซึ่งเป็นโรคที่เกิดจากการอักเสบของเนื้อเยื่อในสมอง ซึ่งอาจทำให้เกิดอาการปวดหัว ปวดศีรษะ และปวดหลัง เรา\n" + ] + } + ], + "source": [ + "# Ignore warnings\n", + "logging.set_verbosity(logging.CRITICAL)\n", + "\n", + "# Run text generation pipeline with our next model\n", + "prompt = \"ปวดหัวมาก เป็นมาสองวันแล้ว\"\n", + "pipe = pipeline(task=\"text-generation\", model=model, tokenizer=tokenizer, max_length=200)\n", + "result = pipe(f\"[INST] {prompt} [/INST]\")\n", + "print(result[0]['generated_text'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QWPt4y7Acv10" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "0ec0881f6eb0436caceb052f66097b49": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1152e8a4879640c5b0d7ac24272ab3d1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "12f821b2624f4c3ebff046214616a34f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e0b21b13438d4d698cc61b09b541deb7", + "placeholder": "​", + "style": "IPY_MODEL_bc86b0bd0a0f450194565d7de1bbf78d", + "value": " 5452/5452 [00:04<00:00, 1268.43 examples/s]" + } + }, + "1b5d5d69331c4d3785371f866b1b1373": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "26fea2af913c43179188483f40ecc959": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3b0dbc597c4b41d993305c5ad6dfd5c2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "460de5dac5ca4a3eb55d3808b06be495": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4833b52dea444674bd077f713543b0e1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4a985c58e4b14ec08b8c719157cf2484": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4833b52dea444674bd077f713543b0e1", + "max": 5452, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_77b9441f266c4b5e8386b421979a16fb", + "value": 5452 + } + }, + "4aa3e70244d440f9b3721795d2a40e8c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "544ee250905c493082aee7f67e80e300": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6063d7eff7904ed2a9b0971c877fa481": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "69a832e0f0984b2781e5c39099e06754": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6eeb2a57a28c4683bbb4b4b400854de0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4aa3e70244d440f9b3721795d2a40e8c", + "placeholder": "​", + "style": "IPY_MODEL_1152e8a4879640c5b0d7ac24272ab3d1", + "value": "Loading checkpoint shards: 100%" + } + }, + "77b9441f266c4b5e8386b421979a16fb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "913fb94ed8f444faa78d03b7cb808cbb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ba3dae16eb8241a7be40c435f1295e9f", + "IPY_MODEL_4a985c58e4b14ec08b8c719157cf2484", + "IPY_MODEL_12f821b2624f4c3ebff046214616a34f" + ], + "layout": "IPY_MODEL_1b5d5d69331c4d3785371f866b1b1373" + } + }, + "ba3dae16eb8241a7be40c435f1295e9f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6063d7eff7904ed2a9b0971c877fa481", + "placeholder": "​", + "style": "IPY_MODEL_460de5dac5ca4a3eb55d3808b06be495", + "value": "Map: 100%" + } + }, + "bc86b0bd0a0f450194565d7de1bbf78d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d3d830d36b8f4bb195bffe14058a2ccd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b0dbc597c4b41d993305c5ad6dfd5c2", + "placeholder": "​", + "style": "IPY_MODEL_544ee250905c493082aee7f67e80e300", + "value": " 39/39 [01:36<00:00, 2.01s/it]" + } + }, + "dcb0f4a390b047c5a3c4d80be8711084": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_26fea2af913c43179188483f40ecc959", + "max": 39, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_69a832e0f0984b2781e5c39099e06754", + "value": 39 + } + }, + "e0b21b13438d4d698cc61b09b541deb7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed78d6fe9e454a9285bffcf79eb9e52e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6eeb2a57a28c4683bbb4b4b400854de0", + "IPY_MODEL_dcb0f4a390b047c5a3c4d80be8711084", + "IPY_MODEL_d3d830d36b8f4bb195bffe14058a2ccd" + ], + "layout": "IPY_MODEL_0ec0881f6eb0436caceb052f66097b49" + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/src/model/notebook/finetune_llama2/README.md b/src/model/notebook/finetune_llama2/README.md new file mode 100644 index 0000000..0155336 --- /dev/null +++ b/src/model/notebook/finetune_llama2/README.md @@ -0,0 +1,5 @@ +# FineTune OpenThaiGPT Pipeline Notebook +This Notebook is for Fine-Tune Your Own Llama 2 Model with Custom Data + +And you can also use this link : https://colab.research.google.com/github/OpenThaiGPT/openthaigpt-pretraining/blob/main/src/model/notebook/finetune_llama2/OpenThaiGPT_FineTune_Llama.ipynb +to run this notebook in google colab. \ No newline at end of file diff --git a/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/constants.py b/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/constants.py new file mode 100644 index 0000000..478362e --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/constants.py @@ -0,0 +1,4 @@ +import os + +FILE_DIR = os.path.dirname(__file__) +OUTPUT_HF_DIR = f"{FILE_DIR}/merged_GPTJ_tokenizer_hf" diff --git a/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/merge.py b/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/merge.py new file mode 100644 index 0000000..9ece64f --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/merge.py @@ -0,0 +1,68 @@ +from transformers import PreTrainedTokenizerFast, GPT2TokenizerFast +import json +import os +from typing import Dict + + +def merge(tokenizer_dir_1, tokenizer_dir_2, merge_file_1, merge_file_2): + # load tokenizer + gptj_tokenizer = PreTrainedTokenizerFast.from_pretrained(tokenizer_dir_1) + gpt2_tokenizer = PreTrainedTokenizerFast.from_pretrained(tokenizer_dir_2) + + # retrieve the vocabs + gptj_vocab = gptj_tokenizer.get_vocab() + gpt2_vocab = gpt2_tokenizer.get_vocab() + + # create folder to keep new vocab and merge + folder_path = "./temp" + os.mkdir(folder_path) + + # Create a new vocabulary by merging vocabs + new_vocab: Dict[str, int] = {} + idx = 0 + for word in gptj_vocab.keys(): + if word not in new_vocab.keys(): + new_vocab[word] = gptj_vocab[word] + idx += 1 + + # Add words from second tokenizer + for word in gpt2_vocab.keys(): + if word not in new_vocab.keys(): + new_vocab[word] = idx + idx += 1 + + # convert dictionary to json + new_vocab_json = json.dumps(new_vocab, ensure_ascii=False) + + # write json to a file + vocab_file_path = os.path.join(folder_path, "merge_vocab.json") + + with open(vocab_file_path, "w", encoding="utf-8") as outfile: + outfile.write(new_vocab_json) + + # merge merged rule + merge_file_path = os.path.join(folder_path, "new_merged_rule.txt") + + with open(merge_file_1, "r", encoding="utf-8") as f1, open( + merge_file_2, "r", encoding="utf-8" + ) as f2, open(merge_file_path, "w", encoding="utf-8") as out_file: + # Ignore first line of each input file + next(f1) + next(f2) + + # Read the remaining lines of each file and write them to the output file + lines = set() + for line in f1: + if line not in lines: + out_file.write(line) + lines.add(line) + for line in f2: + if line not in lines: + out_file.write(line) + lines.add(line) + + merge_tokenizer = GPT2TokenizerFast( + vocab_file=vocab_file_path, merges_file=merge_file_path + ) + + return merge_tokenizer diff --git a/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/tokenizer.py b/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/tokenizer.py new file mode 100644 index 0000000..8502065 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/tokenizer.py @@ -0,0 +1,54 @@ +from transformers import PreTrainedTokenizerFast +from .merge import merge +from typing import Any, List, Union + + +class GPTJToken: + def __init__(self, tokenizer_dir): + self.tokenizer = PreTrainedTokenizerFast.from_pretrained(tokenizer_dir) + + def tokenize(self, x: str) -> List[Any]: + return self.tokenizer.tokenize(x) + + def encode(self, x: str) -> List[Any]: + return self.tokenizer.encode(x) + + def decode(self, x: Union[int, List[int]]) -> str: + return self.tokenizer.decode(x) + + +class GPT2Token: + def __init__(self, tokenizer_dir): + self.tokenizer = PreTrainedTokenizerFast.from_pretrained(tokenizer_dir) + + def tokenize(self, x: str) -> List[Any]: + return self.tokenizer.tokenize(x) + + def encode(self, x: str) -> List[Any]: + return self.tokenizer.encode(x) + + def decode(self, x: Union[int, List[int]]) -> str: + return self.tokenizer.decode(x) + + +class MergedToken: + def __init__(self, tokenizer_dir_1, tokenizer_dir_2, merge_file_1, merge_file_2): + self.tokenizer = merge( + tokenizer_dir_1, tokenizer_dir_2, merge_file_1, merge_file_2 + ) + + def tokenize(self, x: str) -> List[Any]: + return self.tokenizer.tokenize(x) + + def encode(self, x: str) -> List[Any]: + return self.tokenizer.encode(x) + + def decode(self, x: Union[int, List[int]]) -> str: + return self.tokenizer.decode(x) + + +# text = "รายละเอียดและหลักเกณฑ์การคัดเลือก AI Startup Incubation by AIEAT" +# tokens = MergedToken() +# print(tokens.tokenize(text)) +# print(tokens.encode(text)) +# print([tokens.decode([token]) for token in tokens.encode(text)]) diff --git a/src/model/openthaigpt_pretraining_model/__init__.py b/src/model/openthaigpt_pretraining_model/__init__.py new file mode 100644 index 0000000..a137771 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/__init__.py @@ -0,0 +1,2 @@ +"""Top-level package for OpenThaiGPT Model.""" +__version__ = "0.1.0" diff --git a/src/model/openthaigpt_pretraining_model/data_wrapper.py b/src/model/openthaigpt_pretraining_model/data_wrapper.py new file mode 100644 index 0000000..0cc90c7 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/data_wrapper.py @@ -0,0 +1,87 @@ +import torch +from torch.utils.data import IterableDataset +from torch.nn.functional import pad +from datasets import load_from_disk +import os +from typing import Optional + + +HF_TOKENIZER_INPUT_IDS_NAME = "input_ids" + + +class DatasetWrapper(IterableDataset): + def __init__( + self, + tokenizer, + dataset, + max_tokens: int = 256, + text_column_name: str = "text", + ): + """ + Args: + tokenizer: hf tokenizer + dataset: hf dataset which has [{text_column_name: "example"}, ...] + structure. + text_column_name: Column name which contain text data. + """ + self.tokenizer = tokenizer + self.dataset = dataset + self.max_tokens = max_tokens + self.text_column_name = text_column_name + + def __iter__(self): + buffer = [] + iter_dataset = self.dataset + + for sample in iter_dataset: + buffer += self.tokenizer(sample[self.text_column_name])[ + HF_TOKENIZER_INPUT_IDS_NAME + ] + while len(buffer) > self.max_tokens: + yield { + HF_TOKENIZER_INPUT_IDS_NAME: torch.tensor(buffer[: self.max_tokens]) + } + buffer = buffer[self.max_tokens :] + + +def tokenize_function(tokenizer, max_tokens): + def tokenize(data): + outputs = tokenizer(data["text"]) + result_list = [] + # Iterate over each sublist and extend the result list with sublist elements + for sublist in outputs[HF_TOKENIZER_INPUT_IDS_NAME]: + result_list.extend(sublist) + result_list.append( + tokenizer.eos_token_id + ) # Insert 0 between sublist elements + # desired_dim_2 = 4 # Desired size along the second dimension + padding_value = tokenizer.eos_token_id # Number to use for padding + input_tensor = torch.Tensor(result_list).long() + # Determine the size of the first dimension based on desired_dim_2 + desired_dim_1 = -(-input_tensor.size(0) // max_tokens) # Round up division + # Pad the input tensor if necessary + padded_tensor = pad( + input_tensor, + (0, desired_dim_1 * max_tokens - input_tensor.size(0)), + value=padding_value, + ) + # Reshape the padded tensor + reshaped_tensor = padded_tensor.reshape(desired_dim_1, max_tokens) + + return {HF_TOKENIZER_INPUT_IDS_NAME: reshaped_tensor} + + return tokenize + + +def load_token_dataset(dataset_path: str, num_shards: int, split: Optional[str] = None): + if split is None: + split = "train" + + file_path = os.path.join( + dataset_path, + split, + ) + dataset = load_from_disk(file_path) + dataset = dataset.to_iterable_dataset(num_shards=num_shards) + + return dataset.with_format("torch") diff --git a/src/model/openthaigpt_pretraining_model/datasets/__init__.py b/src/model/openthaigpt_pretraining_model/datasets/__init__.py new file mode 100644 index 0000000..4f60679 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/datasets/__init__.py @@ -0,0 +1,29 @@ +from datasets import load_dataset, load_from_disk +from .constants import DATASET_ARGS + + +def get_dataset(config): + dataset_args = DATASET_ARGS.get(config.dataset_name, None) # type: ignore + if isinstance(config.dataset_name, dict): + dataset_args = config.dataset_name + elif isinstance(config.dataset_name, str) and not dataset_args: + dataset_args = {"path": config.dataset_name} + else: + raise NotImplementedError(f"No dataset name {config.dataset_name}") + + if config.from_disk: + dataset = load_from_disk( + config.dataset_name, + ) + if config.split is not None: + dataset = dataset[config.split] + else: + dataset = load_dataset( + **dataset_args, + split=config.split, + streaming=config.streaming, + ) + + if config.shuffle: + dataset = dataset.shuffle(buffer_size=config.buffer_size) + return dataset diff --git a/src/model/openthaigpt_pretraining_model/datasets/constants.py b/src/model/openthaigpt_pretraining_model/datasets/constants.py new file mode 100644 index 0000000..7b2c4d2 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/datasets/constants.py @@ -0,0 +1,16 @@ +C4_DATASET = "c4" +MC4_DATASET = "mc4" + +DATASET_ARGS = { + C4_DATASET: { + "path": "c4", + "name": "en", + }, + MC4_DATASET: { + "path": "mc4", + "languages": ["th"], + }, +} + +SPLIT_TRAIN = "train" +SPLIT_VAL = "eval" diff --git a/src/model/openthaigpt_pretraining_model/dpo/002-dpo-temp-0_x.ipynb b/src/model/openthaigpt_pretraining_model/dpo/002-dpo-temp-0_x.ipynb new file mode 100644 index 0000000..7d56b22 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/dpo/002-dpo-temp-0_x.ipynb @@ -0,0 +1,499 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ea02269f-749c-4022-9f8b-7d9c99c07405", + "metadata": { + "deletable": true, + "editable": true, + "frozen": false + }, + "source": [ + "# Finetune with DPO with inference data with Temperature 0.0" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cdafbcce-525d-464d-bbc9-da30a6e5041b", + "metadata": {}, + "outputs": [], + "source": [ + "# common\n", + "\n", + "# common imports\n", + "import sys\n", + "from pathlib import Path\n", + "from typing import Any, Callable, Dict, Literal, Optional, Protocol, Tuple, List\n", + "\n", + "import json\n", + "\n", + "sys.path.insert(0, \"/workspace/code\")\n", + "from otgpt_hft.data_model.serial.store import Store\n", + "from otgpt_hft.data_model.serial.entry import SerializedEntry\n", + "from otgpt_hft.data_model.source import OAnnoSource\n", + "\n", + "\n", + "# common paths\n", + "data_dir = Path(\"/workspace/data\")" + ] + }, + { + "cell_type": "markdown", + "id": "59d91024-052b-4f15-8f20-43feba1949fa", + "metadata": { + "deletable": true, + "editable": true, + "frozen": false + }, + "source": [ + "## Train Data Prep" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "662de641-ebf5-4f69-aeb5-ac40d289e632", + "metadata": {}, + "outputs": [], + "source": [ + "# Load data store\n", + "dataset_name = \"Thaweewat-oasst1_th\"\n", + "split = \"train\"\n", + "\n", + "data_split_dir = data_dir / f\"store/{dataset_name}/{split}\"\n", + "store = Store(SerializedEntry, data_split_dir)\n", + "await store.load_chunks()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "34afffe3-bf6f-47eb-a06f-cbf53fc3b304", + "metadata": {}, + "outputs": [], + "source": [ + "temp = 0.3\n", + "temp_f = str(temp).replace(\".\", \"_\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4a938eee-13c8-428b-9f28-aaf4591ff76e", + "metadata": {}, + "outputs": [], + "source": [ + "# temp = 0.9\n", + "# temp_f = str(temp).replace(\".\", \"_\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "06577ef9-552a-4856-9166-faba03e5083e", + "metadata": {}, + "outputs": [], + "source": [ + "# Load inference\n", + "raw_infer_path = data_dir/f\"inference/llama2-7b-finetune-hf/Thaweewat-oasst1_th/train/temp-{temp_f}.jsonl\"\n", + "\n", + "with open(raw_infer_path) as file:\n", + " raw_inference = [json.loads(e) for e in file.read().splitlines()]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "121d46b2-dd2d-4352-9f58-4e58f13db0fc", + "metadata": {}, + "outputs": [], + "source": [ + "# inference output is after END_OF_INSTRUCT markup\n", + "END_OF_INSTRUCT = \"[/INST]\"\n", + "EOI_OFFSET = len(END_OF_INSTRUCT)\n", + "\n", + "def extract_model_output_after_instruct(infer_out: str):\n", + " assert infer_out.count(END_OF_INSTRUCT) == 1\n", + " infer_out_no_prompt = infer_out[infer_out.index(END_OF_INSTRUCT) + EOI_OFFSET:]\n", + " return infer_out_no_prompt\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5926f785-6e7f-4fa8-9bbb-605816de80dc", + "metadata": {}, + "outputs": [], + "source": [ + "# prep training data as dict\n", + "training_entries: List[Dict[str,str]] = []\n", + "\n", + "for raw_infer in raw_inference:\n", + " entry_id = raw_infer[\"id\"]\n", + "\n", + " # get inference\n", + " infer_out = raw_infer[\"out\"]\n", + " infer_out_no_prompt = extract_model_output_after_instruct(infer_out)\n", + " \n", + " # get relavent data entry in store\n", + " s_entry = store.get(entry_id)\n", + " \n", + " prompt = s_entry.prompt.get_utt()\n", + " \n", + " for utt in s_entry.utterance:\n", + " # SKIP `utt` NOT part of reference annotation\n", + " if not isinstance(utt.source, OAnnoSource):\n", + " continue\n", + "\n", + " good = utt.get_utt()\n", + "\n", + " train_entry = {\n", + " \"prompt\": prompt,\n", + " \"good\": good,\n", + " \"bad\": infer_out_no_prompt,\n", + " }\n", + " training_entries.append(train_entry)" + ] + }, + { + "cell_type": "markdown", + "id": "d1cae115-0db4-4c54-8aac-edbf7532301b", + "metadata": {}, + "source": [ + "### Data Inspection" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e2a44a24-894a-4abf-9dd9-1c5c9014bf8c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAGwCAYAAAC99fF4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2n0lEQVR4nO3de1RVdf7/8ddBBEEFQoIjCURJKomXcNRT1jRJorKcSuZbmRdyWDkZNiplDjNmpRlmM3YbxJlZpvUdzXLGmsnlDdE0R7yR5jVSs7DkQOQIXhKQs39/9HN/Pbk1PQIH6PlYa6/F3p/P2fv9+TjEa/b57HNshmEYAgAAgBsfbxcAAADQGBGSAAAALBCSAAAALBCSAAAALBCSAAAALBCSAAAALBCSAAAALPh6u4DGwOVy6ejRo2rbtq1sNpu3ywEAAJfBMAydOHFCkZGR8vGp+/s+hCRJR48eVVRUlLfLAAAAHjhy5Ig6dOhQ5+clJElq27atpO8nOSgoyMvVAACAy1FZWamoqCjz73hdIyRJ5ltsQUFBhCQAAJqY+loqw8JtAAAAC4QkAAAAC4QkAAAAC4QkAAAAC4QkAAAAC4QkAAAAC4QkAAAAC4QkAAAAC40mJM2cOVM2m00TJkwwj505c0YZGRlq166d2rRpo9TUVJWWlrq9rri4WCkpKQoMDFR4eLgmTZqks2fPNnD1AACguWkUIWnbtm36y1/+om7durkdnzhxoj744AMtWbJE69ev19GjRzV06FCzvba2VikpKaqurtamTZv05ptvasGCBZo6dWpDDwEAADQzXg9JJ0+e1PDhw/W3v/1N11xzjXm8oqJC8+bN0+zZs3XXXXcpMTFR8+fP16ZNm7R582ZJ0urVq7Vv3z79/e9/V48ePTRo0CBNnz5dOTk5qq6uvug1q6qqVFlZ6bYBAACcz+shKSMjQykpKUpKSnI7XlhYqJqaGrfjnTt3VnR0tAoKCiRJBQUFSkhIUEREhNknOTlZlZWV2rt370WvmZ2dreDgYHOLioqq41EBAICmzqshafHixfr444+VnZ19QZvT6ZSfn59CQkLcjkdERMjpdJp9zg9I59rPtV1MVlaWKioqzO3IkSNXORIAANDc+HrrwkeOHNH48eOVl5enVq1aNei1/f395e/v36DXBAAATYvXQlJhYaHKysp0yy23mMdqa2u1YcMG/fnPf9aqVatUXV2t48ePu91NKi0tld1ulyTZ7XZt3brV7bznnn4716cpKC4uVnl5+SX7hIWFKTo6uoEqAgAAXgtJ/fv31+7du92OjR49Wp07d9bkyZMVFRWlli1bKj8/X6mpqZKkoqIiFRcXy+FwSJIcDodmzJihsrIyhYeHS5Ly8vIUFBSk+Pj4hh2Qh4qLi9W5Sxd9d/r0JfsFBAbq0/37CUoAADQQr4Wktm3bqmvXrm7HWrdurXbt2pnH09PTlZmZqdDQUAUFBenxxx+Xw+FQ3759JUkDBgxQfHy8Ro4cqVmzZsnpdGrKlCnKyMhoMm+nlZeX67vTp3X/87kKj42z7FN2+IDenTJW5eXlhCQAABqI10LS5Xj55Zfl4+Oj1NRUVVVVKTk5WXPmzDHbW7RooWXLlmns2LFyOBxq3bq10tLSNG3aNC9W7Znw2Dhd16W7t8sAAAD/X6MKSR9++KHbfqtWrZSTk6OcnJyLviYmJkbLly+v58oAAMBPjdc/JwkAAKAxIiQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABYICQBAABY8GpIys3NVbdu3RQUFKSgoCA5HA6tWLHCbL/zzjtls9nctkcffdTtHMXFxUpJSVFgYKDCw8M1adIknT17tqGHAgAAmhlfb168Q4cOmjlzpuLi4mQYht58803dc8892rFjh26++WZJ0iOPPKJp06aZrwkMDDR/rq2tVUpKiux2uzZt2qSSkhKNGjVKLVu21AsvvNDg4wEAAM2HV0PSkCFD3PZnzJih3Nxcbd682QxJgYGBstvtlq9fvXq19u3bpzVr1igiIkI9evTQ9OnTNXnyZD377LPy8/Or9zEAAIDmqdGsSaqtrdXixYt16tQpORwO8/jChQsVFhamrl27KisrS6dPnzbbCgoKlJCQoIiICPNYcnKyKisrtXfv3oteq6qqSpWVlW4bAADA+bx6J0mSdu/eLYfDoTNnzqhNmzZ6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KDAwUOHh4Zo0aZLOnj3bkEMBAADNjK83L75+/XplZGToZz/7mc6ePavf//73GjBggPbt26fWrVub/R555BFNmzbN3A8MDDR/rq2tVUpKiux2uzZt2qSSkhKNGjVKLVu21AsvvNCg4wEAAM2HV0PSypUr3fYXLFig8PBwFRYW6o477jCPBwYGym63W55j9erV2rdvn9asWaOIiAj16NFD06dP1+TJk/Xss8/Kz8+vXscAAACap0a1JqmiokKSFBoa6nZ84cKFCgsLU9euXZWVlaXTp0+bbQUFBUpISFBERIR5LDk5WZWVldq7d6/ldaqqqlRZWem2AQAAnM+rd5LO53K5NGHCBN12223q2rWrefyhhx5STEyMIiMjtWvXLk2ePFlFRUVaunSpJMnpdLoFJEnmvtPptLxWdna2nnvuuXoaCQAAaA4aTUjKyMjQnj17tHHjRrfjY8aMMX9OSEhQ+/bt1b9/fx06dEg33nijR9fKyspSZmamuV9ZWamoqCjPCgcAAM1So3i7bdy4cVq2bJnWrVunDh06XLJvnz59JEkHDx6UJNntdpWWlrr1Obd/sXVM/v7+CgoKctsAAADO59WQZBiGxo0bp/fee09r165VbGzsj75m586dkqT27dtLkhwOh3bv3q2ysjKzT15enoKCghQfH18vdQMAgObPq2+3ZWRkaNGiRfrXv/6ltm3bmmuIgoODFRAQoEOHDmnRokUaPHiw2rVrp127dmnixIm644471K1bN0nSgAEDFB8fr5EjR2rWrFlyOp2aMmWKMjIy5O/v783hAQCAJsyjO0mff/55nVw8NzdXFRUVuvPOO9W+fXtze+eddyRJfn5+WrNmjQYMGKDOnTvriSeeUGpqqj744APzHC1atNCyZcvUokULORwOjRgxQqNGjXL7XCUAAIAr5dGdpI4dO+rnP/+50tPT9atf/UqtWrXy6OKGYVyyPSoqSuvXr//R88TExGj58uUe1QAAAGDFoztJH3/8sbp166bMzEzZ7Xb95je/0datW+u6NgAAAK/xKCT16NFDr776qo4ePao33nhDJSUl6tevn7p27arZs2frm2++qes6AQAAGtRVPd3m6+uroUOHasmSJXrxxRd18OBBPfnkk4qKitKoUaNUUlJSV3UCAAA0qKsKSdu3b9djjz2m9u3ba/bs2XryySd16NAh5eXl6ejR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Y8eOafjw4QoKClJISIjS09N18uTJBhwFAABojrwakk6dOqXu3bsrJyfHsn3WrFl67bXXNHfuXG3ZskWtW7dWcnKyzpw5Y/YZPny49u7dq7y8PC1btkwbNmzQmDFjGmoIAACgmfL15sUHDRqkQYMGWbYZhqFXXnlFU6ZM0T333CNJeuuttxQREaH3339fDz74oPbv36+VK1dq27Zt6tWrlyTp9ddf1+DBg/XHP/5RkZGRDTYWAADQvDTaNUmHDx+W0+lUUlKSeSw4OFh9+vRRQUGBJKmgoEAhISFmQJKkpKQk+fj4aMuWLRc9d1VVlSorK902AACA8zXakOR0OiVJERERbscjIiLMNqfTqfDwcLd2X19fhYaGmn2sZGdnKzg42NyioqLquHoAANDUNdqQVJ+ysrJUUVFhbkeOHPF2SQAAoJFptCHJbrdLkkpLS92Ol5aWmm12u11lZWVu7WfPntWxY8fMPlb8/f0VFBTktgEAAJyv0Yak2NhY2e125efnm8cqKyu1ZcsWORwOSZLD4dDx48dVWFho9lm7dq1cLpf69OnT4DUDAIDmw6tPt508eVIHDx409w8fPqydO3cqNDRU0dHRmjBhgp5//nnFxcUpNjZWTz/9tCIjI3XvvfdKkrp06aKBAwfqkUce0dy5c1VTU6Nx48bpwQcf5Mk2AABwVbwakrZv365f/OIX5n5mZqYkKS0tTQsWLNBTTz2lU6dOacyYMTp+/Lj69eunlStXqlWrVuZrFi5cqHHjxql///7y8fFRamqqXnvttQYfCwAAaF68GpLuvPNOGYZx0XabzaZp06Zp2rRpF+0TGhqqRYsW1Ud5AADgJ6zRrkkCAADwJkISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABUISAACABV9vF4C6tX///ku2h4WFKTo6uoGqAQCg6SIkNRMnyktl8/HRiBEjLtkvIDBQn+7fT1ACAOBHEJKaie9OVMpwuXT/87kKj42z7FN2+IDenTJW5eXlhCQAAH4EIamZCY+N03Vdunu7DAAAmjwWbgMAAFgg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rerTp4+WLl2q++6776L9bDabpkyZounTp0uSTp06pTZt2mjFihUaOHCg5WvGjRsnp9Opf/zjH5K+v5O0cuVKFRcXm2+zLV26VKNHj9ZXX32ltm3b1vHoADQVvN0GoNG5kv/v1q1bN/Pn1q1bKygoSGVlZeaxnJwcJSYm6tprr1WbNm3017/+VcXFxW7nSEhIcFuHdPfddysmJkY33HCDRo4cqYULF+r06dNXMSIATREhCUCjExcXJ5vNdlmLs1u2bOm2b7PZ5HK5JEmLFy/Wk08+qfT0dK1evVo7d+7U6NGjVV1d7faaH76l17ZtW3388cd6++231b59e02dOlXdu3fX8ePHr25gAJoUQhKARic0NFTJycnKycnRqVOnLmi/3LDyn//8R7feeqsee+wx9ezZUx07dtShQ4cu67W+vr5KSkrSrFmztGvXLn3xxRdau3btlQwDQBNHSALQKOXk5Ki2tla9e/fWP//5Tx04cED79+/Xa6+9JofDcVnniIuL0/bt27Vq1Sp99tlnevrpp7Vt27Yffd2yZcv02muvaefOnfryyy/11ltvyeVymU++Afhp4Ok2AI3SDTfcoI8//lgzZszQE088oZKSEl177bVKTExUbm7uZZ3jN7/5jXbs2KEHHnhANptNw4YN02OPPaYVK1Zc8nUhISFaunSpnn32WZ05c0ZxcXF6++23dfPNN9fF0AA0ETzdBgAAYIG32wAAACwQkgAAACwQkgAAACwQkgAAACwQkgAAACwQkgAAACwQkgAAACwQkgAAACwQkgAAACwQkgAAACwQkgAAACz8PzCEDQl36qZFAAAAAElFTkSuQmCC", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# check to see prompt length will fit?\n", + "# [ANS] yes\n", + "# Training context window in 2K tokens, prompt are at most 1.2K characters\n", + "\n", + "prompt_len = []\n", + "for e in training_entries:\n", + " prompt_len.append(len(e[\"prompt\"]))\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Generate random data for the histogram\n", + "# data = np.random.randn(1000)\n", + "\n", + "# Plotting a basic histogram\n", + "plt.hist(prompt_len, bins=50, color='skyblue', edgecolor='black')\n", + "\n", + "# Adding labels and title\n", + "plt.xlabel('Chars')\n", + "plt.ylabel('Frequency')\n", + "\n", + "# Display the plot\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ac056772-62a3-4e56-b777-4f0ea6a1afd0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "984" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(training_entries)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c0cd2def-6121-4565-8002-0fc174895986", + "metadata": {}, + "outputs": [], + "source": [ + "output_path = data_dir / f\"training/temp-{temp_f}-v-all-ref.jsonl\"" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "7419958b-56f5-4f08-8bb2-9ea784cd0822", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PosixPath('/workspace/data/training/temp-0_9-v-all-ref.jsonl')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output_path" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ca5045be-7d75-4044-9767-5a503762e60c", + "metadata": {}, + "outputs": [], + "source": [ + "# save data into training format\n", + "\n", + "with open(output_path, \"w\") as file:\n", + " for entry in training_entries:\n", + " file.write(json.dumps(entry, ensure_ascii=False))\n", + " file.write(\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "2b2f83e7-a6f1-4d0f-a9ff-a307a947e9f6", + "metadata": { + "editable": true, + "frozen": false + }, + "source": [ + "## Training \n", + "\n", + "Training notes" + ] + }, + { + "cell_type": "markdown", + "id": "4e3ab7b8-82d1-4bec-8679-c2ab967b0a2f", + "metadata": {}, + "source": [ + "#### Temp 0.3" + ] + }, + { + "cell_type": "markdown", + "id": "ef848262-da36-4e25-9ddd-e26301604fbe", + "metadata": { + "editable": true, + "frozen": false + }, + "source": [ + "```\n", + "source 002-001-dpo-temp-0_3-v-all-ref.sh\n", + "```\n", + "\n", + "./wandb/offline-run-20240202_185047-emgq05qy/logs\n", + "\n", + "Bellow are evaluation at every 2 steps\n", + "```\n", + "{'eval_loss': 0.3782382905483246, 'eval_runtime': 22.7648, 'eval_samples_per_second': 4.349, 'eval_steps_per_second': 4.349, 'eval_rewards/chosen': 0.17204105854034424, 'eval_rewards/rejected': -5.762171745300293, 'eval_rewards/accuracies': 0.6565656661987305, 'eval_rewards/margins': 5.934212684631348, 'eval_logps/rejected': -212.18138122558594, 'eval_logps/chosen': -155.55233764648438, 'eval_logits{'eval_loss': 0.1804571896791458, 'eval_runtime': 22.8754, 'eval_samples_per_second': 4.328, 'eval_steps_per_second': 4.328, 'eval_rewards/chosen': 2.144317865371704, 'eval_rewards/rejected': -12.926628112792969, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.07094669342041, 'eval_logps/rejected': -283.825927734375, 'eval_logps/chosen': -135.82958984375, 'eval_logits/rejected': -2.265436887741089, 'eval_logits/chosen': -2.2085320949554443, 'epoch': 1.73}\n", + "{'eval_loss': 0.18257048726081848, 'eval_runtime': 22.8651, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 2.0242137908935547, 'eval_rewards/rejected': -13.299287796020508, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.323501586914062, 'eval_logps/rejected': -287.55255126953125, 'eval_logps/chosen': -137.03062438964844, 'eval_logits/rejected': -2.281282901763916, 'eval_logits/chosen': -2.257986068725586, 'epoch': 2.02}\n", + "{'eval_loss': 0.18308402597904205, 'eval_runtime': 22.8626, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 1.7377803325653076, 'eval_rewards/rejected': -13.790324211120605, 'eval_rewards/accuracies': 0.7676767706871033, 'eval_rewards/margins': 15.528104782104492, 'eval_logps/rejected': -292.462890625, 'eval_logps/chosen': -139.8949432373047, 'eval_logits/rejected': -2.2867624759674072, 'eval_logits/chosen': -2.2792067527770996, 'epoch': 2.31}\n", + "{'eval_loss': 0.18331560492515564, 'eval_runtime': 22.8673, 'eval_samples_per_second': 4.329, 'eval_steps_per_second': 4.329, 'eval_rewards/chosen': 1.6265597343444824, 'eval_rewards/rejected': -13.981979370117188, 'eval_rewards/accuracies': 0.7676767706871033, 'eval_rewards/margins': 15.608540534973145, 'eval_logps/rejected': -294.37945556640625, 'eval_logps/chosen': -141.0071563720703, 'eval_logits/rejected': -2.265042304992676, 'eval_logits/chosen': -2.231825113296509, 'epoch': 2.59}\n", + "{'loss': 0.1446, 'learning_rate': 5.000000000000003e-06, 'rewards/chosen': 2.9057955741882324, 'rewards/rejected': -14.417503356933594, 'rewards/accuracies': 0.7917187809944153, 'rewards/margins': 17.323299407958984, 'logps/rejected': -290.21917724609375, 'logps/chosen': -154.30982971191406, 'logits/rejected': -2.409827947616577, 'logits/chosen': -2.435296058654785, 'epoch': 2.88}\n", + "{'eval_loss': 0.18342168629169464, 'eval_runtime': 22.8663, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 1.5728603601455688, 'eval_rewards/rejected': -14.05177116394043, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.624629974365234, 'eval_logps/rejected': -295.0773620605469, 'eval_logps/chosen': -141.54415893554688, 'eval_logits/rejected': -2.2794528007507324, 'eval_logits/chosen': -2.270761251449585, 'epoch': 2.88}\n", + "\n", + "{'eval_loss': 0.1804571896791458, 'eval_runtime': 22.8754, 'eval_samples_per_second': 4.328, 'eval_steps_per_second': 4.328, 'eval_rewards/chosen': 2.144317865371704, 'eval_rewards/rejected': -12.926628112792969, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.07094669342041, 'eval_logps/rejected': -283.825927734375, 'eval_logps/chosen': -135.82958984375, 'eval_logits/rejected': -2.265436887741089, 'eval_logits/chosen': -2.2085320949554443, 'epoch': 1.73}\n", + "{'eval_loss': 0.18257048726081848, 'eval_runtime': 22.8651, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 2.0242137908935547, 'eval_rewards/rejected': -13.299287796020508, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.323501586914062, 'eval_logps/rejected': -287.55255126953125, 'eval_logps/chosen': -137.03062438964844, 'eval_logits/rejected': -2.281282901763916, 'eval_logits/chosen': -2.257986068725586, 'epoch': 2.02}\n", + "{'eval_loss': 0.18308402597904205, 'eval_runtime': 22.8626, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 1.7377803325653076, 'eval_rewards/rejected': -13.790324211120605, 'eval_rewards/accuracies': 0.7676767706871033, 'eval_rewards/margins': 15.528104782104492, 'eval_logps/rejected': -292.462890625, 'eval_logps/chosen': -139.8949432373047, 'eval_logits/rejected': -2.2867624759674072, 'eval_logits/chosen': -2.2792067527770996, 'epoch': 2.31}\n", + "{'eval_loss': 0.18331560492515564, 'eval_runtime': 22.8673, 'eval_samples_per_second': 4.329, 'eval_steps_per_second': 4.329, 'eval_rewards/chosen': 1.6265597343444824, 'eval_rewards/rejected': -13.981979370117188, 'eval_rewards/accuracies': 0.7676767706871033, 'eval_rewards/margins': 15.608540534973145, 'eval_logps/rejected': -294.37945556640625, 'eval_logps/chosen': -141.0071563720703, 'eval_logits/rejected': -2.265042304992676, 'eval_logits/chosen': -2.231825113296509, 'epoch': 2.59}\n", + "{'loss': 0.1446, 'learning_rate': 5.000000000000003e-06, 'rewards/chosen': 2.9057955741882324, 'rewards/rejected': -14.417503356933594, 'rewards/accuracies': 0.7917187809944153, 'rewards/margins': 17.323299407958984, 'logps/rejected': -290.21917724609375, 'logps/chosen': -154.30982971191406, 'logits/rejected': -2.409827947616577, 'logits/chosen': -2.435296058654785, 'epoch': 2.88}\n", + "{'eval_loss': 0.18342168629169464, 'eval_runtime': 22.8663, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 1.5728603601455688, 'eval_rewards/rejected': -14.05177116394043, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.624629974365234, 'eval_logps/rejected': -295.0773620605469, 'eval_logps/chosen': -141.54415893554688, 'eval_logits/rejected': -2.2794528007507324, 'eval_logits/chosen': -2.270761251449585, 'epoch': 2.88}\n", + "{'eval_loss': 0.18257048726081848, 'eval_runtime': 22.8651, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 2.0242137908935547, 'eval_rewards/rejected': -13.299287796020508, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.323501586914062, 'eval_logps/rejected': -287.55255126953125, 'eval_logps/chosen': -137.03062438964844, 'eval_logits/rejected': -2.281282901763916, 'eval_logits/chosen': -2.257986068725586, 'epoch': 2.02}\n", + "{'eval_loss': 0.18308402597904205, 'eval_runtime': 22.8626, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 1.7377803325653076, 'eval_rewards/rejected': -13.790324211120605, 'eval_rewards/accuracies': 0.7676767706871033, 'eval_rewards/margins': 15.528104782104492, 'eval_logps/rejected': -292.462890625, 'eval_logps/chosen': -139.8949432373047, 'eval_logits/rejected': -2.2867624759674072, 'eval_logits/chosen': -2.2792067527770996, 'epoch': 2.31}\n", + "{'eval_loss': 0.18331560492515564, 'eval_runtime': 22.8673, 'eval_samples_per_second': 4.329, 'eval_steps_per_second': 4.329, 'eval_rewards/chosen': 1.6265597343444824, 'eval_rewards/rejected': -13.981979370117188, 'eval_rewards/accuracies': 0.7676767706871033, 'eval_rewards/margins': 15.608540534973145, 'eval_logps/rejected': -294.37945556640625, 'eval_logps/chosen': -141.0071563720703, 'eval_logits/rejected': -2.265042304992676, 'eval_logits/chosen': -2.231825113296509, 'epoch': 2.59}\n", + "{'loss': 0.1446, 'learning_rate': 5.000000000000003e-06, 'rewards/chosen': 2.9057955741882324, 'rewards/rejected': -14.417503356933594, 'rewards/accuracies': 0.7917187809944153, 'rewards/margins': 17.323299407958984, 'logps/rejected': -290.21917724609375, 'logps/chosen': -154.30982971191406, 'logits/rejected': -2.409827947616577, 'logits/chosen': -2.435296058654785, 'epoch': 2.88}\n", + "{'eval_loss': 0.18342168629169464, 'eval_runtime': 22.8663, 'eval_samples_per_second': 4.33, 'eval_steps_per_second': 4.33, 'eval_rewards/chosen': 1.5728603601455688, 'eval_rewards/rejected': -14.05177116394043, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.624629974365234, 'eval_logps/rejected': -295.0773620605469, 'eval_logps/chosen': -141.54415893554688, 'eval_logits/rejected': -2.2794528007507324, 'eval_logits/chosen': -2.270761251449585, 'epoch': 2.88}\n", + "{'eval_loss': 0.18370915949344635, 'eval_runtime': 22.8707, 'eval_samples_per_second': 4.329, 'eval_steps_per_second': 4.329, 'eval_rewards/chosen': 1.5577466487884521, 'eval_rewards/rejected': -14.084894180297852, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.642640113830566, 'eval_logps/rejected': -295.4085693359375, 'eval_logps/chosen': -141.69529724121094, 'eval_logit{'eval_loss': 0.18370915949344635, 'eval_runtime': 22.8707, 'eval_samples_per_second': 4.329, 'eval_steps_per_second': 4.329, 'eval_rewards/chosen': 1.5577466487884521, 'eval_rewards/rejected': -14.084894180297852, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.642640113830566, 'eval_logps/rejected': -295.4085693359375, 'eval_logps/chosen': -141.69529724121094, 'eval_logits/rejected': -2.2741928100585938, 'eval_logits/chosen': -2.254714012145996, 'epoch': 3.17}\n", + "{'eval_loss': 0.18353240191936493, 'eval_runtime': 22.8536, 'eval_samples_per_second': 4.332, 'eval_steps_per_second': 4.332, 'eval_rewards/chosen': 1.5713255405426025, 'eval_rewards/rejected': -14.084232330322266, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.655559539794922, 'eval_logps/rejected': -295.4019775390625, 'eval_logps/chosen': -141.5594940185547, 'eval_logits/rejected': -2.2800614833831787, 'eval_logits/chosen': -2.269023895263672, 'epoch': 3.46}\n", + "{'eval_loss': 0.18386158347129822, 'eval_runtime': 22.8511, 'eval_samples_per_second': 4.332, 'eval_steps_per_second': 4.332, 'eval_rewards/chosen': 1.562206506729126, 'eval_rewards/rejected': -14.094626426696777, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.656834602355957, 'eval_logps/rejected': -295.5059509277344, 'eval_logps/chosen': -141.65069580078125, 'eval_logits/rejected': -2.275632381439209, 'eval_logits/chosen': -2.255336046218872, 'epoch': 3.75}\n", + "{'eval_loss': 0.18382926285266876, 'eval_runtime': 22.829, 'eval_samples_per_second': 4.337, 'eval_steps_per_second': 4.337, 'eval_rewards/chosen': 1.5691990852355957, 'eval_rewards/rejected': -14.0812406539917, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.65043830871582, 'eval_logps/rejected': -295.3720397949219, 'eval_logps/chosen': -141.58078002929688, 'eval_logits/rejected': -2.2705047130584717, 'eval_logits/chosen': -2.2465403079986572, 'epoch': 4.04}\n", + "{'loss': 0.1495, 'learning_rate': 0.0, 'rewards/chosen': 2.5688283443450928, 'rewards/rejected': -15.60143756866455, 'rewards/accuracies': 0.784375011920929, 'rewards/margins': 18.170263290405273, 'logps/rejected': -306.6189880371094, 'logps/chosen': -159.20986938476562, 'logits/rejected': -2.418408155441284, 'logits/chosen': -2.4488136768341064, 'epoch': 4.32}\n", + "{'eval_loss': 0.18365532159805298, 'eval_runtime': 22.8213, 'eval_samples_per_second': 4.338, 'eval_steps_per_second': 4.338, 'eval_rewards/chosen': 1.5621469020843506, 'eval_rewards/rejected': -14.078760147094727, 'eval_rewards/accuracies': 0.7575757503509521, 'eval_rewards/margins': 15.64090633392334, 'eval_logps/rejected': -295.3472595214844, 'eval_logps/chosen': -141.6512908935547, 'eval_logits/rejected': -2.277946710586548, 'eval_logits/chosen': -2.2629146575927734, 'epoch': 4.32}\n", + "{'train_runtime': 3674.4337, 'train_samples_per_second': 1.204, 'train_steps_per_second': 0.008, 'train_loss': 0.21332887013753254, 'epoch': 4.32}\n", + "\n", + "wandb: \n", + "wandb: Run history:\n", + "wandb: eval/logits/chosen ▆▃▁▂▄█▆▄▇▅▆▅▆▆▅\n", + "wandb: eval/logits/rejected █▄▁▂▃▅▄▄▅▄▅▄▅▅▅\n", + "wandb: eval/logps/chosen ▁▄▇█▇▇▆▆▅▅▅▅▅▅▅\n", + "wandb: eval/logps/rejected █▆▅▄▂▂▂▁▁▁▁▁▁▁▁\n", + "wandb: eval/loss █▂▁▁▁▁▁▁▁▁▁▁▁▁▁\n", + "wandb: eval/rewards/accuracies ▁██▇█▇▇██▇▇▇▇▇▇\n", + "wandb: eval/rewards/chosen ▁▄▇█▇▇▆▆▅▅▅▅▅▅▅\n", + "wandb: eval/rewards/margins ▁▄▅▆▇██████████\n", + "wandb: eval/rewards/rejected █▆▅▄▂▂▂▁▁▁▁▁▁▁▁\n", + "wandb: eval/runtime ▁▆▆▇▇█▇▇▇▇█▇▆▅▅\n", + "wandb: eval/samples_per_second █▃▂▂▂▁▂▂▁▂▁▂▂▄▄\n", + "wandb: eval/steps_per_second █▃▂▂▂▁▂▂▁▂▁▂▂▄▄\n", + "wandb: train/epoch ▁▂▂▂▃▃▄▄▅▅▅▅▆▇▇████\n", + "wandb: train/global_step ▁▁▂▃▃▃▃▄▅▅▅▅▆▇▇▇███\n", + "wandb: train/learning_rate █▃▁\n", + "wandb: train/logits/chosen ▁█▆\n", + "wandb: train/logits/rejected ▁█▇\n", + "wandb: train/logps/chosen ▁█▅\n", + "wandb: train/logps/rejected █▂▁\n", + "wandb: train/loss █▁▁\n", + "wandb: train/rewards/accuracies ▁█▇\n", + "wandb: train/rewards/chosen ▁█▅\n", + "wandb: train/rewards/margins ▁▇█\n", + "wandb: train/rewards/rejected █▂▁\n", + "wandb: train/total_flos ▁\n", + "wandb: train/train_loss ▁\n", + "wandb: train/train_runtime ▁\n", + "wandb: train/train_samples_per_second ▁\n", + "wandb: train/train_steps_per_second ▁\n", + "wandb: \n", + "wandb: Run summary:\n", + "wandb: eval/logits/chosen -2.26291\n", + "wandb: eval/logits/rejected -2.27795\n", + "wandb: eval/logps/chosen -141.65129\n", + "wandb: eval/logps/rejected -295.34726\n", + "wandb: eval/loss 0.18366\n", + "wandb: eval/rewards/accuracies 0.75758\n", + "wandb: eval/rewards/chosen 1.56215\n", + "wandb: eval/rewards/margins 15.64091\n", + "wandb: eval/rewards/rejected -14.07876\n", + "wandb: eval/runtime 22.8213\n", + "wandb: eval/samples_per_second 4.338\n", + "wandb: eval/steps_per_second 4.338\n", + "wandb: train/epoch 4.32\n", + "wandb: train/global_step 30\n", + "wandb: train/learning_rate 0.0\n", + "wandb: train/logits/chosen -2.44881\n", + "wandb: train/logits/rejected -2.41841\n", + "wandb: train/logps/chosen -159.20987\n", + "wandb: train/logps/rejected -306.61899\n", + "wandb: train/loss 0.1495\n", + "wandb: train/rewards/accuracies 0.78438\n", + "wandb: train/rewards/chosen 2.56883\n", + "wandb: train/rewards/margins 18.17026\n", + "wandb: train/rewards/rejected -15.60144\n", + "wandb: train/total_flos 0.0\n", + "wandb: train/train_loss 0.21333\n", + "wandb: train/train_runtime 3674.4337\n", + "wandb: train/train_samples_per_second 1.204\n", + "wandb: train/train_steps_per_second 0.008\n", + "wandb: \n", + "```\n", + "output to `model/dpo/002-001-dpo-temp-0_3-v-all-ref` \n", + "wandb: offline-run-20240202_185047-emgq05qy\n", + "\n", + "\n", + "Eval loss \n", + "```\n", + "0.3782382905483246 (02) <--keep\n", + "0.1804571896791458 (04) <--keep, best\n", + "0.18257048726081848 (06) <--keep\n", + "0.18308402597904205\n", + "0.18331560492515564\n", + "0.18342168629169464\n", + "0.18257048726081848 (14) <--keep\n", + "0.18308402597904205\n", + "0.18331560492515564\n", + "0.18342168629169464\n", + "0.18370915949344635\n", + "0.18353240191936493\n", + "0.18386158347129822 (26)\n", + "0.18382926285266876 (28)\n", + "0.18365532159805298 (30)\n", + "```\n", + "Most promising checkpoint is 04 `model/dpo/002-001-dpo-temp-0_3-v-all-ref/checkpoint-4`\n", + "\n", + "Checkpoints to keep 2, 4, 6, 14" + ] + }, + { + "cell_type": "markdown", + "id": "34edaba0-960f-4b70-a2a6-5a15a2ae73cc", + "metadata": {}, + "source": [ + "#### Temp 0.9" + ] + }, + { + "cell_type": "markdown", + "id": "c15118c8-4d48-42bc-a40e-0adefefae041", + "metadata": {}, + "source": [ + "```\n", + "source 002-002-dpo-temp-0_9-v-all-ref.sh | tee 002-002-dpo-temp-0_9-v-all-ref.log\n", + "```\n", + "\n", + "```\n", + "0.5552696585655212 (02)\n", + "0.4190722703933716 (04)\n", + "0.34669235348701477 (06)\n", + "0.32439282536506653 (08)\n", + "0.3202556371688843 (10) <-- best\n", + "0.3211551606655121 (12)\n", + "```\n", + "\n", + "Most promising checkpoint is 10 `model/dpo/002-002-dpo-temp-0_9-v-all-ref/checkpoint-10`" + ] + }, + { + "cell_type": "markdown", + "id": "5990560d-8f08-4116-ae32-fbc1a1444bce", + "metadata": {}, + "source": [ + "# EOF" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19f90897-115e-47f7-aef9-f8a722077dca", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/model/openthaigpt_pretraining_model/dpo/finetune_dpo_full.py b/src/model/openthaigpt_pretraining_model/dpo/finetune_dpo_full.py new file mode 100644 index 0000000..0ccf0f1 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/dpo/finetune_dpo_full.py @@ -0,0 +1,193 @@ +import argparse +import json +import os +from dataclasses import dataclass, field +from typing import Dict, Optional + +import torch +from datasets import Dataset, load_dataset +from peft import LoraConfig +from transformers import ( + AutoModelForCausalLM, + AutoTokenizer, + BitsAndBytesConfig, + HfArgumentParser, + TrainingArguments, +) +from trl import DPOTrainer + +parser = argparse.ArgumentParser() +parser.add_argument("--data_path", type=str, default="merge.jsonl") +parser.add_argument("--epoch", type=int, default=2) +parser.add_argument("--eval_steps", type=int, default=200) +# parser.add_argument("--flash_attn", action='store_true', default=False) +parser.add_argument("--gradient_accumulation_steps", type=int, default=4) +parser.add_argument("--gradient_checkpointing", action="store_true", default=False) +# parser.add_argument("--lora_r", type=int, default=8) +parser.add_argument("--lr", type=float, default=1e-5) +parser.add_argument("--max_len", type=int, default=1024) +parser.add_argument("--max_prompt_len", type=int, default=256) +parser.add_argument("--micro_bsz", type=int, default=2) +parser.add_argument("--model_path", type=str, default="decapoda-research/llama-7b-hf") +# parser.add_argument("--num_warmup_steps", type=int, default=100) +parser.add_argument("--output_path", type=str, default="lora-Vicuna") +# parser.add_argument("--peft", action="store_true", default=False) +parser.add_argument("--save_steps", type=int, default=200) +# parser.add_argument("--tensorboard_name", type=str, default="run") +parser.add_argument("--val_size", type=float, default=0.1) +# parser.add_argument("--tokenizer_path", type=str, required=True) +# parser.add_argument("--wandb", action="store_true", default=False) +parser.add_argument("--wandb_name", type=str, default="OTG") +parser.add_argument("--warmup_steps", type=int, default=0) + +args = parser.parse_args() + +os.environ["WANDB_MODE"] = "offline" +os.environ["WANDB_PROJECT"] = args.wandb_name + + +# -------- prompt ----------------------------------------------------------------- +def generate_prompt_and_responses(data_point): + system_prompt = "You are a question answering assistant. Answer the question as truthful and helpful as possible คุณคือผู้ช่วยตอบคำถาม จงตอบคำถามอย่างถูกต้องและมีประโยชน์ที่สุด" + # This function masks out the labels for the input, + # so that our loss is computed only on the response. + data_point["input"] = ( + "" # the jsonl file doesn't have 'input' field, so add here to avoid key error below + ) + user_prompt = ( + ( + f"""[INST] <> +{system_prompt} +<> + +{data_point['prompt']}###{data_point['input']} [/INST]""" + ) + if data_point["input"] != "" + else ( + f"""[INST] <> +{system_prompt} +<> + +{data_point['prompt']} [/INST]""" + ) + ) + return { + "prompt": user_prompt, + "chosen": data_point["good"] + "", + "rejected": data_point["bad"] + "", + } + + +# --------------------------------------------------------------------------------- + +# -------- model ------------------------------------------------------------------ +model = AutoModelForCausalLM.from_pretrained( + args.model_path, + low_cpu_mem_usage=True, + torch_dtype=torch.bfloat16, + device_map="cuda:0", + attn_implementation="flash_attention_2", + # quantization_config=BitsAndBytesConfig( + # load_in_4bit=True, + # bnb_4bit_compute_dtype=torch.bfloat16, + # bnb_4bit_use_double_quant=True, + # bnb_4bit_quant_type="nf4", + # ), +) +model.config.use_cache = False + +model_ref = AutoModelForCausalLM.from_pretrained( + args.model_path, + low_cpu_mem_usage=True, + torch_dtype=torch.bfloat16, + device_map="cuda:0", + attn_implementation="flash_attention_2", + quantization_config=BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_compute_dtype=torch.bfloat16, + bnb_4bit_use_double_quant=True, + bnb_4bit_quant_type="nf4", + ), +) +tokenizer = AutoTokenizer.from_pretrained(args.model_path) +tokenizer.pad_token = tokenizer.eos_token + +# --------------------------------------------------------------------------------- + +# -------- data ------------------------------------------------------------------- +# need this block because some decoding error in the data +list_of_dicts = [] + +with open(args.data_path, "r") as file: + for line in file: + try: # some of the lines have json decoding error + data = json.loads(line) + list_of_dicts.append(data) + except: + continue + +data = Dataset.from_list(list_of_dicts) + +train_val = data.train_test_split(test_size=args.val_size, shuffle=True, seed=42) + +train_data = train_val["train"].shuffle().map(generate_prompt_and_responses) +val_data = train_val["test"].shuffle().map(generate_prompt_and_responses) +# --------------------------------------------------------------------------------- + + +# peft_config = LoraConfig( +# r=args.lora_r, +# lora_alpha=args.lora_r * 2, +# lora_dropout=0.05, +# target_modules=[ +# "q_proj", +# "v_proj", +# "k_proj", +# "out_proj", +# "fc_in", +# "fc_out", +# "wte", +# ], +# bias="none", +# task_type="CAUSAL_LM", +# ) + +# https://github.com/huggingface/trl/issues/831#issuecomment-1792611218 +training_args = TrainingArguments( + bf16=True, + eval_steps=args.eval_steps, + evaluation_strategy="steps", + gradient_accumulation_steps=args.gradient_accumulation_steps, + gradient_checkpointing=args.gradient_checkpointing, + gradient_checkpointing_kwargs={"use_reentrant": False}, + learning_rate=args.lr, + logging_steps=10, + lr_scheduler_type="cosine", + num_train_epochs=args.epoch, + optim="paged_adamw_32bit", + output_dir=args.output_path, + per_device_eval_batch_size=1, + per_device_train_batch_size=args.micro_bsz, + remove_unused_columns=False, + report_to="wandb", + save_steps=args.save_steps, + warmup_steps=args.warmup_steps, +) + +# 5. initialize the DPO trainer +dpo_trainer = DPOTrainer( + model, + model_ref, + args=training_args, + beta=0.1, + train_dataset=train_data, + eval_dataset=val_data, + tokenizer=tokenizer, + # peft_config=peft_config, + max_prompt_length=args.max_prompt_len, + max_length=args.max_len, +) + +# 6. train +dpo_trainer.train() +dpo_trainer.save_model(args.output_path) diff --git a/src/model/openthaigpt_pretraining_model/dpo/readme.md b/src/model/openthaigpt_pretraining_model/dpo/readme.md new file mode 100644 index 0000000..f53f55f --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/dpo/readme.md @@ -0,0 +1 @@ +Use with container from `docker/dpo/Dockerfile` \ No newline at end of file diff --git a/src/model/openthaigpt_pretraining_model/lightning/constants.py b/src/model/openthaigpt_pretraining_model/lightning/constants.py new file mode 100644 index 0000000..7c2382a --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/lightning/constants.py @@ -0,0 +1,3 @@ +DEFAULT_DATASET_NAME = "c4" +LLAMA_MODEL = "decapoda-research/llama-7b-hf" +GPTJ_MODEL = "EleutherAI/gpt-j-6B" diff --git a/src/model/openthaigpt_pretraining_model/lightning/utils.py b/src/model/openthaigpt_pretraining_model/lightning/utils.py new file mode 100644 index 0000000..f108a67 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/lightning/utils.py @@ -0,0 +1,269 @@ +from tqdm import tqdm +import lightning as L +import torch +from torch.utils.data import DataLoader + +from ..utils import compute_perplexity +from ..data_wrapper import ( + DatasetWrapper, + load_token_dataset, + HF_TOKENIZER_INPUT_IDS_NAME, +) +from ..datasets import get_dataset +from ..optimizers import get_optimizer +from ..models import load_model_and_tokenizer, load_lora + +from lightning.fabric.strategies import DeepSpeedStrategy +import wandb +import math +import os + +# os.environ["WANDB_API_KEY"] = "" +os.environ["WANDB_MODE"] = "offline" + + +class Trainer: + def __init__( + self, + configuration, + ): + if torch.cuda.get_device_name(0) == "NVIDIA A100-SXM4-40GB": + torch.set_float32_matmul_precision("medium") # high + training_configuration = configuration.training + self.model_name = configuration.model.name + self.wandb = None + self.max_tokens = training_configuration.max_tokens + self.seed = training_configuration.seed + self.grad = training_configuration.grad + strategy = training_configuration.strategy + self.epochs = training_configuration.epochs + self.start_epochs = training_configuration.start_epochs + self.start_steps = training_configuration.start_steps + self.eval_steps = training_configuration.eval_steps + self.global_steps = 0 + self.save_steps = training_configuration.save_steps + self.save_paths = training_configuration.save_paths + self.deepspeed = False + if strategy == "deepspeed": + self.deepspeed = True + strategy = DeepSpeedStrategy( + stage=training_configuration.stage, + offload_optimizer=training_configuration.offload_optimizer, + offload_parameters=training_configuration.offload_parameters, + ) + strategy.config[ + "gradient_clipping" + ] = training_configuration.gradient_clipping + elif ( + training_configuration.offload_optimizer + or training_configuration.offload_parameters + ): + raise NotImplementedError("offload only support for deepspeed strategy") + self.fabric = L.Fabric( + accelerator=training_configuration.accelerator, + strategy=strategy, + devices=training_configuration.num_gpus, + precision=training_configuration.precision, + loggers=self.wandb, + num_nodes=training_configuration.num_nodes, + ) + self.fabric.launch() + print(f"device:{self.fabric.device}") + if self.fabric.global_rank == 0: + self.wandb = wandb.init(project="Fabric") + + with self.fabric.device: + self.tokenizer, self.model = load_model_and_tokenizer( + configuration.model, + ) + + if configuration.get("lora", None) is not None: + self.model = load_lora( + self.model, + configuration.lora, + self.model_name, + ) + if configuration.dataset.tokenized.path is None: + train_dataset = get_dataset(configuration.dataset.train) + val_dataset = get_dataset(configuration.dataset.eval) + self.dataset = DatasetWrapper( + self.tokenizer, train_dataset, self.max_tokens + ) + self.dataset_val = DatasetWrapper( + self.tokenizer, val_dataset, self.max_tokens + ) + else: + self.dataset = load_token_dataset( + dataset_path=configuration.dataset.tokenized.path, + num_shards=training_configuration.num_shards, + split=configuration.dataset.tokenized.train_split, + ) + self.dataset_val = load_token_dataset( + dataset_path=configuration.dataset.tokenized.path, + num_shards=training_configuration.num_shards, + split=configuration.dataset.tokenized.eval_split, + ) + self.dataloader = DataLoader( + self.dataset, + batch_size=training_configuration.batch_size, + num_workers=training_configuration.num_workers, + ) + self.dataloader_val = DataLoader( + self.dataset_val, batch_size=training_configuration.batch_size + ) + self.model, self.opt = get_optimizer( + model=self.model, + optimizer_configuration=configuration.optimizer, + batch_size=training_configuration.batch_size, + offload_optimizer=training_configuration.offload_optimizer, + offload_parameters=training_configuration.offload_parameters, + ) + self.model, self.opt = self.fabric.setup(self.model, self.opt) + if training_configuration.get("load_weight_path", False): + self.load_checkpoint(training_configuration.load_weight_path) + self.fabric.print( + f"loading weight from {training_configuration.load_weight_path} success" + ) + + self.dataloader = self.fabric.setup_dataloaders(self.dataloader) + self.dataloader_val = self.fabric.setup_dataloaders(self.dataloader_val) + + self.decay_lr = training_configuration.decay_lr + self.warmup_iters = training_configuration.warmup_iters + self.lr_decay_iters = training_configuration.lr_decay_iters + self.min_lr = training_configuration.min_lr + self.learning_rate = configuration.optimizer.hyps.lr + + def log(self, data): + if self.wandb is not None: + self.wandb.log(data) + + def get_lr(self, it): + # 1) linear warmup for warmup_iters steps + if it < self.warmup_iters: + return self.learning_rate * it / self.warmup_iters + # 2) if it > lr_decay_iters, return min learning rate + if it > self.lr_decay_iters: + return self.min_lr + # 3) in between, use cosine decay down to min learning rate + decay_ratio = (it - self.warmup_iters) / ( + self.lr_decay_iters - self.warmup_iters + ) + assert 0 <= decay_ratio <= 1 + coeff = 0.5 * (1.0 + math.cos(math.pi * decay_ratio)) # coeff ranges 0..1 + return self.min_lr + coeff * (self.learning_rate - self.min_lr) + + def save_checkpoint(self, step, epoch): + if self.deepspeed: + self.fabric.save( + f"{self.save_paths}/{self.model_name}_{epoch}_{step}", + { + "model": self.model, + "_optimizer": self.opt, + "_global_steps": self.global_steps, + "local_step": step, + "epoch": epoch, + }, + ) + else: + self.fabric.save( + f"{self.save_paths}/{self.model_name}_{epoch}_{step}.pt", + { + "model_state_dict": self.model.state_dict(), + "optimizer_state_dict": self.opt.state_dict(), + "_global_steps": self.global_steps, + "local_step": step, + "epoch": epoch, + }, + ) + self.fabric.barrier() + + def load_checkpoint(self, path): + if self.deepspeed: + state = { + "model": self.model, + "_optimizer": self.opt, + "_global_steps": self.global_steps, + "epoch": self.start_epochs, + "local_step": self.start_steps, + } + + self.fabric.load(path, state) + + self.start_epochs = state["epoch"] + self.start_steps = state["local_step"] + self.global_steps = state["_global_steps"] + else: + checkpoint = torch.load(path) + with self.fabric.device: + self.model.load_state_dict(checkpoint["model_state_dict"]) + self.opt.load_state_dict(checkpoint["optimizer_state_dict"]) + self.start_epochs = checkpoint.get("epoch", 0) + self.start_steps = checkpoint.get("local_step", 0) + self.global_steps = checkpoint.get("_global_steps", 0) + + self.fabric.barrier() + + def train_step(self, batch): + inputs = batch[HF_TOKENIZER_INPUT_IDS_NAME] + loss = self.model(inputs, labels=inputs).loss + return loss + + def val_step(self): + self.model.eval() + progress_bar = tqdm(self.dataloader_val, disable=(self.fabric.global_rank != 0)) + with torch.no_grad(): + for i, batch in enumerate(progress_bar): + inputs = batch[HF_TOKENIZER_INPUT_IDS_NAME] + loss = self.model(inputs, labels=inputs).loss + perplexity = compute_perplexity(loss) + self.log({"val_loss": loss.item(), "val_perplexity": perplexity}) + progress_bar.set_description(f"loss_val: {loss.item():.3f}") + self.model.train() + self.fabric.barrier() + return (loss, perplexity) + + def train(self): + self.opt.zero_grad() + for epoch in range(self.start_epochs, self.epochs): + progress_bar = tqdm(self.dataloader, disable=(self.fabric.global_rank != 0)) + for i, batch in enumerate(progress_bar): + if i < self.start_steps and epoch == self.start_epochs: + continue + self.global_steps += 1 + + if self.decay_lr: + lr = self.get_lr(self.global_steps) + else: + lr = self.learning_rate + for param_group in self.opt.param_groups: + param_group["lr"] = lr + + is_accumulating = (i + 1) % self.grad != 0 + + with self.fabric.no_backward_sync(self.model, enabled=is_accumulating): + loss = self.train_step(batch) + self.fabric.backward(loss) + perplexity = compute_perplexity(loss) + self.log( + {"train_loss": loss.item(), "train_perplexity": perplexity} + ) + progress_bar.set_description(f"loss: {loss.item():.3f}") + + if not is_accumulating: + self.opt.step() + self.opt.zero_grad() + + if (i + 1) % self.eval_steps == 0: + (val_loss, perplexity) = self.val_step() + self.fabric.print( + f"val_loss: {val_loss.item():.3f}, " + f"perplexity: {perplexity:.3f})" + ) + + if (i + 1) % self.save_steps == 0: + self.fabric.print(f"Saving weights : {self.save_paths}") + self.save_checkpoint(i + 1, epoch) + + if self.fabric.global_rank == 0: + self.wandb.finish() diff --git a/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/__init__.py b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/__init__.py new file mode 100644 index 0000000..a137771 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/__init__.py @@ -0,0 +1,2 @@ +"""Top-level package for OpenThaiGPT Model.""" +__version__ = "0.1.0" diff --git a/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/merge.py b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/merge.py new file mode 100644 index 0000000..12163bc --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/merge.py @@ -0,0 +1,32 @@ +from transformers import LlamaTokenizer +from sentencepiece import sentencepiece_model_pb2 as sp_pb2_model +import sentencepiece as spm + + +def merge(llama_tokenizer_dir, thai_sp_model_dir, get_spm_tokenizer=False): + llama_tokenizer = LlamaTokenizer.from_pretrained(llama_tokenizer_dir) + thai_sp_model = spm.SentencePieceProcessor() + thai_sp_model.Load(thai_sp_model_dir) + + llama_spm = sp_pb2_model.ModelProto() + llama_spm.ParseFromString(llama_tokenizer.sp_model.serialized_model_proto()) + thai_spm = sp_pb2_model.ModelProto() + thai_spm.ParseFromString(thai_sp_model.serialized_model_proto()) + + llama_spm_tokens = {p.piece for p in llama_spm.pieces} + + for p in thai_spm.pieces: + piece = p.piece + if piece not in llama_spm_tokens: + new_p = sp_pb2_model.ModelProto().SentencePiece() + new_p.piece = piece + new_p.score = 0.0 + llama_spm.pieces.append(new_p) + + if get_spm_tokenizer: + return llama_spm + + llama_tokenizer.sp_model = spm.SentencePieceProcessor( + model_proto=llama_spm.SerializeToString() + ) + return llama_tokenizer diff --git a/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/thai_tokenizer/.gitignore b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/thai_tokenizer/.gitignore new file mode 100644 index 0000000..21d7a91 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/thai_tokenizer/.gitignore @@ -0,0 +1 @@ +trained_bpe.model diff --git a/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/thai_tokenizer/trained_bpe.model.dvc b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/thai_tokenizer/trained_bpe.model.dvc new file mode 100644 index 0000000..fc0eeab --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/thai_tokenizer/trained_bpe.model.dvc @@ -0,0 +1,4 @@ +outs: +- md5: c1919a2ae9d78990df3d96170345dd43 + size: 736711 + path: trained_bpe.model diff --git a/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/tokenizer.py b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/tokenizer.py new file mode 100644 index 0000000..ad72571 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/llama_thai_tokenizer/tokenizer.py @@ -0,0 +1,30 @@ +from transformers import LlamaTokenizer +from .merge import merge + + +class LLaMaToken: + def __init__(self, llama_tokenizer_dir): + self.token = LlamaTokenizer.from_pretrained(llama_tokenizer_dir) + + def tokenize(self, x: str) -> str: + return self.token.tokenize(x) + + def decode(self, x: str) -> str: + return self.token.decode(x) + + def encode(self, x: str) -> str: + return self.token.encode(x) + + +class EngThaiLLaMaToken: + def __init__(self, llama_tokenizer_dir, thai_sp_model_dir): + self.token = merge(llama_tokenizer_dir, thai_sp_model_dir) + + def tokenize(self, x: str) -> str: + return self.token.tokenize(x) + + def decode(self, x: str) -> str: + return self.token.decode(x) + + def encode(self, x: str) -> str: + return self.token.encode(x) diff --git a/src/model/openthaigpt_pretraining_model/models/__init__.py b/src/model/openthaigpt_pretraining_model/models/__init__.py new file mode 100644 index 0000000..25c2091 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/__init__.py @@ -0,0 +1,75 @@ +from .constants import ( + TOKENIZERS, + MODELS, + MODEL_CONFIGS, + LORA_MODEL, +) +from peft import LoraConfig, get_peft_model + + +def load_model_and_tokenizer(model_config): + tokenizer = load_tokenizer(model_config.tokenizer) + model = load_model(model_config, tokenizer) + return tokenizer, model + + +def load_model(model_config, tokenizer=None): + model_config_object = MODEL_CONFIGS.get(model_config.name, None) + if model_config_object is None: + raise NotImplementedError(f"No model name: {model_config.name}") + model_object = MODELS.get(model_config.name, None) + if model_object is None: + raise NotImplementedError(f"No model name: {model_config.name}") + + model_pretrained = model_config.pretrained_model_name_or_path + + if model_pretrained is None: + model_config_args = model_config.args + if tokenizer is not None: + model_config_args = { + **model_config_args, + "vocab_size": len(tokenizer), + "bos_token_id": tokenizer.bos_token_id, + "eos_token_id": tokenizer.eos_token_id, + "pad_token_id": tokenizer.pad_token_id, + } + config = model_config_object( + **model_config.args, + ) + model = model_object(config) + else: + config = model_config_object( + **model_config.args, + ) + model = model_object.from_pretrained(model_pretrained, config=config) + if tokenizer is not None and model.vocab_size != len(tokenizer): + model.resize_token_embeddings(len(tokenizer)) + + model_size = sum(t.numel() for t in model.parameters()) + print(f"model size: {model_size/1000**2:.1f}M parameters") + model_size = sum(p.numel() for p in model.parameters() if p.requires_grad) + print(f"model size requires_grad: {model_size/1000**2:.1f}M parameters") + return model + + +def load_tokenizer(tokenizer_config): + tokenizer_object = TOKENIZERS.get(tokenizer_config.tokenizer_class, None) + if tokenizer_object is None: + raise NotImplementedError( + f"No tokenizer name: {tokenizer_config.tokenizer_class}" + ) + tokenizer = tokenizer_object.from_pretrained( + tokenizer_config.pretrained_model_name_or_path + ) + return tokenizer + + +def load_lora(model, lora_config, model_name): + lora_support = LORA_MODEL.get(model_name, False) + if lora_support is False: + raise NotImplementedError(f"No lora_avaiable for {model_name}") + lora_config = lora_config.lora + lora_config = LoraConfig(**lora_config) + model = get_peft_model(model, lora_config) + + return model diff --git a/src/model/openthaigpt_pretraining_model/models/constants.py b/src/model/openthaigpt_pretraining_model/models/constants.py new file mode 100644 index 0000000..d25757c --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/constants.py @@ -0,0 +1,31 @@ +from transformers import AutoTokenizer, LlamaTokenizer, LlamaConfig, GPTJConfig +from .falcon.model import RWForCausalLMwithCheckpointing +from .falcon.configuration_RW import RWConfig +from .llama.model import LLaMAArgs, LLaMA +from .llama_hf.model import LlamaForCausalLMWithCheckpointing +from .gptj.gptj_model_xformers import GPTJForCausalLMWithCheckpointing + +TOKENIZERS = { + "AutoTokenizer": AutoTokenizer, + "LlamaTokenizer": LlamaTokenizer, +} + +MODELS = { + "falcon": RWForCausalLMwithCheckpointing, # type: ignore + "llama_hf": LlamaForCausalLMWithCheckpointing, + "gptj": GPTJForCausalLMWithCheckpointing, + "llama": LLaMA, +} + +MODEL_CONFIGS = { + "falcon": RWConfig, + "llama_hf": LlamaConfig, + "gptj": GPTJConfig, + "llama": LLaMAArgs, +} +LORA_MODEL = { + "llama_hf": True, + "gptj": True, + "falcon": True, + "llama": False, +} diff --git a/src/model/openthaigpt_pretraining_model/models/falcon/README.MD b/src/model/openthaigpt_pretraining_model/models/falcon/README.MD new file mode 100644 index 0000000..9ce37b8 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/falcon/README.MD @@ -0,0 +1,24 @@ +# Falcon model + +## How to use + +```python +import torch +from transformers import AutoTokenizer +from openthaigpt_pretraining_model.models.falcon.model import RWForCausalLM + +model_name = "tiiuae/falcon-7b" +device = "cuda" + +tokenizer = AutoTokenizer.from_pretrained(model_name, torch_dtype=torch.float16) +model = RWForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16) +model.to(device) + +text = "Q: Hi, how are you?\nA:" +encoding = tokenizer(text, return_tensors="pt") +del encoding["token_type_ids"] +encoding = {k: v.to(device) for k, v in encoding.items()} + +output = model.generate(**encoding, max_length=200, eos_token_id=tokenizer.eos_token_id) +print(tokenizer.decode(output[0])) +``` diff --git a/src/model/openthaigpt_pretraining_model/models/falcon/configuration_RW.py b/src/model/openthaigpt_pretraining_model/models/falcon/configuration_RW.py new file mode 100644 index 0000000..7ac6180 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/falcon/configuration_RW.py @@ -0,0 +1,82 @@ +# Copied from https://huggingface.co/tiiuae/falcon-7b/blob/main/configuration_RW.py +# coding=utf-8 +# Copyright 2022 the Big Science Workshop and HuggingFace Inc. team. All rights reserved. # noqa: E501 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" Bloom configuration""" +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + + +class RWConfig(PretrainedConfig): + model_type = "RefinedWebModel" + keys_to_ignore_at_inference = ["past_key_values"] + attribute_map = { + "num_hidden_layers": "n_layer", + "num_attention_heads": "n_head", + } + + def __init__( + self, + vocab_size=250880, + hidden_size=64, + n_layer=2, + n_head=8, + layer_norm_epsilon=1e-5, + initializer_range=0.02, + use_cache=True, + bos_token_id=1, + eos_token_id=2, + apply_residual_connection_post_layernorm=False, + hidden_dropout=0.0, + attention_dropout=0.0, + multi_query=False, + alibi=False, + bias=False, + parallel_attn=False, + **kwargs, + ): + self.vocab_size = vocab_size + # Backward compatibility with n_embed kwarg + n_embed = kwargs.pop("n_embed", None) + self.hidden_size = hidden_size if n_embed is None else n_embed + self.n_layer = n_layer + self.n_head = n_head + self.layer_norm_epsilon = layer_norm_epsilon + self.initializer_range = initializer_range + self.use_cache = use_cache + self.apply_residual_connection_post_layernorm = ( + apply_residual_connection_post_layernorm + ) + self.hidden_dropout = hidden_dropout + self.attention_dropout = attention_dropout + + self.bos_token_id = bos_token_id + self.eos_token_id = eos_token_id + self.multi_query = multi_query + self.alibi = alibi + self.bias = bias + self.parallel_attn = parallel_attn + + super().__init__(bos_token_id=bos_token_id, eos_token_id=eos_token_id, **kwargs) + + @property + def head_dim(self): + return self.hidden_size // self.n_head + + @property + def rotary(self): + return not self.alibi diff --git a/src/model/openthaigpt_pretraining_model/models/falcon/model.py b/src/model/openthaigpt_pretraining_model/models/falcon/model.py new file mode 100644 index 0000000..e64e1bf --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/falcon/model.py @@ -0,0 +1,1542 @@ +# Copied from https://huggingface.co/tiiuae/falcon-7b/blob/main/modelling_RW.py +# port of models described in RW +# We use the bloom model as a starting point for these model. +# Please refer to the bloom models for usage instructions. + +import math +import warnings +from typing import Optional, Tuple, Union + +import torch +import torch.utils.checkpoint +from torch import nn +from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, LayerNorm, MSELoss +from torch.nn import functional as F + +from transformers.modeling_outputs import ( + BaseModelOutputWithPastAndCrossAttentions, + CausalLMOutputWithCrossAttentions, + QuestionAnsweringModelOutput, + SequenceClassifierOutputWithPast, + TokenClassifierOutput, +) +from transformers.modeling_utils import PreTrainedModel +from transformers.utils import logging +from .configuration_RW import RWConfig + +logger = logging.get_logger(__name__) + + +# NOTE(Hesslow): Unfortunately we did not fuse matmul and bias during training, this +# means that there's one additional quantization to bfloat16 between the operations. +# In order not to degrade the quality of our HF-port, we keep these characteristics +# in the final model. +class Linear(nn.Linear): + def forward(self, input: torch.Tensor) -> torch.Tensor: + ret = input @ self.weight.T + if self.bias is None: + return ret + else: + return ret + self.bias + + +# rotary pos emb helpers (torch.jit.script does not seem to support staticmethod...) +def rotate_half(x): + x1, x2 = x[..., : x.shape[-1] // 2], x[..., x.shape[-1] // 2 :] + return torch.cat( + (-x2, x1), dim=x1.ndim - 1 + ) # dim=-1 triggers a bug in torch < 1.8.0 + + +class RotaryEmbedding(torch.nn.Module): + """Implementation of RotaryEmbedding from GPT-NeoX. + This implementation is design to operate on queries and keys that are compatible with + [batch_size, n_heads_per_partition, seq_len, head_dim] (e.g. MinGPTAttention format). + """ # noqa: E501 + + def __init__( + self, + head_dim: int, + base=10000, + ): + super().__init__() + inv_freq = 1.0 / (base ** (torch.arange(0, head_dim, 2).float() / head_dim)) + self.register_buffer("inv_freq", inv_freq, persistent=False) + self.head_dim = head_dim + self.seq_len_cached = None + self.batch_size_cached = None + self.cos_cached: torch.Tensor | None = None # type: ignore + self.sin_cached: torch.Tensor | None = None # type: ignore + + def cos_sin( + self, + seq_len: int, + device="cuda", + dtype=torch.bfloat16, + ) -> torch.Tensor: + if seq_len != self.seq_len_cached: + self.seq_len_cached = seq_len # type: ignore + t = torch.arange(seq_len, device=device).type_as(self.inv_freq) # type: ignore # noqa: E501 + freqs = torch.einsum("i,j->ij", t, self.inv_freq) + emb = torch.cat((freqs, freqs), dim=-1).to(device) + + if dtype in [torch.float16, torch.bfloat16]: + emb = emb.float() + + self.cos_cached = emb.cos()[None, :, :] + self.sin_cached = emb.sin()[None, :, :] + + self.cos_cached = self.cos_cached.type(dtype) + self.sin_cached = self.sin_cached.type(dtype) + + return self.cos_cached, self.sin_cached # type: ignore + + def forward(self, q, k): + batch, seq_len, head_dim = q.shape + cos, sin = self.cos_sin(seq_len, q.device, q.dtype) + return (q * cos) + (rotate_half(q) * sin), (k * cos) + (rotate_half(k) * sin) + + +def _make_causal_mask( + input_ids_shape: torch.Size, device: torch.device, past_key_values_length: int +) -> torch.BoolTensor: + batch_size, target_length = input_ids_shape + mask = torch.empty( + (target_length, target_length + past_key_values_length), + dtype=torch.bool, + device=device, + ) + # ONNX doesn't support `torch.Tensor.triu` properly, thus we use this workaround + seq_ids = torch.arange(target_length, device=device) + mask[:, past_key_values_length:] = seq_ids[:, None] < seq_ids[None, :] + + if past_key_values_length > 0: + mask[:, :past_key_values_length] = False + + expanded_mask = mask[None, None, :, :].expand( + batch_size, 1, target_length, target_length + past_key_values_length + ) + return expanded_mask # type: ignore + + +def _expand_mask(mask: torch.Tensor, tgt_length: int) -> torch.BoolTensor: + batch_size, src_length = mask.shape + tgt_length = tgt_length if tgt_length is not None else src_length + + expanded_mask = ~(mask[:, None, None, :].to(torch.bool)) + return expanded_mask.expand(batch_size, 1, tgt_length, src_length) # type: ignore + + +def build_alibi_tensor( + attention_mask: torch.Tensor, num_heads: int, dtype: torch.dtype +) -> torch.Tensor: + batch_size, seq_length = attention_mask.shape + closest_power_of_2 = 2 ** math.floor(math.log2(num_heads)) + base = torch.tensor( + 2 ** (-(2 ** -(math.log2(closest_power_of_2) - 3))), + device=attention_mask.device, + dtype=torch.float32, + ) + powers = torch.arange( + 1, 1 + closest_power_of_2, device=attention_mask.device, dtype=torch.int32 + ) + slopes = torch.pow(base, powers) + + if closest_power_of_2 != num_heads: + extra_base = torch.tensor( + 2 ** (-(2 ** -(math.log2(2 * closest_power_of_2) - 3))), + device=attention_mask.device, + dtype=torch.float32, + ) + num_remaining_heads = min(closest_power_of_2, num_heads - closest_power_of_2) + extra_powers = torch.arange( + 1, + 1 + 2 * num_remaining_heads, + 2, + device=attention_mask.device, + dtype=torch.int32, + ) + slopes = torch.cat([slopes, torch.pow(extra_base, extra_powers)], dim=0) + + # Note: alibi will added to the attention bias that will be applied to the query, key product of attention # noqa: E501 + # => therefore alibi will have to be of shape (batch_size, num_heads, query_length, key_length) # noqa: E501 + # => here we set (batch_size=1, num_heads=num_heads, query_length=1, key_length=max_length) # noqa: E501 + # => the query_length dimension will then be broadcasted correctly + # This is more or less identical to T5's relative position bias: + # https://github.com/huggingface/transformers/blob/f681437203baa7671de3174b0fa583c349d9d5e1/src/transformers/models/t5/modeling_t5.py#L527 + arange_tensor = ((attention_mask.cumsum(dim=-1) - 1) * attention_mask)[:, None, :] + alibi = slopes[..., None].bfloat16() * arange_tensor + return alibi.reshape(batch_size * num_heads, 1, seq_length).to(dtype) + + +def dropout_add( + x: torch.Tensor, residual: torch.Tensor, prob: float, training: bool +) -> torch.Tensor: + out = F.dropout(x, p=prob, training=training) + out = residual + out + return out + + +class Attention(nn.Module): + def __init__(self, config: RWConfig): + super().__init__() + + self.hidden_size = config.hidden_size + self.num_heads = config.n_head + self.head_dim = self.hidden_size // self.num_heads + self.split_size = self.hidden_size + self.hidden_dropout = config.hidden_dropout + + if self.head_dim * self.num_heads != self.hidden_size: + raise ValueError( + f"`hidden_size` must be divisible by num_heads (got `hidden_size`: {self.hidden_size} and `num_heads`:" # noqa: E501 + f" {self.num_heads})." + ) + + self.maybe_rotary = ( + RotaryEmbedding(config.head_dim) if config.rotary else lambda q, k: (q, k) + ) + + # Layer-wise attention scaling + self.inv_norm_factor = 1.0 / math.sqrt(self.head_dim) + self.beta = self.inv_norm_factor + + self.query_key_value = Linear( + self.hidden_size, + 3 * self.hidden_size + if not config.multi_query + else (self.hidden_size + 2 * self.head_dim), + bias=config.bias, + ) + self.multi_query = config.multi_query + self.dense = Linear(self.hidden_size, self.hidden_size, bias=config.bias) + self.attention_dropout = nn.Dropout(config.attention_dropout) + self.num_kv = config.n_head if not self.multi_query else 1 + + def _split_heads( + self, fused_qkv: torch.Tensor + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """ + Split the last dimension into (num_heads, head_dim) without making any copies, results share same memory + storage as `fused_qkv` + Args: + fused_qkv (`torch.tensor`, *required*): [batch_size, seq_length, num_heads * 3 * head_dim] + Returns: + query: [batch_size, seq_length, num_heads, head_dim] key: [batch_size, seq_length, num_heads, head_dim] + value: [batch_size, seq_length, num_heads, head_dim] + """ # noqa: E501 + if not self.multi_query: + batch_size, seq_length, three_times_hidden_size = fused_qkv.shape + fused_qkv = fused_qkv.view( + batch_size, seq_length, self.num_heads, 3, self.head_dim + ) + return fused_qkv[..., 0, :], fused_qkv[..., 1, :], fused_qkv[..., 2, :] + else: + batch_size, seq_length, three_times_hidden_size = fused_qkv.shape + fused_qkv = fused_qkv.view( + batch_size, seq_length, self.num_heads + 2, self.head_dim + ) + return ( + fused_qkv[..., :-2, :], + fused_qkv[..., [-2], :], + fused_qkv[..., [-1], :], + ) + + def _merge_heads(self, x: torch.Tensor) -> torch.Tensor: + """ + Merge heads together over the last dimenstion + Args: + x: (`torch.tensor`, *required*): [batch_size * num_heads, seq_length, head_dim] + Returns: + torch.tensor: [batch_size, seq_length, num_heads * head_dim] + """ # noqa: E501 + # What we want to achieve is: + # batch_size * num_heads, seq_length, head_dim -> batch_size, seq_length, num_heads * head_dim # noqa: E501 + batch_size_and_num_heads, seq_length, _ = x.shape + batch_size = batch_size_and_num_heads // self.num_heads + + # First view to decompose the batch size + # batch_size * num_heads, seq_length, head_dim -> batch_size, num_heads, seq_length, head_dim # noqa: E501 + x = x.view(batch_size, self.num_heads, seq_length, self.head_dim) + + # batch_size, num_heads, seq_length, head_dim -> batch_size, seq_length, num_heads, head_dim # noqa: E501 + x = x.permute(0, 2, 1, 3) + + # batch_size, seq_length, num_heads, head_dim -> batch_size, seq_length, num_heads * head_dim # noqa: E501 + return x.reshape(batch_size, seq_length, self.num_heads * self.head_dim) + + def forward( + self, + hidden_states: torch.Tensor, + alibi: torch.Tensor, + attention_mask: torch.Tensor, + layer_past: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, + head_mask: Optional[torch.Tensor] = None, + use_cache: bool = False, + output_attentions: bool = False, + ): + fused_qkv = self.query_key_value( + hidden_states + ) # [batch_size, seq_length, 3 x hidden_size] + + # 3 x [batch_size, seq_length, num_heads, head_dim] + (query_layer, key_layer, value_layer) = self._split_heads(fused_qkv) + + batch_size, q_length, _, _ = query_layer.shape + + query_layer = query_layer.transpose(1, 2).reshape( + batch_size * self.num_heads, q_length, self.head_dim + ) + key_layer = key_layer.transpose(1, 2).reshape( + batch_size * self.num_kv, + q_length, + self.head_dim, + ) + value_layer = value_layer.transpose(1, 2).reshape( + batch_size * self.num_kv, q_length, self.head_dim + ) + + query_layer, key_layer = self.maybe_rotary(query_layer, key_layer) # type: ignore # noqa: E501 + + if layer_past is not None: + past_key, past_value = layer_past + # concatenate along seq_length dimension: + # - key: [batch_size * self.num_heads, head_dim, kv_length] + # - value: [batch_size * self.num_heads, kv_length, head_dim] + key_layer = torch.cat((past_key, key_layer), dim=1) + value_layer = torch.cat((past_value, value_layer), dim=1) + + _, kv_length, _ = key_layer.shape + + if use_cache is True: + present = (key_layer, value_layer) + else: + present = None + + if alibi is None: + query_layer_ = query_layer.reshape( + batch_size, self.num_heads, -1, self.head_dim + ) + key_layer_ = key_layer.reshape(batch_size, self.num_kv, -1, self.head_dim) + value_layer_ = value_layer.reshape( + batch_size, self.num_kv, -1, self.head_dim + ) + + attn_output = F.scaled_dot_product_attention( + query_layer_, key_layer_, value_layer_, None, 0.0, is_causal=True + ) + + x = attn_output.view(batch_size, self.num_heads, q_length, self.head_dim) + x = x.permute(0, 2, 1, 3) + attn_output = x.reshape( + batch_size, q_length, self.num_heads * self.head_dim + ) + + output_tensor = self.dense(attn_output) + + outputs = (output_tensor, present) + assert not output_attentions # not supported. + return outputs + else: + attention_mask_float = ( + (attention_mask * 1.0) + .masked_fill(attention_mask, -1e9) + .to(torch.bfloat16) + ) + matmul_result = query_layer @ key_layer.transpose(-1, -2) + + # change view to [batch_size, num_heads, q_length, kv_length] + attention_scores = matmul_result.view( + batch_size, self.num_heads, q_length, kv_length + ) + + # cast attention scores to fp32, compute scaled softmax and cast back to initial dtype - [batch_size, num_heads, q_length, kv_length] # noqa: E501 + input_dtype = attention_scores.dtype + # `float16` has a minimum value of -65504.0, whereas `bfloat16` and `float32` have a minimum value of `-3.4e+38` # noqa: E501 + if input_dtype == torch.float16 or input_dtype == torch.bfloat16: + attention_scores = attention_scores.to(torch.float32) + # attn_weights = torch.masked_fill(attention_scores, attention_mask, torch.finfo(attention_scores.dtype).min) # noqa: E501 + attention_probs = F.softmax( + (attention_scores + alibi.view(batch_size, self.num_heads, 1, -1)) + * self.inv_norm_factor + + attention_mask_float, + dim=-1, + dtype=hidden_states.dtype, + ) + # [batch_size, num_heads, q_length, kv_length] + attention_probs = self.attention_dropout(attention_probs) + + if head_mask is not None: + attention_probs = attention_probs * head_mask + + # change view [batch_size x num_heads, q_length, kv_length] + attention_probs_reshaped = attention_probs.view( + batch_size * self.num_heads, q_length, kv_length + ) + + # matmul: [batch_size * num_heads, q_length, head_dim] + context_layer = attention_probs_reshaped @ value_layer + + # change view [batch_size, num_heads, q_length, head_dim] + context_layer = self._merge_heads(context_layer) + + output_tensor = self.dense(context_layer) + + outputs = (output_tensor, present) + if output_attentions: + outputs += (attention_probs,) # type: ignore + + return outputs + + +class MLP(nn.Module): + def __init__(self, config: RWConfig): + super().__init__() + hidden_size = config.hidden_size + + self.dense_h_to_4h = Linear(hidden_size, 4 * hidden_size, bias=config.bias) + self.act = nn.GELU() + self.dense_4h_to_h = Linear(4 * hidden_size, hidden_size, bias=config.bias) + self.hidden_dropout = config.hidden_dropout + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = self.act(self.dense_h_to_4h(x)) + x = self.dense_4h_to_h(x) + return x + + +class DecoderLayer(nn.Module): + def __init__(self, config: RWConfig): + super().__init__() + hidden_size = config.hidden_size + + self.input_layernorm = LayerNorm(hidden_size, eps=config.layer_norm_epsilon) + self.num_heads = config.n_head + self.self_attention = Attention(config) + + if not config.parallel_attn: + # unused if parallel attn + self.post_attention_layernorm = LayerNorm( + hidden_size, eps=config.layer_norm_epsilon + ) + + self.mlp = MLP(config) + + self.apply_residual_connection_post_layernorm = ( + config.apply_residual_connection_post_layernorm + ) + self.hidden_dropout = config.hidden_dropout + + self.config = config + + def forward( + self, + hidden_states: torch.Tensor, + alibi: torch.Tensor, + attention_mask: torch.Tensor, + layer_past: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, + head_mask: Optional[torch.Tensor] = None, + use_cache: bool = False, + output_attentions: bool = False, + ): + layernorm_output = self.input_layernorm(hidden_states) + residual = hidden_states + + # Self attention. + attn_outputs = self.self_attention( + layernorm_output, + layer_past=layer_past, + attention_mask=attention_mask, + alibi=alibi, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + attention_output = attn_outputs[0] + + if not self.config.parallel_attn: + residual = dropout_add( + attention_output, + residual, + self.config.attention_dropout, + training=self.training, + ) + layernorm_output = self.post_attention_layernorm(residual) + + outputs = attn_outputs[1:] + + # MLP. + mlp_output = self.mlp(layernorm_output) + + if self.config.parallel_attn: + mlp_output += attention_output + + output = dropout_add( + mlp_output, residual, self.config.hidden_dropout, training=self.training + ) + + if use_cache: + outputs = (output,) + outputs + else: + outputs = (output,) + outputs[1:] + + return outputs # hidden_states, present, attentions + + +class RWPreTrainedModel(PreTrainedModel): + _keys_to_ignore_on_load_missing = [ + r"h.*.self_attention.scale_mask_softmax.causal_mask", + r"lm_head.weight", + ] + """ + An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained + models. + """ # noqa: E501 + + config_class = RWConfig + base_model_prefix = "transformer" + supports_gradient_checkpointing = True + _no_split_modules = ["DecoderLayer"] + + def __init__(self, *inputs, **kwargs): + super().__init__(*inputs, **kwargs) + + def _init_weights(self, module: nn.Module): + """Initialize the weights.""" + if isinstance(module, nn.Linear) or isinstance(module, Linear): + # Slightly different from the TF version which uses truncated_normal for initialization # noqa: E501 + # cf https://github.com/pytorch/pytorch/pull/5617 + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + elif isinstance(module, LayerNorm): + module.bias.data.zero_() + module.weight.data.fill_(1.0) + + def _set_gradient_checkpointing(self, module: nn.Module, value: bool = False): + if isinstance(module, RWModel): + module.gradient_checkpointing = value + + @staticmethod + def _convert_to_standard_cache( + past_key_value: Tuple[Tuple[torch.Tensor, torch.Tensor]], batch_size: int + ) -> Tuple[Tuple[torch.Tensor, torch.Tensor]]: + """ + Standardizes the format of the cache so as to match most implementations, i.e. to tuple(tuple([batch_size, + num_heads, ...])) + """ # noqa: E501 + batch_size_times_num_heads, head_dim, seq_length = past_key_value[0][0].shape + num_heads = batch_size_times_num_heads // batch_size + # key: [batch_size * num_heads, head_dim, seq_length] -> [batch_size, num_heads, head_dim, seq_length] # noqa: E501 + # value: [batch_size * num_heads, seq_length, head_dim] -> [batch_size, num_heads, seq_length, head_dim] # noqa: E501 + return tuple( + ( + layer_past[0].view(batch_size, num_heads, head_dim, seq_length), + layer_past[1].view(batch_size, num_heads, seq_length, head_dim), + ) + for layer_past in past_key_value + ) # type: ignore + + @staticmethod + def _convert_to_rw_cache( + past_key_value: Tuple[Tuple[torch.Tensor, torch.Tensor]] + ) -> Tuple[Tuple[torch.Tensor, torch.Tensor]]: + batch_size, num_heads, head_dim, seq_length = past_key_value[0][0].shape + batch_size_times_num_heads = batch_size * num_heads + # key: [batch_size, num_heads, head_dim, seq_length] -> [batch_size * num_heads, head_dim, seq_length] # noqa: E501 + # value: [batch_size, num_heads, seq_length, head_dim] -> [batch_size * num_heads, seq_length, head_dim] # noqa: E501 + return tuple( + ( + layer_past[0].view(batch_size_times_num_heads, head_dim, seq_length), + layer_past[1].view(batch_size_times_num_heads, seq_length, head_dim), + ) + for layer_past in past_key_value + ) # type: ignore + + +class RWModel(RWPreTrainedModel): + def __init__(self, config: RWConfig): + super().__init__(config) + + self.embed_dim = config.hidden_size + self.num_heads = config.n_head + self.alibi = config.alibi + + # Embedding + LN Embedding + self.word_embeddings = nn.Embedding(config.vocab_size, self.embed_dim) + + # Transformer blocks + self.h = nn.ModuleList( + [DecoderLayer(config) for _ in range(config.num_hidden_layers)] + ) + + # Final Layer Norm + self.ln_f = LayerNorm(self.embed_dim, eps=config.layer_norm_epsilon) + + self.gradient_checkpointing = False + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.word_embeddings + + def _prepare_attn_mask( + self, + attention_mask: torch.Tensor, + input_shape: Tuple[int, int], + past_key_values_length: int, + ) -> torch.BoolTensor: + # create causal mask + # [batch_size, seq_length] -> [batch_size, 1, tgt_length, src_length] + combined_attention_mask = None + device = attention_mask.device + _, src_length = input_shape + + if src_length > 1: + combined_attention_mask = _make_causal_mask( + input_shape, # type: ignore + device=device, + past_key_values_length=past_key_values_length, + ) + + # [batch_size, seq_length] -> [batch_size, 1, tgt_length, src_length] + expanded_attn_mask = _expand_mask(attention_mask, tgt_length=src_length) + combined_attention_mask = ( + expanded_attn_mask # type: ignore + if combined_attention_mask is None + else expanded_attn_mask | combined_attention_mask + ) + + return combined_attention_mask # type: ignore + + def set_input_embeddings(self, new_embeddings: torch.Tensor): + self.word_embeddings = new_embeddings # type: ignore + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + attention_mask: Optional[torch.Tensor] = None, + head_mask: Optional[torch.LongTensor] = None, + inputs_embeds: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **deprecated_arguments, + ) -> Union[Tuple[torch.Tensor, ...], BaseModelOutputWithPastAndCrossAttentions]: + if deprecated_arguments.pop("position_ids", False) is not False: + # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None` # noqa: E501 + warnings.warn( + "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore" # noqa: E501 + " passing `position_ids`.", + FutureWarning, + ) + if len(deprecated_arguments) > 0: + raise ValueError(f"Got unexpected arguments: {deprecated_arguments}") + + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both input_ids and inputs_embeds at the same time" + ) + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + if past_key_values is None: + past_key_values = tuple([None] * len(self.h)) # type: ignore + + # Prepare head mask if needed + # 1.0 in head_mask indicate we keep the head + # attention_probs has shape batch_size x num_heads x N x N + # head_mask has shape n_layer x batch x num_heads x N x N + head_mask = self.get_head_mask(head_mask, self.config.n_layer) + + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + + hidden_states = inputs_embeds + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + + # Compute alibi tensor: check build_alibi_tensor documentation + seq_length_with_past = seq_length + past_key_values_length = 0 + if past_key_values[0] is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), device=hidden_states.device + ) + else: + attention_mask = attention_mask.to(hidden_states.device) + + if self.alibi: + alibi = build_alibi_tensor( + attention_mask, self.num_heads, dtype=hidden_states.dtype + ) + else: + alibi = None + + causal_mask = self._prepare_attn_mask( + attention_mask, + input_shape=(batch_size, seq_length), + past_key_values_length=past_key_values_length, + ) + + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) # type: ignore + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." # noqa: E501 + ) + use_cache = False + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module( + *inputs, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + return custom_forward + + outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(block), + hidden_states, + alibi, + causal_mask, + head_mask[i], # type: ignore + ) + else: + outputs = block( + hidden_states, + layer_past=layer_past, + attention_mask=causal_mask, + head_mask=head_mask[i], # type: ignore + use_cache=use_cache, + output_attentions=output_attentions, + alibi=alibi, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[1],) # type: ignore + + if output_attentions: + all_self_attentions = all_self_attentions + ( # type: ignore + outputs[2 if use_cache else 1], + ) + + # Add last hidden state + hidden_states = self.ln_f(hidden_states) + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) # type: ignore + + if not return_dict: + return tuple( + v + for v in [ + hidden_states, + presents, + all_hidden_states, + all_self_attentions, + ] + if v is not None + ) + + return BaseModelOutputWithPastAndCrossAttentions( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + +class RWForCausalLM(RWPreTrainedModel): + _keys_to_ignore_on_load_missing = [ + r"h.*.self_attention.scale_mask_softmax.causal_mask", + r"lm_head.weight", + ] + + def __init__(self, config: RWConfig): + super().__init__(config) + self.transformer = RWModel(config) + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_output_embeddings(self): + return self.lm_head + + def set_output_embeddings(self, new_embeddings: torch.Tensor): + self.lm_head = new_embeddings # type: ignore + + def prepare_inputs_for_generation( + self, + input_ids: torch.LongTensor, + past: Optional[torch.Tensor] = None, + attention_mask: Optional[torch.Tensor] = None, + **kwargs, + ) -> dict: + # only last token for input_ids if past is not None + if past: + input_ids = input_ids[:, -1].unsqueeze(-1) # type: ignore + + # the cache may be in the stardard format (e.g. in contrastive search), convert to our's format if needed # noqa: E501 + if past[0][0].shape[0] == input_ids.shape[0]: + past = self._convert_to_rw_cache(past) # type: ignore + + return { + "input_ids": input_ids, + "past_key_values": past, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + attention_mask: Optional[torch.Tensor] = None, + head_mask: Optional[torch.Tensor] = None, + inputs_embeds: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **deprecated_arguments, + ) -> Union[Tuple[torch.Tensor], CausalLMOutputWithCrossAttentions]: + r""" + labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set + `labels = input_ids` Indices are selected in `[-100, 0, ..., config.vocab_size]` All labels set to `-100` + are ignored (masked), the loss is only computed for labels in `[0, ..., config.vocab_size]` + """ # noqa: E501 + if deprecated_arguments.pop("position_ids", False) is not False: + # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None` # noqa: E501 + warnings.warn( + "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore" # noqa: E501 + " passing `position_ids`.", + FutureWarning, + ) + if len(deprecated_arguments) > 0: + raise ValueError(f"Got unexpected arguments: {deprecated_arguments}") + + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + transformer_outputs = self.transformer( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + + lm_logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + batch_size, seq_length, vocab_size = shift_logits.shape + # Flatten the tokens + loss_fct = CrossEntropyLoss() + loss = loss_fct( + shift_logits.view(batch_size * seq_length, vocab_size), + shift_labels.view(batch_size * seq_length), + ) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithCrossAttentions( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + def _reorder_cache( + self, + past: Tuple[Tuple[torch.Tensor, torch.Tensor], ...], + beam_idx: torch.LongTensor, + ) -> Tuple[Tuple[torch.Tensor, torch.Tensor], ...]: + """ + This function is used to re-order the `past_key_values` cache if [`~PreTrainedModel.beam_search`] or + [`~PreTrainedModel.beam_sample`] is called. This is required to match `past_key_values` with the correct + beam_idx at every generation step. + Output shares the same memory storage as `past`. + """ # noqa: E501 + standardized_past = self._convert_to_standard_cache( + past, batch_size=len(beam_idx) # type: ignore + ) + + # Get a copy of `beam_idx` on all the devices where we need those indices. + device_to_beam_idx = { + past_state.device: beam_idx.to(past_state.device) + for layer_past in past + for past_state in layer_past + } + reordered_past = tuple( + ( + layer_past[0].index_select(0, device_to_beam_idx[layer_past[0].device]), + layer_past[1].index_select(0, device_to_beam_idx[layer_past[0].device]), + ) + for layer_past in standardized_past + ) + return self._convert_to_rw_cache(reordered_past) # type: ignore + + +class RWForSequenceClassification(RWPreTrainedModel): + _keys_to_ignore_on_load_missing = [ + r"h.*.self_attention.scale_mask_softmax.causal_mask", + r"lm_head.weight", + ] + + def __init__(self, config: RWConfig): + super().__init__(config) + self.num_labels = config.num_labels + self.transformer = RWModel(config) + self.score = nn.Linear(config.hidden_size, config.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + attention_mask: Optional[torch.Tensor] = None, + head_mask: Optional[torch.Tensor] = None, + inputs_embeds: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **deprecated_arguments, + ) -> Union[Tuple[torch.Tensor], SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ # noqa: E501 + if deprecated_arguments.pop("position_ids", False) is not False: + # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None` # noqa: E501 + warnings.warn( + "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore" # noqa: E501 + " passing `position_ids`.", + FutureWarning, + ) + if len(deprecated_arguments) > 0: + raise ValueError(f"Got unexpected arguments: {deprecated_arguments}") + + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + transformer_outputs = self.transformer( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = transformer_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] # type: ignore + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError( + "Cannot handle batch sizes > 1 if no padding token is defined." + ) + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + sequence_lengths = ( + torch.ne(input_ids, self.config.pad_token_id).sum(dim=-1) - 1 # type: ignore # noqa: E501 + ) + else: + sequence_lengths = -1 + logger.warning( + f"{self.__class__.__name__} will not detect padding tokens in `inputs_embeds`. Results may be " # noqa: E501 + "unexpected if using padding tokens in conjunction with `inputs_embeds.`" # noqa: E501 + ) + + pooled_logits = logits[ + torch.arange(batch_size, device=logits.device), sequence_lengths + ] + + loss = None + if labels is not None: + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and ( + labels.dtype == torch.long or labels.dtype == torch.int + ): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() # type: ignore + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() # type: ignore + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + +class RWForTokenClassification(RWPreTrainedModel): + _keys_to_ignore_on_load_missing = [ + r"h.*.self_attention.scale_mask_softmax.causal_mask", + r"lm_head.weight", + ] + + def __init__(self, config: RWConfig): + super().__init__(config) + self.num_labels = config.num_labels + + self.transformer = RWModel(config) + if ( + hasattr(config, "classifier_dropout") + and config.classifier_dropout is not None + ): + classifier_dropout = config.classifier_dropout + elif hasattr(config, "hidden_dropout") and config.hidden_dropout is not None: + classifier_dropout = config.hidden_dropout + else: + classifier_dropout = 0.1 + self.dropout = nn.Dropout(classifier_dropout) + self.classifier = nn.Linear(config.hidden_size, config.num_labels) + + # Initialize weights and apply final processing + self.post_init() + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + attention_mask: Optional[torch.Tensor] = None, + head_mask: Optional[torch.Tensor] = None, + inputs_embeds: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **deprecated_arguments, + ) -> Union[Tuple[torch.Tensor], TokenClassifierOutput]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ # noqa: E501 + if deprecated_arguments.pop("position_ids", False) is not False: + # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None` # noqa: E501 + warnings.warn( + "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore" # noqa: E501 + " passing `position_ids`.", + FutureWarning, + ) + if len(deprecated_arguments) > 0: + raise ValueError(f"Got unexpected arguments: {deprecated_arguments}") + + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + transformer_outputs = self.transformer( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = transformer_outputs[0] + hidden_states = self.dropout(hidden_states) + logits = self.classifier(hidden_states) + + loss = None + if labels is not None: + batch_size, seq_length = labels.shape + loss_fct = CrossEntropyLoss() + loss = loss_fct( + logits.view(batch_size * seq_length, self.num_labels), + labels.view(batch_size * seq_length), + ) + + if not return_dict: + output = (logits,) + transformer_outputs[2:] + return ((loss,) + output) if loss is not None else output + + return TokenClassifierOutput( + loss=loss, + logits=logits, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + ) + + +class RWForQuestionAnswering(RWPreTrainedModel): + _keys_to_ignore_on_load_missing = [ + r"h.*.self_attention.scale_mask_softmax.causal_mask", + r"lm_head.weight", + ] + + def __init__(self, config): + super().__init__(config) + self.transformer = RWModel(config) + self.qa_outputs = nn.Linear(config.hidden_size, 2) + + # Initialize weights and apply final processing + self.post_init() + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + attention_mask: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + start_positions: Optional[torch.LongTensor] = None, + end_positions: Optional[torch.LongTensor] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, QuestionAnsweringModelOutput]: + r""" + start_positions (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for position (index) of the start of the labelled span for computing the token classification loss. + Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence + are not taken into account for computing the loss. + end_positions (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for position (index) of the end of the labelled span for computing the token classification loss. + Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence + are not taken into account for computing the loss. + """ # noqa: E501 + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + outputs = self.transformer( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + sequence_output = outputs[0] + + logits = self.qa_outputs(sequence_output) + start_logits, end_logits = logits.split(1, dim=-1) + start_logits = start_logits.squeeze(-1).contiguous() + end_logits = end_logits.squeeze(-1).contiguous() + + total_loss = None + if start_positions is not None and end_positions is not None: + # If we are on multi-GPU, split add a dimension + if len(start_positions.size()) > 1: + start_positions = start_positions.squeeze(-1) # type: ignore + if len(end_positions.size()) > 1: + end_positions = end_positions.squeeze(-1) # type: ignore + # sometimes the start/end positions are outside our model inputs, we ignore these terms # noqa: E501 + ignored_index = start_logits.size(1) + start_positions = start_positions.clamp(0, ignored_index) # type: ignore + end_positions = end_positions.clamp(0, ignored_index) # type: ignore + + loss_fct = CrossEntropyLoss(ignore_index=ignored_index) + start_loss = loss_fct(start_logits, start_positions) + end_loss = loss_fct(end_logits, end_positions) + total_loss = (start_loss + end_loss) / 2 + + if not return_dict: + output = (start_logits, end_logits) + outputs[2:] + return ((total_loss,) + output) if total_loss is not None else output + + return QuestionAnsweringModelOutput( + loss=total_loss, + start_logits=start_logits, + end_logits=end_logits, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + +class DecoderLayerWithCheckpointing(DecoderLayer): + def forward( + self, + hidden_states: torch.Tensor, + alibi: torch.Tensor, + attention_mask: torch.Tensor, + layer_past: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, + head_mask: Optional[torch.Tensor] = None, + use_cache: bool = False, + output_attentions: bool = False, + ): + layernorm_output = self.input_layernorm(hidden_states) + residual = hidden_states + + if self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module( + *inputs, + layer_past=layer_past, + attention_mask=attention_mask, + alibi=alibi, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + return custom_forward + + attn_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(self.self_attention), + layernorm_output, + ) + else: + attn_outputs = self.self_attention( + layernorm_output, + layer_past=layer_past, + attention_mask=attention_mask, + alibi=alibi, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + attention_output = attn_outputs[0] + + if not self.config.parallel_attn: + residual = dropout_add( + attention_output, + residual, + self.config.attention_dropout, + training=self.training, + ) + layernorm_output = self.post_attention_layernorm(residual) + + outputs = attn_outputs[1:] + + # MLP. + mlp_output = self.mlp(layernorm_output) + + if self.config.parallel_attn: + mlp_output += attention_output + + output = dropout_add( + mlp_output, residual, self.config.hidden_dropout, training=self.training + ) + + if use_cache: + outputs = (output,) + outputs + else: + outputs = (output,) + outputs[1:] + + return outputs # hidden_states, present, attentions + + +class RWModelWithCheckpointing(RWModel): + def __init__(self, config: RWConfig): + super().__init__(config) + + self.embed_dim = config.hidden_size + self.num_heads = config.n_head + self.alibi = config.alibi + + # Embedding + LN Embedding + self.word_embeddings = nn.Embedding(config.vocab_size, self.embed_dim) + + # Transformer blocks + self.h = nn.ModuleList( + [ + DecoderLayerWithCheckpointing(config) + for _ in range(config.num_hidden_layers) + ] + ) + + # Final Layer Norm + self.ln_f = LayerNorm(self.embed_dim, eps=config.layer_norm_epsilon) + + self.gradient_checkpointing = False + + # Initialize weights and apply final processing + self.post_init() + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + attention_mask: Optional[torch.Tensor] = None, + head_mask: Optional[torch.LongTensor] = None, + inputs_embeds: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **deprecated_arguments, + ) -> Union[Tuple[torch.Tensor, ...], BaseModelOutputWithPastAndCrossAttentions]: + if deprecated_arguments.pop("position_ids", False) is not False: + # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None` # noqa: E501 + warnings.warn( + "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore" # noqa: E501 + " passing `position_ids`.", + FutureWarning, + ) + if len(deprecated_arguments) > 0: + raise ValueError(f"Got unexpected arguments: {deprecated_arguments}") + + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both input_ids and inputs_embeds at the same time" + ) + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + if past_key_values is None: + past_key_values = tuple([None] * len(self.h)) # type: ignore + + # Prepare head mask if needed + # 1.0 in head_mask indicate we keep the head + # attention_probs has shape batch_size x num_heads x N x N + # head_mask has shape n_layer x batch x num_heads x N x N + head_mask = self.get_head_mask(head_mask, self.config.n_layer) + + if inputs_embeds is None: + inputs_embeds = self.word_embeddings(input_ids) + + hidden_states = inputs_embeds + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + + # Compute alibi tensor: check build_alibi_tensor documentation + seq_length_with_past = seq_length + past_key_values_length = 0 + if past_key_values[0] is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), device=hidden_states.device + ) + else: + attention_mask = attention_mask.to(hidden_states.device) + + if self.alibi: + alibi = build_alibi_tensor( + attention_mask, self.num_heads, dtype=hidden_states.dtype + ) + else: + alibi = None + + causal_mask = self._prepare_attn_mask( + attention_mask, + input_shape=(batch_size, seq_length), + past_key_values_length=past_key_values_length, + ) + + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) # type: ignore + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." # noqa: E501 + ) + use_cache = False + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module( + *inputs, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + return custom_forward + + outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(block), + hidden_states, + alibi, + causal_mask, + head_mask[i], # type: ignore + ) + else: + outputs = block( + hidden_states, + layer_past=layer_past, + attention_mask=causal_mask, + head_mask=head_mask[i], # type: ignore + use_cache=use_cache, + output_attentions=output_attentions, + alibi=alibi, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[1],) # type: ignore + + if output_attentions: + all_self_attentions = all_self_attentions + ( # type: ignore + outputs[2 if use_cache else 1], + ) + + # Add last hidden state + hidden_states = self.ln_f(hidden_states) + + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) # type: ignore + + if not return_dict: + return tuple( + v + for v in [ + hidden_states, + presents, + all_hidden_states, + all_self_attentions, + ] + if v is not None + ) + + return BaseModelOutputWithPastAndCrossAttentions( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + +class RWForCausalLMwithCheckpointing(RWForCausalLM): + _keys_to_ignore_on_load_missing = [ + r"h.*.self_attention.scale_mask_softmax.causal_mask", + r"lm_head.weight", + ] + + def __init__(self, config: RWConfig): + super().__init__(config) + self.transformer = RWModel(config) + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + use_checkpointing = getattr(config, "use_checkpointing", False) + checkpoint_only_attention = getattr(config, "checkpoint_only_attention", False) + if use_checkpointing and checkpoint_only_attention: + self.transformer = RWModelWithCheckpointing(config) + print("use model with gradient checkpointing only attention") + if use_checkpointing: + self.gradient_checkpointing_enable() + print("use gradient checkpointing") + + # Initialize weights and apply final processing + self.post_init() diff --git a/src/model/openthaigpt_pretraining_model/models/gptj/gptj_model_xformers.py b/src/model/openthaigpt_pretraining_model/models/gptj/gptj_model_xformers.py new file mode 100644 index 0000000..7c8499e --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/gptj/gptj_model_xformers.py @@ -0,0 +1,362 @@ +import torch +import xformers.ops as xops +from transformers.models.gptj.modeling_gptj import ( + GPTJAttention, + GPTJModel, + GPTJBlock, + logger, +) +from transformers import GPTJForCausalLM +from torch import nn + +from typing import Optional, Tuple, Union +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, +) + +XFORMER_ATTENTION_MODE = "xformers" + + +class GPTJAttentionXFormers(GPTJAttention): + def __init__(self, config): + super().__init__(config) + self.attention_mode = config.attention_mode + + def _attn( + self, + query, + key, + value, + attention_mask=None, + head_mask=None, + ): + if self.attention_mode == XFORMER_ATTENTION_MODE: + if attention_mask is not None: + raise TypeError("Not support manual attention mask") + + if head_mask is not None: + raise TypeError("Not support head_mask") + + # Attention output + attn_output = xops.memory_efficient_attention( + query.transpose(2, 1), + key.transpose(2, 1), + value.transpose(2, 1), + xops.LowerTriangularMask(), + ).transpose(2, 1) + + return attn_output, None + return super()._attn( + query, + key, + value, + attention_mask, + head_mask, + ) + + +class GPTJModelWithCheckpointing(GPTJModel): + def __init__(self, config): + super().__init__(config) + + self.embed_dim = config.n_embd + self.vocab_size = config.vocab_size + self.wte = nn.Embedding(config.vocab_size, self.embed_dim) + self.drop = nn.Dropout(config.embd_pdrop) + self.h = nn.ModuleList( + [GPTJBlockWithCheckpointing(config) for _ in range(config.n_layer)] + ) + self.ln_f = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_epsilon) + + # Model parallel + self.model_parallel = False + self.device_map = None + self.gradient_checkpointing = False + + # Initialize weights and apply final processing + self.post_init() + + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both input_ids and inputs_embeds at the same time" + ) + elif input_ids is not None: + input_shape = input_ids.size() + input_ids = input_ids.view(-1, input_shape[-1]) # type: ignore + batch_size = input_ids.shape[0] + elif inputs_embeds is not None: + input_shape = inputs_embeds.size()[:-1] + batch_size = inputs_embeds.shape[0] + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + device = input_ids.device if input_ids is not None else inputs_embeds.device # type: ignore # noqa + + if token_type_ids is not None: + token_type_ids = token_type_ids.view(-1, input_shape[-1]) # type: ignore + + if position_ids is not None: + position_ids = position_ids.view(-1, input_shape[-1]).long() # type: ignore + + if past_key_values is None: + past_length = 0 + past_key_values = tuple([None] * len(self.h)) # type: ignore + else: + past_length = past_key_values[0][0].size(-2) + + if position_ids is None: + position_ids = torch.arange( # type: ignore + past_length, + input_shape[-1] + past_length, + dtype=torch.long, + device=device, + ) + position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1]) # type: ignore # noqa + + # Attention mask. + if attention_mask is not None: + if batch_size <= 0: + raise ValueError("batch_size has to be defined and > 0") + attention_mask = attention_mask.view(batch_size, -1) # type: ignore + # We create a 3D attention mask from a 2D tensor mask. + # Sizes are [batch_size, 1, 1, to_seq_length] + # So we can broadcast to [batch_size, num_heads, from_seq_length, to_seq_length] # noqa + # this attention mask is more simple than the triangular masking of causal attention # noqa + # used in OpenAI GPT, we just need to prepare the broadcast dimension here. + attention_mask = attention_mask[:, None, None, :] # type: ignore + + # Since attention_mask is 1.0 for positions we want to attend and 0.0 for + # masked positions, this operation will create a tensor which is 0.0 for + # positions we want to attend and the dtype's smallest value for masked positions. # noqa + # Since we are adding it to the raw scores before the softmax, this is + # effectively the same as removing these entirely. + attention_mask = attention_mask.to(dtype=self.dtype) # type: ignore + attention_mask = (1.0 - attention_mask) * torch.finfo(self.dtype).min + + # Prepare head mask if needed + # 1.0 in head_mask indicate we keep the head + # attention_probs has shape bsz x num_attention_heads x N x N + # head_mask has shape n_layer x batch x num_attention_heads x N x N + head_mask = self.get_head_mask(head_mask, self.config.n_layer) + + if inputs_embeds is None: + inputs_embeds = self.wte(input_ids) + + hidden_states = inputs_embeds + + if token_type_ids is not None: + token_type_embeds = self.wte(token_type_ids) + hidden_states = hidden_states + token_type_embeds + + hidden_states = self.drop(hidden_states) + + output_shape = input_shape + (hidden_states.size(-1),) + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." # noqa + ) + use_cache = False + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_hidden_states = () if output_hidden_states else None + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): # type: ignore # noqa + # Model parallel + if self.model_parallel: + torch.cuda.set_device(hidden_states.device) + # Ensure layer_past is on same device as hidden_states (might not be correct) # noqa + if layer_past is not None: + layer_past = tuple( # type: ignore + past_state.to(hidden_states.device) for past_state in layer_past + ) + # Ensure that attention_mask is always on the same device as hidden_states # noqa + if attention_mask is not None: + attention_mask = attention_mask.to(hidden_states.device) # type: ignore # noqa + if isinstance(head_mask, torch.Tensor): + head_mask = head_mask.to(hidden_states.device) # type: ignore + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) # type: ignore + outputs = block( + hidden_states=hidden_states, + layer_past=layer_past, + attention_mask=attention_mask, + position_ids=position_ids, + head_mask=head_mask[i], # type: ignore + use_cache=use_cache, + output_attentions=output_attentions, + gradient_checkpointing=self.gradient_checkpointing, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[1],) # type: ignore + + if output_attentions: + all_self_attentions = all_self_attentions + ( # type: ignore + outputs[2 if use_cache else 1], + ) + + # Model Parallel: If it's the last layer for that device, put things on the next device # noqa + if self.model_parallel: + for k, v in self.device_map.items(): + if i == v[-1] and "cuda:" + str(k) != self.last_device: + hidden_states = hidden_states.to("cuda:" + str(k + 1)) + + hidden_states = self.ln_f(hidden_states) + + hidden_states = hidden_states.view(output_shape) + # Add last hidden state + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) # type: ignore + + if not return_dict: + return tuple( + v + for v in [ + hidden_states, + presents, + all_hidden_states, + all_self_attentions, + ] + if v is not None + ) + + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + ) + + +class GPTJBlockWithCheckpointing(GPTJBlock): + def __init__(self, config): + super().__init__(config) + self.attn = GPTJAttentionXFormers(config) + + def forward( + self, + hidden_states: Optional[torch.FloatTensor], + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = False, + output_attentions: Optional[bool] = False, + gradient_checkpointing: Optional[bool] = False, + ) -> Union[ + Tuple[torch.Tensor], + Optional[Tuple[torch.Tensor, Tuple[torch.FloatTensor, ...]]], + ]: + residual = hidden_states + hidden_states = self.ln_1(hidden_states) + + # Attention + if gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward( + hidden_states, layer_past, attention_mask, position_ids, head_mask + ): + return module( + hidden_states, + layer_past=layer_past, + attention_mask=attention_mask, + position_ids=position_ids, + head_mask=head_mask, + ) + + return custom_forward + + attn_outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(self.attn), + hidden_states, + layer_past, + attention_mask, + position_ids, + head_mask, + ) + else: + attn_outputs = self.attn( + hidden_states=hidden_states, + layer_past=layer_past, + attention_mask=attention_mask, + position_ids=position_ids, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + ) + + attn_output = attn_outputs[0] # output_attn: a, present, (attentions) + outputs = attn_outputs[1:] + + feed_forward_hidden_states = self.mlp(hidden_states) + hidden_states = attn_output + feed_forward_hidden_states + residual + + if use_cache: + outputs = (hidden_states,) + outputs + else: + outputs = (hidden_states,) + outputs[1:] + + return outputs + + +class GPTJForCausalLMWithCheckpointing(GPTJForCausalLM): + _keys_to_ignore_on_load_missing = [ + r"h\.\d+\.attn\.masked_bias", + r"h\.\d+\.attn\.bias", + ] + + def __init__(self, config): + super().__init__(config) + use_checkpointing = config.get("use_checkpointing", False) + checkpoint_only_attention = config.get("checkpoint_only_attention", False) + if use_checkpointing and checkpoint_only_attention: + self.transformer = GPTJModelWithCheckpointing(config) + print("use model with gradient checkpointing only attention") + if use_checkpointing: + self.gradient_checkpointing_enable() + print("use gradient checkpointing") + else: + self.transformer = GPTJModel(config) + self.lm_head = nn.Linear(config.n_embd, config.vocab_size) + + self.vocab_size = config.vocab_size + + # Model parallel + self.model_parallel = False + self.device_map = None + + # Initialize weights and apply final processing + self.post_init() diff --git a/src/model/openthaigpt_pretraining_model/models/llama/generation.py b/src/model/openthaigpt_pretraining_model/models/llama/generation.py new file mode 100644 index 0000000..870bd70 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/llama/generation.py @@ -0,0 +1 @@ +from llama.generation import LLaMA # type: ignore # noqa: F401 diff --git a/src/model/openthaigpt_pretraining_model/models/llama/model.py b/src/model/openthaigpt_pretraining_model/models/llama/model.py new file mode 100644 index 0000000..a8dbc72 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/llama/model.py @@ -0,0 +1,250 @@ +from typing import Optional +from dataclasses import dataclass +import math + +import torch +from torch import nn +from torch.nn import CrossEntropyLoss +import torch.nn.functional as F + +import xformers.ops as xops + +from llama.model import RMSNorm, apply_rotary_emb, precompute_freqs_cis # type: ignore +from typing import NamedTuple + +ORIGIN_ATTENTION_MODE = "origin" +PYTORCH_ATTENTION_MODE = "pytorch" +XFORMERS_ATTENTION_MODE = "xformers" + + +@dataclass +class LLaMAArgs: + dim: int = 512 + n_layers: int = 8 + n_heads: int = 8 + vocab_size: int = -1 # defined later by tokenizer + multiple_of: int = 256 # make SwiGLU hidden layer size multiple of large power of 2 + norm_eps: float = 1e-5 + + max_batch_size: int = 32 + max_seq_len: int = 2048 + attention_mode: str = ORIGIN_ATTENTION_MODE # pytorch, xformers + use_checkpointing: bool = False + checkpoint_only_attention: bool = False + + +class OutputModel(NamedTuple): + logits: torch.Tensor + loss: Optional[torch.Tensor] = None + + +class Attention(nn.Module): + def __init__(self, args: LLaMAArgs): + super().__init__() + + self.head_dim = args.dim // args.n_heads + + self.n_local_heads = args.n_heads + + self.wq = nn.Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False, + ) + self.wk = nn.Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False, + ) + self.wv = nn.Linear( + args.dim, + args.n_heads * self.head_dim, + bias=False, + ) + self.wo = nn.Linear( + args.n_heads * self.head_dim, + args.dim, + bias=False, + ) + + if not ( + args.attention_mode == ORIGIN_ATTENTION_MODE + or args.attention_mode == PYTORCH_ATTENTION_MODE # noqa: W503 + or args.attention_mode == XFORMERS_ATTENTION_MODE # noqa: W503 + ): + raise KeyError( + f'attention mode must be "{ORIGIN_ATTENTION_MODE}", "{XFORMERS_ATTENTION_MODE}" or "{PYTORCH_ATTENTION_MODE}"' # noqa: E501 + ) + + self.mode = args.attention_mode + self.checkpoint_only_attention = False + if args.use_checkpointing and args.checkpoint_only_attention: + self.checkpoint_only_attention = args.checkpoint_only_attention + + def compute_attention(self, xq, keys, values, mask): + if self.mode == ORIGIN_ATTENTION_MODE or xq.device == torch.device("cpu"): + xq = xq.transpose(1, 2) + keys = keys.transpose(1, 2) + values = values.transpose(1, 2) + scores = torch.matmul(xq, keys.transpose(2, 3)) / math.sqrt(self.head_dim) + if mask is not None: + scores = scores + mask + scores = F.softmax(scores.float(), dim=-1).type_as(xq) + output = torch.matmul(scores, values) + output = output.transpose(1, 2) + elif self.mode == PYTORCH_ATTENTION_MODE: + xq = xq.transpose(1, 2) + keys = keys.transpose(1, 2) + values = values.transpose(1, 2) + output = F.scaled_dot_product_attention(xq, keys, values, mask) + output = output.transpose(1, 2) + elif self.mode == XFORMERS_ATTENTION_MODE: + output = xops.memory_efficient_attention( + xq, keys, values, attn_bias=xops.LowerTriangularMask() + ) + return output + + def forward( + self, + x: torch.Tensor, + start_pos: int, + freqs_cis: torch.Tensor, + mask: Optional[torch.Tensor], + ): + bsz, seqlen, _ = x.shape + xq, xk, xv = self.wq(x), self.wk(x), self.wv(x) + + xq = xq.view(bsz, seqlen, self.n_local_heads, self.head_dim) + xk = xk.view(bsz, seqlen, self.n_local_heads, self.head_dim) + xv = xv.view(bsz, seqlen, self.n_local_heads, self.head_dim) + + xq, xk = apply_rotary_emb(xq, xk, freqs_cis=freqs_cis) + + keys = xk + values = xv + + if self.checkpoint_only_attention: + output = torch.utils.checkpoint.checkpoint( + self.compute_attention, xq, keys, values, mask + ) + else: + output = self.compute_attention(xq, keys, values, mask) + + output = output.contiguous().view(bsz, seqlen, -1) + + return self.wo(output) + + +class FeedForward(nn.Module): + def __init__( + self, + dim: int, + hidden_dim: int, + multiple_of: int, + ): + super().__init__() + hidden_dim = int(2 * hidden_dim / 3) + hidden_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of) + + self.w1 = nn.Linear(dim, hidden_dim, bias=False) + self.w2 = nn.Linear(hidden_dim, dim, bias=False) + self.w3 = nn.Linear(dim, hidden_dim, bias=False) + + def forward(self, x): + return self.w2(F.silu(self.w1(x)) * self.w3(x)) + + +class TransformerBlock(nn.Module): + def __init__(self, layer_id: int, args: LLaMAArgs): + super().__init__() + self.n_heads = args.n_heads + self.dim = args.dim + self.head_dim = args.dim // args.n_heads + self.attention = Attention(args) + self.feed_forward = FeedForward( + dim=args.dim, hidden_dim=4 * args.dim, multiple_of=args.multiple_of + ) + self.layer_id = layer_id + self.attention_norm = RMSNorm(args.dim, eps=args.norm_eps) + self.ffn_norm = RMSNorm(args.dim, eps=args.norm_eps) + + def forward( + self, + x: torch.Tensor, + start_pos: int, + freqs_cis: torch.Tensor, + mask: Optional[torch.Tensor], + ): + h = x + self.attention.forward( + self.attention_norm(x), start_pos, freqs_cis, mask + ) + out = h + self.feed_forward.forward(self.ffn_norm(h)) + return out + + +class LLaMA(nn.Module): + def __init__(self, params: LLaMAArgs): + super().__init__() + self.params = params + self.vocab_size = params.vocab_size + self.n_layers = params.n_layers + self.tok_embeddings = nn.Embedding(params.vocab_size, params.dim) + + self.layers = torch.nn.ModuleList() + for layer_id in range(params.n_layers): + self.layers.append(TransformerBlock(layer_id, params)) + + self.norm = RMSNorm(params.dim, eps=params.norm_eps) + + self.output = nn.Linear(params.dim, params.vocab_size) + + self.freqs_cis = precompute_freqs_cis( + self.params.dim // self.params.n_heads, self.params.max_seq_len * 2 + ) + self.use_checkpointing = False + if params.use_checkpointing: + if params.checkpoint_only_attention: + print("use gradient checkpointing only attentions") + else: + self.use_checkpointing = params.use_checkpointing + print("use gradient checkpointing") + + def forward( + self, + tokens: torch.Tensor, + start_pos: int = 0, + labels: Optional[torch.Tensor] = None, + ) -> OutputModel: + _bsz, seqlen = tokens.shape + h = self.tok_embeddings(tokens) + self.freqs_cis = self.freqs_cis.to(h.device) + freqs_cis = self.freqs_cis[start_pos : start_pos + seqlen] # noqa: E203 + + mask = None + if seqlen > 1: + mask = torch.full( + (1, 1, seqlen, seqlen), float("-inf"), device=tokens.device + ) + mask = torch.triu(mask, diagonal=start_pos + 1).type_as(h) + + for layer in self.layers: + if self.use_checkpointing: + h = torch.utils.checkpoint.checkpoint( + layer, h, start_pos, freqs_cis, mask + ) + else: + h = layer(h, start_pos, freqs_cis, mask) + h = self.norm(h) + logits = self.output(h) + + loss = None + if labels is not None: + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., :, 1:].contiguous() + + loss_fn = CrossEntropyLoss() + loss = loss_fn( + shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1) + ) + + return OutputModel(logits=logits[:, -1, :], loss=loss) diff --git a/src/model/openthaigpt_pretraining_model/models/llama/tokenizer.py b/src/model/openthaigpt_pretraining_model/models/llama/tokenizer.py new file mode 100644 index 0000000..7fef3e6 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/llama/tokenizer.py @@ -0,0 +1 @@ +from llama.tokenizer import Tokenizer # type: ignore # noqa: F401 diff --git a/src/model/openthaigpt_pretraining_model/models/llama_hf/model.py b/src/model/openthaigpt_pretraining_model/models/llama_hf/model.py new file mode 100644 index 0000000..e647a7e --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/llama_hf/model.py @@ -0,0 +1,282 @@ +from transformers import ( + LlamaConfig, + LlamaForCausalLM, +) +from transformers.models.llama.modeling_llama import ( + LlamaDecoderLayer, + LlamaRMSNorm, + logger, + LlamaModel, +) + +import torch +from torch import nn + +from typing import Optional, Tuple, List, Union +from transformers.modeling_outputs import ( + BaseModelOutputWithPast, +) + + +class LlamaModelWithWithCheckpointing(LlamaModel): + def __init__(self, config: LlamaConfig): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding( + config.vocab_size, config.hidden_size, self.padding_idx + ) + # Here is new LlamaDecoder + self.layers = nn.ModuleList( + [ + LlamaDecoderLayerWithCheckpointing(config) + for _ in range(config.num_hidden_layers) + ] + ) + self.norm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def forward( + self, + input_ids: torch.LongTensor = None, # type: ignore + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time" # noqa + ) + elif input_ids is not None: + batch_size, seq_length = input_ids.shape + elif inputs_embeds is not None: + batch_size, seq_length, _ = inputs_embeds.shape + else: + raise ValueError( + "You have to specify either decoder_input_ids or decoder_inputs_embeds" + ) + + seq_length_with_past = seq_length + past_key_values_length = 0 + + if past_key_values is not None: + past_key_values_length = past_key_values[0][0].shape[2] + seq_length_with_past = seq_length_with_past + past_key_values_length + + if position_ids is None: + device = ( + input_ids.device + if input_ids is not None + else inputs_embeds.device # type: ignore + ) + position_ids = torch.arange( # type: ignore + past_key_values_length, + seq_length + past_key_values_length, + dtype=torch.long, + device=device, + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) # type: ignore # noqa + else: + position_ids = position_ids.view(-1, seq_length).long() # type: ignore # noqa + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + # embed positions + if attention_mask is None: + attention_mask = torch.ones( + (batch_size, seq_length_with_past), + dtype=torch.bool, + device=inputs_embeds.device, + ) + attention_mask = self._prepare_decoder_attention_mask( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + ) + + hidden_states = inputs_embeds + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." # noqa + ) + use_cache = False + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = () if use_cache else None + + for idx, decoder_layer in enumerate(self.layers): + if output_hidden_states: + all_hidden_states += (hidden_states,) # type: ignore + + past_key_value = ( + past_key_values[idx] if past_key_values is not None else None + ) + + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + gradient_checkpointing=self.gradient_checkpointing, # send parameters + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) # type: ignore # noqa + + if output_attentions: + all_self_attns += (layer_outputs[1],) # type: ignore # noqa + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) # type: ignore # noqa + + next_cache = next_decoder_cache if use_cache else None + if not return_dict: + return tuple( + v + for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] + if v is not None + ) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +# create new class for attentions gradient checkpoint +class LlamaDecoderLayerWithCheckpointing(LlamaDecoderLayer): + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + gradient_checkpointing: Optional[bool] = False, # add parameters + ) -> Tuple[ + torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]] + ]: + """ + Args: + hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ # noqa + residual = hidden_states + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + if gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + return module( + *inputs, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + return custom_forward + + ( + hidden_states, + self_attn_weights, + present_key_value, + ) = torch.utils.checkpoint.checkpoint( + create_custom_forward(self.self_attn), + hidden_states, + attention_mask, + position_ids, + past_key_value, + ) # type: ignore + else: + hidden_states, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = residual + hidden_states + + # Fully Connected + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + hidden_states + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) # type: ignore + + if use_cache: + outputs += (present_key_value,) # type: ignore + + return outputs # type: ignore + + +class LlamaForCausalLMWithCheckpointing(LlamaForCausalLM): + def __init__(self, config): + super().__init__(config) + if config.use_checkpointing: + self.gradient_checkpointing_enable() + print("use gradient checkpointing") + if config.use_checkpointing and config.checkpoint_only_attention: + self.model = LlamaModelWithWithCheckpointing(config) + print("use model with gradient checkpointing only attention") + else: + self.model = LlamaModel(config) + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() diff --git a/src/model/openthaigpt_pretraining_model/models/nanoGPT/model.py b/src/model/openthaigpt_pretraining_model/models/nanoGPT/model.py new file mode 100644 index 0000000..d28fa6d --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/models/nanoGPT/model.py @@ -0,0 +1,594 @@ +import torch.nn.functional as F +import torch.backends.cuda as cuda +from transformers import AutoConfig +from transformers.models.gpt_neox.modeling_gpt_neox import ( + RotaryEmbedding, + apply_rotary_pos_emb, +) # noqa: F401 + +from typing import Optional, Tuple, Union +import torch +import torch.utils.checkpoint +from torch import nn +from transformers.utils import ( + add_code_sample_docstrings, + logging, +) +from torch.nn import CrossEntropyLoss +from transformers.modeling_outputs import ( + BaseModelOutputWithPastAndCrossAttentions, + CausalLMOutputWithCrossAttentions, +) + +from transformers.models.gpt2.modeling_gpt2 import ( + GPT2Attention as OriginalGPT2Attention, + GPT2Block as OriginalGPT2Block, + GPT2Model as OriginalGPT2Model, + GPT2LMHeadModel as OriginalGPT2LMHeadModel, +) # noqa: E501 + +logger = logging.get_logger(__name__) +_attn_orig = OriginalGPT2Attention._attn + +_CHECKPOINT_FOR_DOC = "gpt2" +_CONFIG_FOR_DOC = "GPT2Config" +ROTARY_PCT = 0.25 +ROTARY_EMB_BASE = 10000 + + +# patch GPT2Attention to use flash_sdp, disable it when doing the inference +def _attn_wrapper(self, query, key, value, attention_mask=None, head_mask=None): + if head_mask is not None: + raise NotImplementedError("head_mask is not implemented for flash_sdp") + is_causal = attention_mask is None + with cuda.sdp_kernel( + enable_flash=True, + enable_math=False, + enable_mem_efficient=False, + ): + attn_out = F.scaled_dot_product_attention( + query=query.half(), + key=key.half(), + value=value.half(), + is_causal=is_causal, + attn_mask=attention_mask, + dropout_p=self.attn_dropout.p, + ).float() + return attn_out, None + + +class GPT2AttentionWithRotary(OriginalGPT2Attention): + def __init__(self, config, is_cross_attention=False, layer_idx=None): + super().__init__(config) + + self.rotary_pct = ROTARY_PCT + self.rotary_emb_base = ROTARY_EMB_BASE + self.use_rotary = config.use_rotary + self.rotary_ndims = int(self.head_dim * self.rotary_pct) + if self.use_rotary: + self.rotary_emb = RotaryEmbedding( + self.rotary_ndims, + config.max_position_embeddings, + base=self.rotary_emb_base, + ) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = False, + output_attentions: Optional[bool] = False, + position_ids: Optional[torch.LongTensor] = None, + ) -> Tuple[Union[torch.Tensor, Tuple[torch.Tensor]], ...]: + if encoder_hidden_states is not None: + if not hasattr(self, "q_attn"): + raise ValueError("If class is used as cross attention") + + query = self.q_attn(hidden_states) + key, value = self.c_attn(encoder_hidden_states).split( + self.split_size, dim=2 + ) + attention_mask = encoder_attention_mask + else: + query, key, value = self.c_attn(hidden_states).split(self.split_size, dim=2) + + query = self._split_heads(query, self.num_heads, self.head_dim) + key = self._split_heads(key, self.num_heads, self.head_dim) + value = self._split_heads(value, self.num_heads, self.head_dim) + ############################### + # START USE ROTARY + ############################### + if self.use_rotary: + # Compute rotary embeddings on rotary_ndims + query_rot = query[ + ..., : self.rotary_ndims + ] # [batch, num_attention_heads, seq_len, head_size] + query_pass = query[..., self.rotary_ndims :] + key_rot = key[..., : self.rotary_ndims] + key_pass = key[..., self.rotary_ndims :] + # Compute token offset for rotary embeddings (when decoding) + seq_len = key.shape[-2] + if layer_past: + seq_len += layer_past[0].shape[-2] + cos, sin = self.rotary_emb(value, seq_len=seq_len) + query, key = apply_rotary_pos_emb( + query_rot, key_rot, cos, sin, position_ids + ) + query = torch.cat((query, query_pass), dim=-1) + key = torch.cat((key, key_pass), dim=-1) + ############################### + # END USE ROTARY + ############################### + if layer_past is not None: + past_key, past_value = layer_past # type: ignore + key = torch.cat((past_key, key), dim=-2) # type: ignore + value = torch.cat((past_value, value), dim=-2) # type: ignore + + if use_cache is True: + present = (key, value) + else: + present = None + + if self.reorder_and_upcast_attn: + attn_output, attn_weights = self._upcast_and_reordered_attn( + query, key, value, attention_mask, head_mask + ) + else: + attn_output, attn_weights = self._attn( + query, key, value, attention_mask, head_mask + ) + + attn_output = self._merge_heads(attn_output, self.num_heads, self.head_dim) + attn_output = self.c_proj(attn_output) + attn_output = self.resid_dropout(attn_output) + + outputs = (attn_output, present) + if output_attentions: + outputs += (attn_weights,) # type: ignore + + return outputs # type: ignore + + +class GPT2BlockWithRotary(OriginalGPT2Block): + def __init__(self, config, layer_idx=None): + super().__init__(config) + self.attn = GPT2AttentionWithRotary(config, layer_idx=layer_idx) + + def forward( + self, + hidden_states: Optional[Tuple[torch.FloatTensor]], + layer_past: Optional[Tuple[torch.Tensor]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = False, + output_attentions: Optional[bool] = False, + position_ids: Optional[torch.LongTensor] = None, + ) -> Union[ + Tuple[torch.Tensor], + Optional[Tuple[torch.Tensor, Tuple[torch.FloatTensor, ...]]], + ]: + residual = hidden_states + hidden_states = self.ln_1(hidden_states) + attn_outputs = self.attn( + hidden_states, + layer_past=layer_past, + attention_mask=attention_mask, + head_mask=head_mask, + use_cache=use_cache, + output_attentions=output_attentions, + position_ids=position_ids, + ) + attn_output = attn_outputs[0] # output_attn: a, present, (attentions) + outputs = attn_outputs[1:] + hidden_states = attn_output + residual + + if encoder_hidden_states is not None: + if not hasattr(self, "crossattention"): + raise ValueError(f"If `encoder_hidden_states` are passed, {self}") + residual = hidden_states + hidden_states = self.ln_cross_attn(hidden_states) + cross_attn_outputs = self.crossattention( + hidden_states, + attention_mask=attention_mask, + head_mask=head_mask, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + output_attentions=output_attentions, + ) + attn_output = cross_attn_outputs[0] + hidden_states = residual + attn_output + outputs = ( + outputs + cross_attn_outputs[2:] + ) # add cross attentions if we output attention weights + + residual = hidden_states + hidden_states = self.ln_2(hidden_states) + feed_forward_hidden_states = self.mlp(hidden_states) + hidden_states = residual + feed_forward_hidden_states + + if use_cache: + outputs = (hidden_states,) + outputs + else: + outputs = (hidden_states,) + outputs[1:] + + return outputs # hidden_states, present, (attentions, cross_attentions) + + +class GPT2ModelWithRotary(OriginalGPT2Model): + def __init__(self, config): + super().__init__(config) + ############################### + # START USE ROTARY BY Remove original self.wpe + ############################### + self.use_rotary = config.use_rotary + if not self.use_rotary: + self.wpe = nn.Embedding(config.max_position_embeddings, self.embed_dim) + else: + del self.wpe + print("Let's use Rotary Positional Encoding") + ############################### + # END USE ROTARY + ############################### + self.h = nn.ModuleList( + [ + GPT2BlockWithRotary(config, layer_idx=i) + for i in range(config.num_hidden_layers) + ] + ) + + @add_code_sample_docstrings( + checkpoint=_CHECKPOINT_FOR_DOC, + output_type=BaseModelOutputWithPastAndCrossAttentions, + config_class=_CONFIG_FOR_DOC, + ) + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPastAndCrossAttentions]: + output_attentions = ( + output_attentions + if output_attentions is not None + else self.config.output_attentions + ) + output_hidden_states = ( + output_hidden_states + if output_hidden_states is not None + else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + if input_ids is not None and inputs_embeds is not None: + raise ValueError( + "You cannot specify both input_ids and inputs_embeds at the same time" + ) + elif input_ids is not None: + input_shape = input_ids.size() + input_ids = input_ids.view(-1, input_shape[-1]) # type: ignore + batch_size = input_ids.shape[0] + elif inputs_embeds is not None: + input_shape = inputs_embeds.size()[:-1] + batch_size = inputs_embeds.shape[0] + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + device = input_ids.device if input_ids is not None else inputs_embeds.device # type: ignore # noqa: E501 + + if token_type_ids is not None: + token_type_ids = token_type_ids.view(-1, input_shape[-1]) # type: ignore + if position_ids is not None: + position_ids = position_ids.view(-1, input_shape[-1]) # type: ignore + + if past_key_values is None: + past_length = 0 + past_key_values = tuple([None] * len(self.h)) # type: ignore + else: + past_length = past_key_values[0][0].size(-2) + if position_ids is None: + position_ids = torch.arange( # type: ignore + past_length, + input_shape[-1] + past_length, + dtype=torch.long, + device=device, + ) + position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1]) # type: ignore # noqa: E501 + + if attention_mask is not None: + if batch_size <= 0: + raise ValueError("batch_size has to be defined and > 0") + attention_mask = attention_mask.view(batch_size, -1) # type: ignore + attention_mask = attention_mask[:, None, None, :] # type: ignore + + attention_mask = attention_mask.to(dtype=self.dtype) # type: ignore + attention_mask = (1.0 - attention_mask) * torch.finfo(self.dtype).min + + if self.config.add_cross_attention and encoder_hidden_states is not None: + ( + encoder_batch_size, + encoder_sequence_length, + _, + ) = encoder_hidden_states.size() + encoder_hidden_shape = (encoder_batch_size, encoder_sequence_length) + if encoder_attention_mask is None: + encoder_attention_mask = torch.ones(encoder_hidden_shape, device=device) # type: ignore # noqa: E501 + encoder_attention_mask = self.invert_attention_mask(encoder_attention_mask) + else: + encoder_attention_mask = None + + head_mask = self.get_head_mask(head_mask, self.config.n_layer) + + if inputs_embeds is None: + inputs_embeds = self.wte(input_ids) + + ############################### + # PREPARE USE ROTARY BY Remove position_embeds + ############################### + if not self.use_rotary: + position_embeds = self.wpe(position_ids) + hidden_states = inputs_embeds + position_embeds + else: + hidden_states = inputs_embeds + ############################### + # END USE ROTARY BY Remove position_embeds + ############################### + if token_type_ids is not None: + token_type_embeds = self.wte(token_type_ids) + hidden_states = hidden_states + token_type_embeds + + hidden_states = self.drop(hidden_states) + + output_shape = input_shape + (hidden_states.size(-1),) + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once("use_cache=True is incompatible") + use_cache = False + + presents = () if use_cache else None + all_self_attentions = () if output_attentions else None + all_cross_attentions = ( + () if output_attentions and self.config.add_cross_attention else None + ) + all_hidden_states = () if output_hidden_states else None + for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)): # type: ignore # noqa: E501 + # Model parallel + if self.model_parallel: + torch.cuda.set_device(hidden_states.device) + if layer_past is not None: + layer_past = tuple( # type: ignore + past_state.to(hidden_states.device) for past_state in layer_past + ) + if attention_mask is not None: + attention_mask = attention_mask.to(hidden_states.device) # type: ignore # noqa: E501 + if isinstance(head_mask, torch.Tensor): + head_mask = head_mask.to(hidden_states.device) # type: ignore + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) # type: ignore + + if self.gradient_checkpointing and self.training: + + def create_custom_forward(module): + def custom_forward(*inputs): + # None for past_key_value + return module( + *inputs, + use_cache, + output_attentions, + position_ids=position_ids, + ) + + return custom_forward + + outputs = torch.utils.checkpoint.checkpoint( + create_custom_forward(block), + hidden_states, + None, + attention_mask, + head_mask[i], # type: ignore + encoder_hidden_states, + encoder_attention_mask, + ) + else: + outputs = block( + hidden_states, + layer_past=layer_past, + attention_mask=attention_mask, + head_mask=head_mask[i], # type: ignore + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + position_ids=position_ids, + ) + + hidden_states = outputs[0] + if use_cache is True: + presents = presents + (outputs[1],) # type: ignore + + if output_attentions: + all_self_attentions = all_self_attentions + ( # type: ignore + outputs[2 if use_cache else 1], + ) + if self.config.add_cross_attention: + all_cross_attentions = all_cross_attentions + ( # type: ignore + outputs[3 if use_cache else 2], + ) + + if self.model_parallel: + for k, v in self.device_map.items(): + if i == v[-1] and "cuda:" + str(k) != self.last_device: + hidden_states = hidden_states.to("cuda:" + str(k + 1)) + + hidden_states = self.ln_f(hidden_states) + + hidden_states = hidden_states.view(output_shape) + # Add last hidden state + if output_hidden_states: + all_hidden_states = all_hidden_states + (hidden_states,) # type: ignore + + if not return_dict: + return tuple( + v + for v in [ + hidden_states, + presents, + all_hidden_states, + all_self_attentions, + all_cross_attentions, + ] + if v is not None + ) + + return BaseModelOutputWithPastAndCrossAttentions( + last_hidden_state=hidden_states, + past_key_values=presents, + hidden_states=all_hidden_states, + attentions=all_self_attentions, + cross_attentions=all_cross_attentions, + ) + + +class GPT2LMHeadModelWithRotary(OriginalGPT2LMHeadModel): + def __init__(self, config): + super().__init__(config) + self.transformer = GPT2ModelWithRotary(config) + + @add_code_sample_docstrings( + checkpoint=_CHECKPOINT_FOR_DOC, + output_type=CausalLMOutputWithCrossAttentions, + config_class=_CONFIG_FOR_DOC, + ) + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None, + attention_mask: Optional[torch.FloatTensor] = None, + token_type_ids: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + head_mask: Optional[torch.FloatTensor] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + encoder_hidden_states: Optional[torch.Tensor] = None, + encoder_attention_mask: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithCrossAttentions]: + return_dict = ( + return_dict if return_dict is not None else self.config.use_return_dict + ) + + transformer_outputs = self.transformer( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + token_type_ids=token_type_ids, + position_ids=position_ids, + head_mask=head_mask, + inputs_embeds=inputs_embeds, + encoder_hidden_states=encoder_hidden_states, + encoder_attention_mask=encoder_attention_mask, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = transformer_outputs[0] + + if self.model_parallel: + torch.cuda.set_device(self.transformer.first_device) + hidden_states = hidden_states.to(self.lm_head.weight.device) + + lm_logits = self.lm_head(hidden_states) + + loss = None + if labels is not None: + labels = labels.to(lm_logits.device) # type: ignore + shift_logits = lm_logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + loss_fct = CrossEntropyLoss() + loss = loss_fct( + shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1) + ) + + if not return_dict: + output = (lm_logits,) + transformer_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return CausalLMOutputWithCrossAttentions( + loss=loss, + logits=lm_logits, + past_key_values=transformer_outputs.past_key_values, + hidden_states=transformer_outputs.hidden_states, + attentions=transformer_outputs.attentions, + cross_attentions=transformer_outputs.cross_attentions, + ) + + +def make_model( + pretrained_name, + max_tokens, + tokenizer, + use_flash, + use_checkpointing, + device, + use_rotary, +): + config = AutoConfig.from_pretrained( + pretrained_name, + vocab_size=len(tokenizer), + n_ctx=max_tokens, + bos_token_id=tokenizer.bos_token_id, + eos_token_id=tokenizer.eos_token_id, + pad_token_id=tokenizer.pad_token_id, + optimize_cuda_cache=True, + ) + ############################### + # PREPARE USE ROTARY BY CONFIG + ############################### + config.use_rotary = use_rotary + ############################### + # END PREPARE USE ROTARY BY CONFIG + ############################### + model = GPT2LMHeadModelWithRotary(config).to(device) + + GPT2AttentionWithRotary._attn = _attn_orig + if use_flash: + print("Use Flash Attention") + GPT2AttentionWithRotary._attn = _attn_wrapper + + model.resize_token_embeddings(len(tokenizer)) + + # https://www.kaggle.com/code/vad13irt/optimization-approaches-for-transformers + if use_checkpointing: + print("Use Gradient Checkpointing") + model.gradient_checkpointing_enable() + print(model) + model_size = sum(t.numel() for t in model.parameters()) + print(f"GPT-2 size: {model_size/1000**2:.1f}M parameters") + + model_size = sum(p.numel() for p in model.parameters() if p.requires_grad) + print(f"GPT-2 size requires_grad: {model_size/1000**2:.1f}M parameters") + + return model diff --git a/src/model/openthaigpt_pretraining_model/optimizers/__init__.py b/src/model/openthaigpt_pretraining_model/optimizers/__init__.py new file mode 100644 index 0000000..22e4632 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/optimizers/__init__.py @@ -0,0 +1,66 @@ +import deepspeed +from lion_pytorch import Lion +import torch.optim as optim +from bitsandbytes.optim import Adam8bit +from .constants import ( + ADAMW, + LION, + ADAM1BIT, + ADAM8BIT, +) + + +def get_optimizer( + model, + optimizer_configuration, + batch_size: int = 1, + offload_optimizer: bool = False, + offload_parameters: bool = False, +): + optimizer_name = optimizer_configuration.name + if offload_optimizer or offload_parameters: + if optimizer_name == ADAMW: + opt = deepspeed.ops.adam.DeepSpeedCPUAdam( + model.parameters(), + bias_correction=True, + amsgrad=False, + adamw_mode=True, + fp32_optimizer_states=True, + **optimizer_configuration.hyps, + ) + else: + raise NotImplementedError("Optimizer does not support") + else: + if optimizer_name == LION: + opt = Lion( + model.parameters(), + **optimizer_configuration.hyps, + ) + elif optimizer_name == ADAMW: + opt = optim.AdamW( # type: ignore + params=model.parameters(), + **optimizer_configuration.hyps, + ) + elif optimizer_name == ADAM8BIT: + opt = Adam8bit( + params=model.parameters(), + **optimizer_configuration.hyps, + ) + elif optimizer_name == ADAM1BIT: + config_params = { + "train_batch_size": batch_size, + "optimizer": { + "type": "OneBitAdam", + "params": { + **optimizer_configuration.hyps, + }, + }, + } + model, opt, _, _ = deepspeed.initialize( + model=model, + model_parameters=model.parameters(), + config_params=config_params, + ) + else: + raise NotImplementedError("Optimizer does not support") + return model, opt diff --git a/src/model/openthaigpt_pretraining_model/optimizers/constants.py b/src/model/openthaigpt_pretraining_model/optimizers/constants.py new file mode 100644 index 0000000..0e3b4bf --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/optimizers/constants.py @@ -0,0 +1,4 @@ +ADAMW = "adamw" +LION = "lion" +ADAM8BIT = "adam8bit" +ADAM1BIT = "adam1bit" diff --git a/src/model/openthaigpt_pretraining_model/pl_trainer/__init__.py b/src/model/openthaigpt_pretraining_model/pl_trainer/__init__.py new file mode 100644 index 0000000..1b4ab4e --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/pl_trainer/__init__.py @@ -0,0 +1 @@ +from .pl_trainer import causal_pretraining # type: ignore # noqa: F401 diff --git a/src/model/openthaigpt_pretraining_model/pl_trainer/constants.py b/src/model/openthaigpt_pretraining_model/pl_trainer/constants.py new file mode 100644 index 0000000..1f45e1f --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/pl_trainer/constants.py @@ -0,0 +1,5 @@ +TRAIN_LOSS_MONITOR = "train_loss" +VAL_LOSS_MONITOR = "val_loss" +TRAIN_PERPLEXITY_MONITOR = "train_perplexity" +VAL_PERPLEXITY_MONITOR = "val_perplexity" +LR_STEP_INTERVAL = "step" diff --git a/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/__init__.py b/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/__init__.py new file mode 100644 index 0000000..3d28653 --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/__init__.py @@ -0,0 +1,46 @@ +from typing import Iterable +from .constants import OPTIMIZERS, SCHEDULERS + + +def get_optimizer(parameters: Iterable, optimizer_config): + """ + Description: Get pytorch optimizers + Args: + parameters: Model parameters + optimizer_config: Optimizer config including + `name` and `hyps` + Returns: + optimizer: Pytorch optimizer + """ + optimizer_module = OPTIMIZERS.get(optimizer_config.name, None) + if optimizer_module is None: + raise ValueError(f"No optimizer name `{optimizer_config.name}`") + return optimizer_module(parameters, **optimizer_config.hyps) + + +def get_scheduler( + optimizer, + base_lr: float, + total_steps: int, + scheduler_config, +): + """ + Description: Get pytorch scheduler + Args: + optimizer: Pytorch optimizer + base_lr: Base learning rate + total_steps: Total training steps + scheduler_config: Scheduler config including + `name` and `hyps` + Returns: + scheduler: Pytorch scheduler + """ + scheduler_module = SCHEDULERS.get(scheduler_config.name, None) + if scheduler_module is None: + raise ValueError(f"No scheduler name `{scheduler_config.name}`") + return scheduler_module( + optimizer, + base_lr=base_lr, + total_steps=total_steps, + **scheduler_config.hyps, + ) diff --git a/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/constants.py b/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/constants.py new file mode 100644 index 0000000..359d58a --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/constants.py @@ -0,0 +1,24 @@ +import torch.optim as optim +from .scheduler import ( + ConstantLRScheduler, + CosineLRScheduler, + WarmupAndDecayScheduler, +) + +ADAM_OPTIMIZER = "adam" +ADAMW_OPTIMIZER = "adamw" +CONSTANT_SCHEDULER = "const_lr" +COSINE_SCHEDULER = "cosine_lr" +WARMUP_AND_DECAY_SCHEDULER = "warmup_and_decay_lr" + + +OPTIMIZERS = { + ADAM_OPTIMIZER: optim.Adam, + ADAMW_OPTIMIZER: optim.AdamW, +} + +SCHEDULERS = { + CONSTANT_SCHEDULER: ConstantLRScheduler, + COSINE_SCHEDULER: CosineLRScheduler, + WARMUP_AND_DECAY_SCHEDULER: WarmupAndDecayScheduler, +} diff --git a/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/scheduler.py b/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/scheduler.py new file mode 100644 index 0000000..c1b921e --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/pl_trainer/optimizer/scheduler.py @@ -0,0 +1,149 @@ +# Implement from https://github.com/mlfoundations/open_clip/blob/main/src/training/scheduler.py # noqa: E501 +import numpy as np +import torch +import math + +INITIAL_LR = "initial_lr" + + +def _warmup_lr( + base_lr: float, + warmup_steps: int, + step: int, +): + """ + Description: Warmup learning rate scheduler function + Args: + base_lr: Base learning rate + warmup_steps: Warmup steps + step: Current step + """ + return base_lr * (step + 1) / warmup_steps + + +class ConstantLRScheduler(torch.optim.lr_scheduler._LRScheduler): + """ + Warmup learning rate until `total_steps` + + Args: + optimizer (Optimizer): wrapped optimizer. + configs (DictConfig): configuration set. + """ + + def __init__( + self, + optimizer, + base_lr, + warmup_steps, + total_steps, + ) -> None: + self.base_lr = base_lr + self.warmup_steps = warmup_steps + self.total_steps = total_steps + + init_lr = self.calculate_new_lr(0) + for param_group in optimizer.param_groups: + param_group[INITIAL_LR] = init_lr + + super(ConstantLRScheduler, self).__init__(optimizer, init_lr) + + def calculate_new_lr(self, step): + if step < self.warmup_steps: + lr = _warmup_lr(self.base_lr, self.warmup_steps, step) + else: + lr = self.base_lr + return lr + + def get_lr(self): + new_lr = self.calculate_new_lr(self.optimizer._step_count) + return [new_lr for group in self.optimizer.param_groups] + + +class CosineLRScheduler(torch.optim.lr_scheduler._LRScheduler): + """ + Warmup learning rate until `total_steps` + + Args: + optimizer (Optimizer): wrapped optimizer. + configs (DictConfig): configuration set. + """ + + def __init__( + self, + optimizer, + base_lr, + warmup_steps, + total_steps, + ) -> None: + self.base_lr = base_lr + self.warmup_steps = warmup_steps + self.total_steps = total_steps + + init_lr = self.calculate_new_lr(0) + for param_group in optimizer.param_groups: + param_group[INITIAL_LR] = init_lr + + super(CosineLRScheduler, self).__init__(optimizer, init_lr) + + def calculate_new_lr(self, step): + if step < self.warmup_steps: + lr = _warmup_lr(self.base_lr, self.warmup_steps, step) + else: + e = step - self.warmup_steps + es = self.total_steps - self.warmup_steps + lr = 0.5 * (1 + np.cos(np.pi * e / es)) * self.base_lr + return lr + + def get_lr(self): + new_lr = self.calculate_new_lr(self.optimizer._step_count) + return [new_lr for group in self.optimizer.param_groups] + + +class WarmupAndDecayScheduler(torch.optim.lr_scheduler._LRScheduler): + """ + Warmup learning rate until `total_steps` + + Args: + optimizer (Optimizer): wrapped optimizer. + configs (DictConfig): configuration set. + """ + + def __init__( + self, + optimizer, + base_lr, + min_lr, + warmup_steps, + decay_steps, + total_steps, + ) -> None: + self.base_lr = base_lr + self.min_lr = min_lr + self.warmup_steps = warmup_steps + self.decay_steps = decay_steps + self.total_steps = total_steps + + init_lr = self.calculate_new_lr(0) + for param_group in optimizer.param_groups: + param_group[INITIAL_LR] = init_lr + + super(WarmupAndDecayScheduler, self).__init__(optimizer, init_lr) + + def calculate_new_lr(self, step): + # 1) linear warmup for warmup_steps + if step < self.warmup_steps: + return self.base_lr * step / self.warmup_steps + # 2) if step > decay_steps, return min learning rate + if step > self.decay_steps: + return self.min_lr + # 3) in between, use cosine decay down to min learning rate + decay_ratio = (step - self.warmup_steps) / ( + self.decay_steps - self.warmup_steps + ) + assert 0 <= decay_ratio <= 1 + coeff = 0.5 * (1.0 + math.cos(math.pi * decay_ratio)) # coeff ranges 0..1 + return self.min_lr + coeff * (self.base_lr - self.min_lr) + + def get_lr(self): + new_lr = self.calculate_new_lr(self.optimizer._step_count) + return [new_lr for group in self.optimizer.param_groups] diff --git a/src/model/openthaigpt_pretraining_model/pl_trainer/pl_trainer.py b/src/model/openthaigpt_pretraining_model/pl_trainer/pl_trainer.py new file mode 100644 index 0000000..bccd9cd --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/pl_trainer/pl_trainer.py @@ -0,0 +1,229 @@ +import os +import torch + +import pytorch_lightning as pl +from pytorch_lightning.callbacks import LearningRateMonitor +from pytorch_lightning.loggers import TensorBoardLogger, WandbLogger +from pytorch_lightning.callbacks import ModelCheckpoint +from pytorch_lightning.strategies import DeepSpeedStrategy + +from datasets import load_from_disk + +from ..models import load_model_and_tokenizer, load_lora +from ..utils import compute_perplexity + +from .optimizer import ( + get_optimizer, + get_scheduler, +) +from ..data_wrapper import ( + HF_TOKENIZER_INPUT_IDS_NAME, +) + +from .constants import ( + TRAIN_LOSS_MONITOR, + VAL_LOSS_MONITOR, + TRAIN_PERPLEXITY_MONITOR, + VAL_PERPLEXITY_MONITOR, + LR_STEP_INTERVAL, +) + + +class CausalModelPL(pl.LightningModule): + def __init__( + self, + trainer_config=None, + model_config=None, + lora_config=None, + optimizer_config=None, + scheduler_config=None, + ): + super().__init__() + # Saving hyperparameters + self.save_hyperparameters() + _, self.model = load_model_and_tokenizer(model_config) + if lora_config is not None: + self.model = load_lora( + self.model, + lora_config, + model_config.name, + ) + + def forward( + self, + input_ids, + ): + return self.model( + input_ids=input_ids, + labels=input_ids, + ) + + def configure_optimizers(self): + optimizer = get_optimizer( + self.parameters(), + optimizer_config=self.hparams.optimizer_config, + ) + optimizers_config = { + "optimizer": optimizer, + "monitor": VAL_LOSS_MONITOR, + } + if self.hparams.scheduler_config is not None: + optimizers_config["lr_scheduler"] = { + "scheduler": get_scheduler( + optimizer, + base_lr=self.hparams.optimizer_config.hyps.lr, + total_steps=self.hparams.trainer_config.max_steps, + scheduler_config=self.hparams.scheduler_config, + ), + "interval": LR_STEP_INTERVAL, + } + return optimizers_config + + def training_step(self, batch, batch_idx): + input_ids = batch[HF_TOKENIZER_INPUT_IDS_NAME] + + output = self.forward( + input_ids, + ) + loss = output.loss + perplexity = compute_perplexity(loss) + self.log(TRAIN_LOSS_MONITOR, loss, prog_bar=True, sync_dist=True) + self.log(TRAIN_PERPLEXITY_MONITOR, perplexity, prog_bar=True, sync_dist=True) + return loss + + def validation_step(self, batch, batch_idx): + input_ids = batch[HF_TOKENIZER_INPUT_IDS_NAME] + + output = self.forward( + input_ids, + ) + loss = output.loss + perplexity = compute_perplexity(loss) + self.log(VAL_LOSS_MONITOR, loss, prog_bar=True, sync_dist=True) + self.log(VAL_PERPLEXITY_MONITOR, perplexity, prog_bar=True, sync_dist=True) + + +def causal_pretraining( + name, + model_config, + optimizer_config, + scheduler_config, + trainer_config, + lora_config, + deepspeed_config, + dataset_config, + checkpointing_config, + logging_config, +): + """ + Args: + name: Name of experiments + model_config: Model configuration + optimizer_config: Optimizer configuration + scheduler_config: Scheduler configuration + trainer_config: Trainer configuration + lora_config: LORA configuration + deepspeed_config: Deepspeed configuration + dataset_config: Dataset configuration + checkpointing_config: Checkpointing configuration + logging_config: Logging configuration + """ + + torch.manual_seed(dataset_config.shuffle_seed) + + hf_train_dataset = load_from_disk(dataset_config.training_dataset).with_format( + "torch" + ) + + train_dataloaders = torch.utils.data.DataLoader( + hf_train_dataset, + batch_size=trainer_config.batch_size, + num_workers=dataset_config.num_workers, + shuffle=True, + ) + if dataset_config.validation_dataset: + hf_validation_dataset = load_from_disk( + dataset_config.validation_dataset + ).with_format("torch") + validation_dataloaders = torch.utils.data.DataLoader( + hf_validation_dataset, + batch_size=trainer_config.batch_size, + num_workers=dataset_config.num_workers, + ) + else: + validation_dataloaders = None + + if trainer_config.resume_from_checkpoint: + model = CausalModelPL.load_from_checkpoint( + trainer_config.resume_from_checkpoint + ) + else: + model = CausalModelPL( + trainer_config=trainer_config, + model_config=model_config, + lora_config=lora_config, + optimizer_config=optimizer_config, + scheduler_config=scheduler_config, + ) + loggers = [] + if logging_config.log_dir is not None: + loggers.append(TensorBoardLogger(logging_config.log_dir, name=name)) + if logging_config.use_wandb: + loggers.append(WandbLogger(name=name, offline=True)) + + lr_monitor = ( + LearningRateMonitor(logging_interval=LR_STEP_INTERVAL) + if logging_config.log_dir or logging_config.use_wandb + else None + ) + checkpoint_step_callback = ( + ModelCheckpoint( + dirpath=os.path.join(checkpointing_config.save_dir, "steps"), + filename=name + "-{epoch:03d}-{step:07d}", + every_n_train_steps=checkpointing_config.save_steps, + save_top_k=checkpointing_config.save_top_k_steps, + monitor=VAL_LOSS_MONITOR, + ) + if checkpointing_config.save_dir and checkpointing_config.save_steps + else None + ) + checkpoint_epoch_callback = ( + ModelCheckpoint( + dirpath=os.path.join(checkpointing_config.save_dir, "epoch"), + filename=name + "-{epoch:03d}", + ) + if checkpointing_config.save_dir + else None + ) + callbacks = [checkpoint_step_callback, checkpoint_epoch_callback, lr_monitor] + if deepspeed_config is None: + strategy = "ddp_find_unused_parameters_true" + else: + strategy = DeepSpeedStrategy( + **deepspeed_config, + ) + trainer = pl.Trainer( + accelerator="gpu", + precision=trainer_config.precision, + max_steps=trainer_config.max_steps, + num_nodes=trainer_config.num_nodes, + devices=trainer_config.num_gpus, + accumulate_grad_batches=trainer_config.accumulate_grad_batches, + logger=loggers, + log_every_n_steps=logging_config.log_steps, + callbacks=[callback for callback in callbacks if callback], + strategy=strategy, + ) + trainer.fit( + model, + train_dataloaders=train_dataloaders, + val_dataloaders=validation_dataloaders, + ckpt_path=trainer_config.resume_from_checkpoint, + ) + # Save last chpt + trainer.save_checkpoint( + os.path.join( + checkpointing_config.save_dir, + f"{name}-last.ckpt", + ) + ) diff --git a/src/model/openthaigpt_pretraining_model/tokenizers/data_preprocessing.py b/src/model/openthaigpt_pretraining_model/tokenizers/data_preprocessing.py new file mode 100644 index 0000000..f2978bc --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/tokenizers/data_preprocessing.py @@ -0,0 +1,164 @@ +import os +from typing import Optional, Union, Generator, Dict +from tqdm import tqdm +import sentencepiece as spm +from datasets import load_dataset, Dataset +from transformers import PreTrainedTokenizer + + +# CONSTANTS +DOC_ID = "id" +DOC_TEXT = "text" +USER_DEFINED_SYMBOLS = [""] + + +class BaseTokenizer: + def __init__(self, tokenizer_model_path: str) -> None: + self.tokenizer_model_path = tokenizer_model_path + + @staticmethod + def preprocess_text(text: str) -> str: + # Custom + return text + + +class SPMTokenizerWrapper(BaseTokenizer): + def __init__(self, tokenizer_model_path: str) -> None: + super().__init__(tokenizer_model_path) + + # load the tokenizer model + self.tokenizer = spm.SentencePieceProcessor() + self.tokenizer.load(self.tokenizer_model_path) + self.tokenizer.set_user_defined_symbols(USER_DEFINED_SYMBOLS) + + # define a function to tokenize the text + def tokenize_text(self, text: str) -> str: + text = self.preprocess_text(text) + return self.tokenizer.encode(text, out_type=int) + + +class FastTokenizerWrapper(BaseTokenizer): + def __init__(self, tokenizer_model_path: str) -> None: + super().__init__(tokenizer_model_path) + + # load the tokenizer model + self.tokenizer = PreTrainedTokenizer.from_pretrained(self.tokenizer_model_path) + self.tokenizer.add_tokens(USER_DEFINED_SYMBOLS) + + # define a function to tokenize the text + def tokenize_text(self, text: str) -> str: + text = self.preprocess_text(text) + return self.tokenizer.encode(text) + + +def chunk_generator(file_path: str, chunk_size: int = 1024 * 1024 * 1024): + """ + Generator that yields a file in fixed size chunks. + """ + with open(file_path, "rb") as f: + while True: + data = f.read(chunk_size) + if not data: + break + yield data + + +def text_generator( + data_path: str, chunk_size: int = 1024 * 1024 * 1024 +) -> Generator[Dict[str, str], None, None]: + """ + Generator that yields a text document as a dictionary with a "text" key. + """ + for filename in os.listdir(data_path): + file_path = f"{data_path}/{filename}" + for file_chunk in chunk_generator(file_path, chunk_size): + text = file_chunk.decode("utf-8") + yield {"text": text} + + +def tokenize_dataset( + tokenizer_model_path: str, + output_path: str, + tokenizer_model_type: str = "spm", + num_docs: Optional[Union[str, int]] = 5000, + num_proc: Optional[int] = os.cpu_count(), + batch_size: int = 100_000, + is_slurm: bool = False, + load_dataset_path: str = "oscar", + load_dataset_name: str = "unshuffled_deduplicated_th", + load_dataset_local_path: Optional[str] = None, + chunk_doc_size: int = 1024 * 1024 * 1024, +) -> None: + """ + Tokenizes a dataset using a given tokenizer model and saves the tokenized dataset to disk. + + Args: + tokenizer_model_path (str): The path to the tokenizer model. + output_path (str): The path to save the tokenized dataset. + tokenizer_model_type (str): type of tokenizer model (`spm`: sentencepiece, `fast`: `AutoTokenizer`). + num_docs (int, optional): The number of documents to process. Defaults to 5000. + num_proc (int, optional): The number of processes to use for multiprocessing. Defaults to the number of CPUs on the machine. + batch_size (int, optional): The batch size to use when tokenizing the dataset. Defaults to 100_000. + is_slurm (bool, optional): Whether to use SLURM or not. Defaults to False. + load_dataset_path (str, optional): The path to the dataset to load. Defaults to "oscar". + load_dataset_name (str, optional): The name of the dataset to load. Defaults to "unshuffled_deduplicated_th". + load_dataset_local_path (str, optional): The local path to the dataset to load. Defaults to None. + chunk_doc_size (int, optional): chunk size of each doc for generator + + Returns: + None + """ # noqa: E501 + + tokenizer: Union[SPMTokenizerWrapper, FastTokenizerWrapper] + if tokenizer_model_type == "spm": + tokenizer = SPMTokenizerWrapper(tokenizer_model_path) + elif tokenizer_model_type == "fast": + tokenizer = FastTokenizerWrapper(tokenizer_model_path) + else: + raise ValueError("Invalid tokenizer_model_type") + + if load_dataset_local_path is None: + if not is_slurm: + text_dataset = load_dataset( + path=load_dataset_path, + name=load_dataset_name, + split="train", + streaming=not is_slurm, + ) + + num_docs = len(text_dataset) if num_docs is None else num_docs + new_dataset: dict = {DOC_ID: [], DOC_TEXT: []} + for item in tqdm(text_dataset.shuffle().take(num_docs)): + new_dataset[DOC_ID].append(item[DOC_ID]) + new_dataset[DOC_TEXT].append(item[DOC_TEXT]) + text_dataset = Dataset.from_dict(new_dataset) + + else: + num_docs = "" if num_docs is None else num_docs + text_dataset = load_dataset( + path=load_dataset_path, + name=load_dataset_name, + split=f"train[:{num_docs}]", + ) + + else: + # create a dataset from the generator + text_dataset = Dataset.from_generator( + text_generator, + gen_kwargs={ + "data_path": load_dataset_local_path, + "chunk_size": chunk_doc_size, + }, + ) + + # use the map method to tokenize the text and add it to a new column in the dataset + tokenized_dataset = text_dataset.map( + function=lambda example: { + "text_tokens": tokenizer.tokenize_text(example["text"]) + }, + batched=True, + batch_size=batch_size, + num_proc=num_proc, + ) + + tokenized_dataset.save_to_disk(output_path) diff --git a/src/model/openthaigpt_pretraining_model/tokenizers/spm_trainer.py b/src/model/openthaigpt_pretraining_model/tokenizers/spm_trainer.py new file mode 100644 index 0000000..6c2e89e --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/tokenizers/spm_trainer.py @@ -0,0 +1,164 @@ +import os +from typing import Optional, Union +from tqdm import tqdm +import sentencepiece as spm +from transformers import LlamaTokenizer +from datasets import load_dataset, load_from_disk, Dataset + +# CONSTANTS +PREPARE_DATASETS_KEY = "text_processed" +DOC_ID = "id" +DOC_TEXT = "text" +EOS_TOKEN = "" +BOS_TOKEN = "" +UNK_TOKEN = "" + +SPM_MODE = "spm" +BPE_MODE = "bpe" + + +def prepare_datasets(texts: dict) -> dict: + """ + Preprocesses a list of text documents and returns a dictionary with a single key 'PREPARE_DATASETS_KEY' + that maps to the preprocessed texts. + + Args: + texts (dict): A dictionary containing a key 'DOC_TEXT' that maps to a list of text documents. + + Returns: + dict: A dictionary with a single key 'PREPARE_DATASETS_KEY' that maps to a list of preprocessed text documents. + """ # noqa: E501 + preapared_texts = [] + for text in texts[DOC_TEXT]: # for every doc + # write custom preprocessing + preapared_texts.append(text) + + return {PREPARE_DATASETS_KEY: preapared_texts} + + +class DataSetColumnIterator: + def __init__(self, dataset, column_name: str): + self.dataset = iter(dataset) + self.column_name = column_name + + def __iter__(self): + for item in self.dataset: + try: + yield item[self.column_name] + except KeyError: + raise ValueError( + f"Column '{self.column_name}' is not a valid index for the dataset" + ) + + +def load_local_dataset(data_type, local_path): + if data_type is None: + text_dataset = load_from_disk(local_path)["train"] + else: + data_files = { + "train": [f"{local_path}/{filename}" for filename in os.listdir(local_path)] + } + text_dataset = load_dataset( + data_type, + data_files=data_files, + split="train", + streaming=True, + ) + + return text_dataset + + +def train_tokenizer( + output_path: str, + vocab_size: int, + num_docs: Optional[Union[str, int]] = None, + num_proc: Optional[int] = os.cpu_count(), + streaming: bool = True, + load_dataset_path: str = "oscar", + load_dataset_name: str = "unshuffled_deduplicated_th", + load_dataset_local_path: Optional[str] = None, + load_dataset_data_type: Optional[str] = None, + large_corpus: bool = False, + mode: str = SPM_MODE, +) -> None: + """ + Train a SentencePiece tokenizer on a large text dataset. + + Args: + output_path (str): The path and prefix to use when saving the trained tokenizer. + vocab_size (int): The size of the vocabulary to use when training the tokenizer. + num_docs (int, optional): The number of documents to use from the input dataset. + num_proc (int, optional): The number of CPU cores to use when training the tokenizer. Defaults to the number of available CPU cores. + streaming (bool, optional): Whether the code is running on a Slurm cluster. Defaults to False. + load_dataset_path (str, optional): The name of the Hugging Face dataset to load. Defaults to "oscar". + load_dataset_name (str, optional): The name of the dataset split to use. Defaults to "unshuffled_deduplicated_th". + load_dataset_local_path (str, optional): The path to a local directory containing the input data. If specified, the Hugging Face dataset is not used. Defaults to None. + load_dataset_data_type (str, optional): The file type of the input data if using a local directory. Defaults to "csv". + + Returns: + None + """ # noqa: E501 + + if not (mode == SPM_MODE or mode == BPE_MODE): + KeyError(f"mode mush be {SPM_MODE} or {BPE_MODE}") + + if load_dataset_local_path is None: + if streaming: + text_dataset = load_dataset( + path=load_dataset_path, + name=load_dataset_name, + split="train", + streaming=streaming, + ) + + num_docs = len(text_dataset) if num_docs is None else num_docs + + new_dataset: dict = {DOC_ID: [], DOC_TEXT: []} + for item in tqdm(text_dataset.shuffle().take(num_docs)): + new_dataset[DOC_ID].append(item[DOC_ID]) + new_dataset[DOC_TEXT].append(item[DOC_TEXT]) + text_dataset = Dataset.from_dict(new_dataset) + + else: + num_docs = "" if num_docs is None else num_docs + + text_dataset = load_dataset( + path=load_dataset_path, + name=load_dataset_name, + split=f"train[:{num_docs}]", + ) + + text_dataset = text_dataset.to_iterable_dataset() + + else: + # Stream from local files + text_dataset = load_local_dataset( + load_dataset_data_type, load_dataset_local_path + ) + + text_processed_dataset = text_dataset.map( + function=prepare_datasets, + batched=True, + ) + + os.makedirs(output_path, exist_ok=True) + + spm.SentencePieceTrainer.train( + sentence_iterator=iter( + DataSetColumnIterator(text_processed_dataset, PREPARE_DATASETS_KEY) + ), + model_prefix=output_path + "/spm_tokenizer", + vocab_size=vocab_size, + user_defined_symbols=[], + num_threads=num_proc, + train_extremely_large_corpus=large_corpus, + model_type=mode, + ) + + tokenizer = LlamaTokenizer(vocab_file=output_path + "/spm_tokenizer.model") + + tokenizer.eos_token = EOS_TOKEN + tokenizer.bos_token = BOS_TOKEN + tokenizer.unk_token = UNK_TOKEN + + tokenizer.save_pretrained(output_path) diff --git a/src/model/openthaigpt_pretraining_model/utils.py b/src/model/openthaigpt_pretraining_model/utils.py new file mode 100644 index 0000000..239f54d --- /dev/null +++ b/src/model/openthaigpt_pretraining_model/utils.py @@ -0,0 +1,30 @@ +import random +import numpy as np +import torch +import hydra +from pathlib import Path + + +def seed_everything(seed): + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + np.random.seed(seed) + random.seed(seed) + + +def compute_perplexity(loss: torch.Tensor) -> float: + return torch.exp(loss).item() + + +def load_hydra_config(config_file: str): + config_file_path = Path(config_file) + with hydra.initialize( + config_path=str(config_file_path.parent), + job_name=config_file_path.stem, + version_base=None, + ): + config = hydra.compose(config_name=config_file_path.stem) + return config diff --git a/src/model/pyproject.toml b/src/model/pyproject.toml new file mode 100644 index 0000000..72cb775 --- /dev/null +++ b/src/model/pyproject.toml @@ -0,0 +1,34 @@ +[build-system] +requires = [ + "setuptools>=40.8.0", + "wheel" +] + +[project] +name = "openthaigpt_pretraining_model" +version = "0.1.0" +description = "OpenThaiGPT Pretraining Task." +readme = "README.md" +requires-python = ">=3.8" +classifiers = [ + "Programming Language :: Python :: 3", +] + +dependencies = [ + "xformers>=0.0.18", + "llama@git+https://github.com/facebookresearch/llama.git", + "sentencepiece>=0.1.98", + "fairscale>=0.4.13", + "lion-pytorch>=0.0.7", + "transformers>=4.28.1", + "datasets>=2.12.0", + "zstandard>=0.21.0", + "protobuf==3.20.0", + "lightning>=2.0.2", + "wandb>=0.15.2", + "bitsandbytes", + "deepspeed>=0.9.2", + "peft>=0.3.0", + "scipy<2.0.0", + "tensorboard==2.*", +] \ No newline at end of file diff --git a/src/model/scripts/README.md b/src/model/scripts/README.md new file mode 100644 index 0000000..82916c1 --- /dev/null +++ b/src/model/scripts/README.md @@ -0,0 +1 @@ +# Scripts \ No newline at end of file diff --git a/src/model/scripts/bpe_training/README.md b/src/model/scripts/bpe_training/README.md new file mode 100644 index 0000000..99da4f2 --- /dev/null +++ b/src/model/scripts/bpe_training/README.md @@ -0,0 +1,2 @@ +For tokenization dictionary, try +- [words_th.tx](https://github.com/PyThaiNLP/pythainlp/blob/dev/pythainlp/corpus/words_th.txt) from [PyThaiNLP](https://github.com/PyThaiNLP/pythainlp/) - around 62,000 words (CC0) diff --git a/src/model/scripts/bpe_training/sp_token.json b/src/model/scripts/bpe_training/sp_token.json new file mode 100644 index 0000000..a720a9f --- /dev/null +++ b/src/model/scripts/bpe_training/sp_token.json @@ -0,0 +1,6 @@ +{ + "special_tokens": [ + "", + "" + ] +} \ No newline at end of file diff --git a/src/model/scripts/bpe_training/train.py b/src/model/scripts/bpe_training/train.py new file mode 100644 index 0000000..cb0f146 --- /dev/null +++ b/src/model/scripts/bpe_training/train.py @@ -0,0 +1,83 @@ +from openthaigpt_pretraining_model.tokenizers.spm_trainer import load_local_dataset +from tokenizers import ByteLevelBPETokenizer +from nlpo3 import segment, load_dict +import argparse +import json +import tqdm +import os + +SPECIAL_TOKENS_FILE = f"{os.path.dirname(__file__)}/sp_token.json" +DICT_NAME = "dict" + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--output_path", type=str, help="path of tokenizer file", required=True + ) + parser.add_argument( + "--vocab_size", type=int, default=50000, help="max vocab of tokenier" + ) + parser.add_argument("--data_path", type=str, help="path of datasets", required=True) + parser.add_argument( + "--data_type", + default=None, + help="data type of dataset if None will be Huggingface format", + ) + parser.add_argument( + "--special_tokens_file", + type=str, + default=SPECIAL_TOKENS_FILE, + help="Path to the JSON file containing special tokens", + ) + parser.add_argument( + "--dict_file", + type=str, + required=True, + help="path to tokenization dictionary file", + ) + parser.add_argument( + "batch_size", type=int, default=1000, help="batch size for train tokenizer" + ) + + args = parser.parse_args() + + load_dict(args.dict_file, DICT_NAME) + + # load dataset + dataset = load_local_dataset(args.data_type, args.data_path) + + # Instantiate tokenizer + tokenizer = ByteLevelBPETokenizer() + + def th_tokenize(text): + result = " ".join(segment(text, DICT_NAME)) + return result + + def batch_iterator(batch_size=args.batch_size): + texts = [] + for i, data in tqdm.tqdm(enumerate(dataset)): + texts.append(data["text"]) + if (i + 1) % batch_size == 0: + yield texts + texts = [] + yield texts + + with open(args.special_tokens_file, "r") as file: + special_tokens_data = json.load(file) + special_tokens = special_tokens_data["special_tokens"] + + # Customized training + tokenizer.train_from_iterator( + batch_iterator(), + vocab_size=args.vocab_size, + min_frequency=2, + special_tokens=special_tokens, + ) + + # Save files to disk + tokenizer.save(args.output_path + "/tokenizer.json") + tokenizer.save_model(args.output_path) + + print("done") diff --git a/src/model/scripts/experiments/lion_experiment/README.md b/src/model/scripts/experiments/lion_experiment/README.md new file mode 100644 index 0000000..194a62f --- /dev/null +++ b/src/model/scripts/experiments/lion_experiment/README.md @@ -0,0 +1,101 @@ +# Optimizer Experimet + +We should experiment which optimizer is best when training Thai GPT LLM + +## Things to consider + +1. Memory Usage of the Optimizer +2. Model convergence speed +3. Stability of the loss +4. **Scalibility when increasing model parameters count** + +## Memory Experiment (#1) + +We want to measure how optimizer choices impact hardware utilization of casual language model pretraining + +### Experiment Models + +- [gpt2-xl](https://huggingface.co/gpt2-xl) +- [cerebras/Cerebras-GPT-2.7B](https://huggingface.co/cerebras/Cerebras-GPT-2.7B) + +### Optimizer Choices + +- AdamW +- [Lion](https://twitter.com/ArYoMo/status/1633949392934772738) +- [8-bit Adam](https://www.kaggle.com/code/nbroad/8-bit-adam-optimization) (WIP) + +### Run with multi gpu +- with default argument + + `torchrun --standalone --nproc_per_node=num_gpus src/model/scripts/experiments/lion_experiment/run.py` +- with custom argument + + `torchrun --standalone --nproc_per_node=num_gpus src/model/scripts/experiments/lion_experiment/run.py --argument` + +### Results + +#### GPT2-XL (1.5B) + +| Model | Batch Size | Sequence Length | Checkpoint | Flash Attention | Optimizer | VRAM used | Iteration Speed | +| ------- | ---------- | --------------- | ---------- | --------------- | --------- | ----------- | --------------- | +| GPT2-XL | 4 | 256 | | | AdamW | 37.9 GB | 4.99it/s | +| GPT2-XL | 4 | 256 | ✔ | | AdamW | 30.9 GB | 3.76it/s | +| GPT2-XL | 4 | 256 | | ✔ | AdamW | 36.6 GB | 5.80it/s | +| GPT2-XL | 4 | 256 | | | Lion | 33.3 GB | 5.16it/s | +| GPT2-XL | 4 | 256 | ✔ | ✔ | AdamW | 28.8 GB | 4.40it/s | +| GPT2-XL | 4 | 256 | ✔ | ✔ | Lion | **24.3 GB** | 4.57it/s | + +In this table, we have different configurations of the GPT2-XL model with varying options such as checkpoint, flash attention, and lion, along with their corresponding batch sizes, sequence lengths, and model to measure total sizes and iteration speeds. + +#### cerebras/Cerebras-GPT-2.7B + +| Model | Flash Attention | Activation Checkpointing | Optimizer | Max Batch Size | +| -------------------------- | --------------- | ------------------------ | --------- | -------------- | +| cerebras/Cerebras-GPT-2.7B | ✔ | ✔ | AdamW | OOM | +| cerebras/Cerebras-GPT-2.7B | ✔ | ✔ | Lion | 32 | +| cerebras/Cerebras-GPT-2.7B | ✔ | | Lion | 8 | +| cerebras/Cerebras-GPT-2.7B | | ✔ | Lion | 8 | +| cerebras/Cerebras-GPT-2.7B | | | Lion | 2 | + +In this table, we have different configurations of the cerebras/Cerebras-GPT-2.7B model with varying options such as flash attention, activation checkpointing, and optimizer (Lion or AdamW) to measure max batch size. + +### Hardware + +We run all experiments on Huaweii Cloud Elastic Cloud Server p3s.4xlarge.8 (A100 40GB \* 1, 16vCPUs, 128GB Ram) for 1.30 minutes each. All experimens are run in bf16 datatype. + +## Convergence Experiment (#2) (WIP) + +We want to measure how optimizer choices impact convergence when pretraining LLM + +### Experiment Models + +Models: + +- [gpt2-xl](https://huggingface.co/gpt2-xl) +- [cerebras/Cerebras-GPT-2.7B](https://huggingface.co/cerebras/Cerebras-GPT-2.7B) + +Tokenizers: + +- Tokenizer: [gpt2-base-thai](https://huggingface.co/flax-community/gpt2-base-thai) (TBD) + +### Optimizer Choices + +- AdamW +- [Lion](https://twitter.com/ArYoMo/status/1633949392934772738) +- [8-bit Adam](https://www.kaggle.com/code/nbroad/8-bit-adam-optimization) (WIP) + +## Datasets: + +- [mC4, Thai subset](https://huggingface.co/datasets/mc4) + +## Experiment steps + +1. Intilize GPT2 model weight from scratch, and resize token embedding to align with selected tokenizer. +2. Train from scratch with 4 \* A100 GPUs for 1 hours with selected optimizer (TBD). +3. Change optimizer and do 1,2 again +4. Repeat 1-3 again but change the optimizer +5. Analyze perplexity of the optimizer choice + +## Concerns + +1. We are not sure which optimiers's hyperameters will affect convergence speed. Please refer to the well-experimented hyperparamters for now. diff --git a/src/model/scripts/experiments/lion_experiment/lion_optimizer_experiment.yml b/src/model/scripts/experiments/lion_experiment/lion_optimizer_experiment.yml new file mode 100644 index 0000000..4fc0d2d --- /dev/null +++ b/src/model/scripts/experiments/lion_experiment/lion_optimizer_experiment.yml @@ -0,0 +1,2 @@ +defaults: + - optimizer: lion_optimizer diff --git a/src/model/scripts/experiments/lion_experiment/optimizer/adamw_optimizer.yaml b/src/model/scripts/experiments/lion_experiment/optimizer/adamw_optimizer.yaml new file mode 100644 index 0000000..bf26dbd --- /dev/null +++ b/src/model/scripts/experiments/lion_experiment/optimizer/adamw_optimizer.yaml @@ -0,0 +1,6 @@ +name: adamw +hyps: + lr: 1e-4 + weight_decay: 1e-2 + betas: [0.9, 0.95] + fused: true diff --git a/src/model/scripts/experiments/lion_experiment/optimizer/lion_optimizer.yaml b/src/model/scripts/experiments/lion_experiment/optimizer/lion_optimizer.yaml new file mode 100644 index 0000000..1e612f3 --- /dev/null +++ b/src/model/scripts/experiments/lion_experiment/optimizer/lion_optimizer.yaml @@ -0,0 +1,4 @@ +name: lion +hyps: + lr: 1e-4 + weight_decay: 1e-2 diff --git a/src/model/scripts/experiments/lion_experiment/run.py b/src/model/scripts/experiments/lion_experiment/run.py new file mode 100644 index 0000000..4a239bf --- /dev/null +++ b/src/model/scripts/experiments/lion_experiment/run.py @@ -0,0 +1,341 @@ +import argparse +from openthaigpt_pretraining_model.utils import ( + seed_everything, + load_hydra_config, +) +import os +from contextlib import nullcontext +from typing import Union +import time +import torch +from torch.utils.data import DataLoader +from torch.nn.parallel import DistributedDataParallel as DDP # noqa: N817 +from torch.distributed import init_process_group, destroy_process_group + +from tqdm import tqdm + +from transformers import GPT2TokenizerFast +from transformers.models.gpt2.modeling_gpt2 import GPT2Attention + +from datasets import load_dataset, load_from_disk + +from openthaigpt_pretraining_model.models.nanoGPT.model import make_model, _attn_wrapper +from openthaigpt_pretraining_model.data_wrapper import DatasetWrapper +from openthaigpt_pretraining_model.optimizers import get_optimizer +from openthaigpt_pretraining_model.datasets.constants import ( + DATASET_ARGS, +) + +# https://github.com/d8ahazard/sd_dreambooth_extension/pull/1186#issuecomment-1518694203 +if os.name == "posix": + os.environ["TORCHDYNAMO_DISABLE"] = "1" + +_attn_orig = GPT2Attention._attn + +MODEL_NAME = "flax-community/gpt2-base-thai" +BOS_TOKEN = "<|startoftext|>" +EOS_TOKEN = "<|endoftext|>" +PAD_TOKEN = "<|pad|>" +DATASET_NAME = "mc4" + +SPLIT_TRAIN = "train" +SPLIT_VAL = "validation" + +DTYPE_CHOICE = { + "float32": torch.float32, + "bfloat16": torch.bfloat16, + "float16": torch.float16, +} + + +def get_dataset( + dataset_name: Union[str, dict], + split: str = None, # type: ignore + shuffle: bool = False, + buffer_size: int = 10_000, + streaming: bool = False, + from_disk: bool = False, +): + """ + Args: + dataset_name: dataset name in `DATASET_ARGS` or HF datasets + `load_dataset` arguments in dictionary. + split: `train` or `validation` default is `None`. + shuffle: If `True`, it will be shuffle the dataset. + buffer_size: Shuffle buffer size. + """ + dataset_args = DATASET_ARGS.get(dataset_name, None) # type: ignore + if isinstance(dataset_name, dict): + dataset_args = dataset_name + elif isinstance(dataset_name, str) and not dataset_args: + dataset_args = {"path": dataset_name} + else: + raise NotImplementedError(f"No dataset name {dataset_name}") + + if from_disk: + dataset = load_from_disk( + dataset_name, + )[split] + else: + dataset = load_dataset( + **dataset_args, + split=split, + streaming=streaming, + ) + + if shuffle: + dataset = dataset.shuffle(buffer_size=buffer_size) + return dataset + + +def closest_power_of_2(x): + return 2 ** (x - 1).bit_length() + + +@torch.no_grad() +def do_eval(model, loader_val, ctx, device): + val_loss = 0.0 + c_1 = 0 + for i1, batch1 in enumerate(loader_val): + batch1 = batch1.to(device) + with ctx: + loss1 = model(batch1, labels=batch1).loss + val_loss = float(val_loss) + float(loss1.item()) + c_1 += 1 + # print(f"loss_val : {(val_loss / c_1):.3f}") + return val_loss / c_1 + + +def get_torch_context(dtype: str): + device_type = ( + "cuda" if torch.cuda.is_available() else "cpu" + ) # for later use in torch.autocast + + if dtype not in DTYPE_CHOICE.keys(): + raise NotImplementedError( + f"dtype: {dtype} is not available. Only supports bfloat16|float32|float16" + ) + + ptdtype = DTYPE_CHOICE[dtype] + ctx = ( + nullcontext() + if device_type == "cpu" + else torch.amp.autocast(device_type=device_type, dtype=ptdtype) # type: ignore + ) + return ctx + + +class Trainer: + def __init__( + self, + training_configuration, + seed, + batch_size, + context_length, + max_steps, + eval_steps, + warmup_steps, + model_name, + grad, + do_sample, + use_flash, + use_checkpointing, + dtype: str, + use_rotary, + ): + self.max_tokens = context_length + self.grad = grad + self.step = 0 + self.max_steps = max_steps + self.seed = seed + self.warmup_steps = warmup_steps + self.eval_steps = eval_steps + self.do_sample = do_sample + tokenizer = GPT2TokenizerFast.from_pretrained( + MODEL_NAME, + bos_token=BOS_TOKEN, + eos_token=EOS_TOKEN, + pad_token=PAD_TOKEN, + ) + dataset_train = get_dataset(DATASET_NAME, split=SPLIT_TRAIN, shuffle=True) + dataset_val = get_dataset(DATASET_NAME, split=SPLIT_VAL) + self.dataset = DatasetWrapper(tokenizer, dataset_train, self.max_tokens) + self.dataset_val = DatasetWrapper(tokenizer, dataset_val, self.max_tokens) + self.use_flash = use_flash + self.use_checkpointing = use_checkpointing + self.use_rotary = use_rotary + self.tokenizer = self.dataset.tokenizer + self.loader = DataLoader( + self.dataset, + batch_size=batch_size, + num_workers=2, + ) + + self.loader_val = DataLoader(self.dataset_val, batch_size=batch_size) + + self.backend = "nccl" + + self.ddp = int(os.environ.get("RANK", -1)) != -1 + if self.ddp: + init_process_group(backend=self.backend) + ddp_local_rank = int(os.environ["LOCAL_RANK"]) + device = f"cuda:{ddp_local_rank}" + torch.cuda.set_device(device) + else: + device = "cuda" if torch.cuda.is_available() else "cpu" + + self.device = device + + self.ctx = get_torch_context(dtype) + self.scaler = torch.cuda.amp.GradScaler(enabled=(dtype == "float16")) + self.model = make_model( + model_name, + self.max_tokens, + self.tokenizer, + self.use_flash, + self.use_checkpointing, + self.device, + self.use_rotary, + ) + self.model, self.opt = get_optimizer( + self.model, + optimizer_configuration=training_configuration.optimizer, + ) + self.model = torch.compile(self.model) # type: ignore + if self.ddp: + self.model = DDP(self.model, device_ids=[ddp_local_rank]) + + def train_step(self, batch): + batch = batch.to(self.device) + with self.ctx: + loss = self.model(batch, labels=batch).loss + loss = loss / self.grad + self.scaler.scale(loss).backward() + return loss + + def val_step(self): + self.model.eval() + prog = tqdm(self.loader_val) + for i, batch in enumerate(prog): + batch = batch.to(self.device) + with self.ctx: + loss = self.model(batch, labels=batch).loss + loss = loss / self.grad + + prog.set_description(f"loss_val: {loss.item():.3f}") + self.model.train() + + return loss + + def generate_samples(self, n_samples=8): + GPT2Attention._attn = _attn_orig # back to faster but more memory consuming + model = self.model + x = torch.tensor([[self.tokenizer.eos_token_id]] * n_samples).to(self.device) + t0 = time.time() + model.eval() + y = model.generate( + inputs=x, + max_length=self.max_tokens, + do_sample=True, + ).tolist() + model.train() + t1 = time.time() + t = [self.tokenizer.decode(z) for z in y] + for u in range(len(t)): + print("samples = ", t[u]) + print(f"Generated in {t1-t0:.3f}s") + if self.use_flash: + GPT2Attention._attn = _attn_wrapper + + def train(self): + prog = tqdm(self.loader) + self.opt.zero_grad() + + for i, batch in enumerate(prog): + self.step = i + 1 + + if self.ddp: + self.model.require_backward_grad_sync = i % self.grad != 0 + + loss = self.train_step(batch) + prog.set_description(f"loss: {loss.item():.3f}") + + if i % self.grad == 0: + self.scaler.step(self.opt) + self.scaler.update() + self.opt.zero_grad() + + if i % self.eval_steps == 0 and i != 0: + print("Step =", self.step) + # loss_val = self.val_step() + self.model.eval() + val_loss = do_eval(self.model, self.loader_val, self.ctx, self.device) + self.model.train() + print(f"loss_val : {val_loss:.3f}") + if self.do_sample: + self.generate_samples(6) + + self.grad = max(1, closest_power_of_2(i + 1) // 32) + if self.step > self.max_steps: + break + + if self.ddp: + destroy_process_group() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--training_configuration", type=str, default="./lion_optimizer_experiment.yml" + ) + parser.add_argument("--seed", type=int, default=42, help="{13|21|42|87|100}") + parser.add_argument("--batch_size", type=int, default=20) + parser.add_argument("--context_length", type=int, default=256, help="seq") + parser.add_argument("--max_steps", type=int, default=800, help="max steps") + parser.add_argument("--eval_steps", type=int, default=400, help="eval steps") + parser.add_argument("--warmup_steps", type=int, default=20, help="warmup steps") + parser.add_argument("--use_flash", default=False, action="store_true") + parser.add_argument("--use_rotary", default=False, action="store_true") + parser.add_argument("--use_checkpointing", default=False, action="store_true") + parser.add_argument( + "--model_name", + type=str, + default="gpt2", + help="{gpt2|gpt2-medium|gpt2-large|gpt2-xl,cerebras/Cerebras-GPT-2.7B}", + ) + parser.add_argument("--do_sample", default=False, action="store_true") + parser.add_argument( + "--gradient_accumulation_steps", + type=int, + default=4, + help="gradient acc", + ) + parser.add_argument( + "--dtype", + type=str, + default="bfloat16", + help="{bfloat16|float32|float16}", + ) + + args = parser.parse_args() + print(args) + + seed_everything(args.seed) + training_configuration = load_hydra_config(args.training_configuration) + trainer = Trainer( + training_configuration=training_configuration, + seed=args.seed, + batch_size=args.batch_size, + context_length=args.context_length, + max_steps=args.max_steps, + eval_steps=args.eval_steps, + warmup_steps=args.warmup_steps, + model_name=args.model_name, + grad=args.gradient_accumulation_steps, + do_sample=args.do_sample, + use_flash=args.use_flash, + use_checkpointing=args.use_checkpointing, + dtype=args.dtype, + use_rotary=args.use_rotary, + ) + trainer.train() diff --git a/src/model/scripts/gptj_thai_tokenizer/README.md b/src/model/scripts/gptj_thai_tokenizer/README.md new file mode 100644 index 0000000..38498da --- /dev/null +++ b/src/model/scripts/gptj_thai_tokenizer/README.md @@ -0,0 +1,25 @@ +# Tokenizer Experiment + +merge [GPTJ Tokenizer](https://huggingface.co/EleutherAI/gpt-j-6b/tree/main) with [gpt2_base_thai Tokenizer](https://huggingface.co/flax-community/gpt2-base-thai/tree/main) Tokenizer by extent vocabulary following [working example](https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/README_EN.md) + +## Objective +1. extended Thai vocabulary on top of GPTJ tokenizer +2. still have similar tokenized output when running with English sentence. + +## To test merged method +1. run run merge.py +``` python3 src/model/openthaigpt_pretraining_model/GPTJ_TH_tokenizer/merge.py``` +2. then run merge_tokenizers.py +``` python3 scripts/gptj_thai_tokenizer/merge_tokenizers.py``` +3. merge tokenizer will save path following constants.py + +## To test merged tokenizer + +1. run GPTJ_th_tokenizer_test.py +```python3 tests/model/GPTJ_th_tokenizer_test.py``` + +### Results +- The new tokenizer can tokenize Thai text and the tokenized outputs are the same as gpt2_base_th on Thai text +- The new tokenizer has the same tokenized outputs with GPTJ on English text + + diff --git a/src/model/scripts/gptj_thai_tokenizer/load_tokenizer.py b/src/model/scripts/gptj_thai_tokenizer/load_tokenizer.py new file mode 100644 index 0000000..8067ff9 --- /dev/null +++ b/src/model/scripts/gptj_thai_tokenizer/load_tokenizer.py @@ -0,0 +1,31 @@ +from transformers import AutoTokenizer +from huggingface_hub import hf_hub_download +import argparse + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--model_name", + type=str, + required=True, + help="model name from huggingface", + ) + parser.add_argument( + "--tokenizer_path", type=str, required=True, help="path to save tokenizer" + ) + parser.add_argument( + "--merge_file_path", default=None, help="path to save merge rule" + ) + + args = parser.parse_args() + + tokenizer = AutoTokenizer.from_pretrained(args.model_name) + tokenizer.save_pretrained(args.tokenizer_path) + + if args.merge_file_path is not None: + hf_hub_download( + repo_id=args.model_name, + filename="merges.txt", + local_dir=args.merge_file_path, + ) diff --git a/src/model/scripts/gptj_thai_tokenizer/merge_tokenizers.py b/src/model/scripts/gptj_thai_tokenizer/merge_tokenizers.py new file mode 100644 index 0000000..14cbd2b --- /dev/null +++ b/src/model/scripts/gptj_thai_tokenizer/merge_tokenizers.py @@ -0,0 +1,44 @@ +from openthaigpt_pretraining_model.GPTJ_TH_tokenizer.merge import merge +from openthaigpt_pretraining_model.GPTJ_TH_tokenizer.constants import ( + OUTPUT_HF_DIR, +) +import argparse + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--tokenizer_1_dir", type=str, required=True, help="path to tokenizer to merge" + ) + parser.add_argument( + "--tokenizer_2_dir", type=str, required=True, help="path to tokenizer to merge" + ) + parser.add_argument( + "--merge_file_1", + default=None, + help="path to merge rule of tokenizer_1", + ) + parser.add_argument( + "--merge_file_2", + default=None, + help="path to merge rule of tokenizer_2", + ) + parser.add_argument( + "--output_dir", type=str, default=OUTPUT_HF_DIR, help="path of output tokenizer" + ) + + args = parser.parse_args() + + if args.merge_file_1 is None: + merge_file_1 = args.tokenizer_1_dir + "/merges.txt" + else: + merge_file_1 = args.merge_file_1 + if args.merge_file_2 is None: + merge_file_2 = args.tokenizer_2_dir + "/merges.txt" + else: + merge_file_2 = args.merge_file_2 + + tokenizer = merge( + args.tokenizer_1_dir, args.tokenizer_2_dir, merge_file_1, merge_file_2 + ) + tokenizer.save_pretrained(args.output_dir) diff --git a/src/model/scripts/hf_trainer/README.md b/src/model/scripts/hf_trainer/README.md new file mode 100644 index 0000000..caf8229 --- /dev/null +++ b/src/model/scripts/hf_trainer/README.md @@ -0,0 +1,5 @@ +# HF trainer + +## How to combine dataset + +Use ```data_path``` args more than 1 for combine dataset and must add ```data_weights``` to same size ```data_path```. when ```data_weights``` is 1 of dataset will have size same full size of samllest dataset \ No newline at end of file diff --git a/src/model/scripts/hf_trainer/config/llama_deepspeed.json b/src/model/scripts/hf_trainer/config/llama_deepspeed.json new file mode 100644 index 0000000..43812c6 --- /dev/null +++ b/src/model/scripts/hf_trainer/config/llama_deepspeed.json @@ -0,0 +1,41 @@ +{ + "bf16": { + "enabled": "auto" + }, + "optimizer": { + "type": "AdamW", + "params": { + "lr": "auto", + "betas": "auto", + "eps": "auto", + "weight_decay": "auto" + } + }, + "scheduler": { + "type": "WarmupDecayLR", + "params": { + "total_num_steps": "auto", + "warmup_min_lr": "auto", + "warmup_max_lr": "auto", + "warmup_num_steps": "auto" + } + }, + "zero_optimization": { + "stage": 2, + "overlap_comm": true, + "contiguous_gradients": true, + "sub_group_size": 1e9, + "reduce_bucket_size": "auto", + "stage3_prefetch_bucket_size": "auto", + "stage3_param_persistence_threshold": "auto", + "stage3_max_live_parameters": 1e9, + "stage3_max_reuse_distance": 1e9, + "stage3_gather_16bit_weights_on_model_save": false + }, + "gradient_accumulation_steps": "auto", + "gradient_clipping": "auto", + "steps_per_print": 5, + "train_batch_size": "auto", + "train_micro_batch_size_per_gpu": "auto", + "wall_clock_breakdown": false +} \ No newline at end of file diff --git a/src/model/scripts/hf_trainer/requirements.txt b/src/model/scripts/hf_trainer/requirements.txt new file mode 100644 index 0000000..9a6a92b --- /dev/null +++ b/src/model/scripts/hf_trainer/requirements.txt @@ -0,0 +1,9 @@ +numpy +rouge_score +fire +openai +git+https://github.com/huggingface/transformers.git +torch +sentencepiece +tokenizers>=0.13.3 +wandb diff --git a/src/model/scripts/hf_trainer/sbatch submit_deepspeed.sh b/src/model/scripts/hf_trainer/sbatch submit_deepspeed.sh new file mode 100644 index 0000000..28ed4c1 --- /dev/null +++ b/src/model/scripts/hf_trainer/sbatch submit_deepspeed.sh @@ -0,0 +1,67 @@ +#!/bin/bash +#SBATCH -p gpu +#SBATCH -N 1 -c 64 +#SBATCH --ntasks-per-node=1 +#SBATCH --gpus=4 +#SBATCH -t 00:60:00 +#SBATCH -J test +#SBATCH -A + + +module restore +module load Miniconda3 +module load PrgEnv-gnu +module load cpe-cuda +module load cudatoolkit/22.7_11.7 +module load craype-accel-nvidia80 +module load aws-ofi-nccl + +conda deactivate +conda activate + +module list + +export NCCL_DEBUG=INFO +export NCCL_SOCKET_IFNAME=hsn + +# apptainer exec --bind /project/lt200056-opgpth/stanford_alpaca:/home/nbuppodo --writable pytorch_image_fixed pip install git+https://github.com/huggingface/accelerate + +START=`date` +starttime=$(date +%s) + + +export WANDB_MODE="offline" + +torchrun --nproc_per_node=4 --master_port=3000 train.py \ + --model_name_or_path /project/lt200056-opgpth/boss/stanford_alpaca/llama_2_7b_fixed_resized \ + --tokenizer_name_or_path /project/lt200056-opgpth/boss/stanford_alpaca/llama_2_7b_fixed_resized \ + --use_flash_attention_2 True \ + --data_path /scratch/lt200056-opgpth/hf_v5_token_llama_2_1024 \ + --data_weights 1. \ + --data_seed 42 \ + --train_split train \ + --eval_split eval \ + --bf16 True \ + --output_dir output_deepspeed \ + --num_train_epochs 3 \ + --per_device_train_batch_size 1 \ + --per_device_eval_batch_size 1 \ + --gradient_accumulation_steps 1 \ + --evaluation_strategy "no" \ + --save_strategy "steps" \ + --save_steps 2000 \ + --save_total_limit 1 \ + --learning_rate 2e-5 \ + --weight_decay 0. \ + --warmup_ratio 0.03 \ + --deepspeed "./configs/llama_deepspeed.json" \ + --tf32 True \ + --gradient_checkpointing True \ + --checkpoint /project/lt200056-opgpth/boss/stanford_alpaca/output_deepspeed/checkpoint-20 + + # --deepspeed "./configs/default_offload_opt_param.json" \ + +END=`date` +endtime=$(date +%s) +echo "Job start at" $START +echo "Job end at" $END \ No newline at end of file diff --git a/src/model/scripts/hf_trainer/smultinode_deepspeed.sh b/src/model/scripts/hf_trainer/smultinode_deepspeed.sh new file mode 100644 index 0000000..c90c268 --- /dev/null +++ b/src/model/scripts/hf_trainer/smultinode_deepspeed.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +#sleep 30 +#fi_info -p efa -t FI_EP_RDM + +# HOSTNAMES MASTER_ADDR MASTER_PORT COUNT_NODE are coming from the main script + + + +module restore +module load Miniconda3 +module load PrgEnv-gnu +module load cpe-cuda +module load cudatoolkit/22.7_11.7 +module load craype-accel-nvidia80 +module load aws-ofi-nccl + +conda deactivate +conda activate + +echo myuser=`whoami` +echo COUNT_NODE=$COUNT_NODE +echo LD_LIBRARY_PATH = $LD_LIBRARY_PATH +echo PATH = $PATH +echo which mpicc `which mpicc` +echo HOSTNAMES = $HOSTNAMES +echo hostname = `hostname` +echo MASTER_ADDR= $MASTER_ADDR +echo MASTER_PORT= $MASTER_PORT + +H=`hostname` +THEID=`echo -e $HOSTNAMES | python -c "import sys;[sys.stdout.write(str(i)) for i,line in enumerate(next(sys.stdin).split(' ')) if line.strip() == '$H'.strip()]"` +echo THEID=$THEID +echo SLURM_PROCID=$SLURM_PROCID + + + +# source /fsx/dalle2/.dalle_env_38/bin/activate +# echo python3 version = `python3 --version` +# python -c "import torch" + + +accelerate launch --num_processes $(( 4 * $COUNT_NODE )) --num_machines $COUNT_NODE --multi_gpu --mixed_precision fp16 --machine_rank $SLURM_PROCID --main_process_ip $MASTER_ADDR --main_process_port $MASTER_PORT train.py \ + --model_name_or_path /project/lt200056-opgpth/boss/stanford_alpaca/llama_2_7b_fixed_resized \ + --tokenizer_name_or_path /project/lt200056-opgpth/boss/stanford_alpaca/llama_2_7b_fixed_resized \ + --use_flash_attention_2 True \ + --data_path /scratch/lt200056-opgpth/hf_v5_token_llama_2_1024 \ + --data_weights 1. \ + --data_seed 42 \ + --train_split train \ + --eval_split eval \ + --bf16 True \ + --output_dir output_deepspeed \ + --num_train_epochs 3 \ + --per_device_train_batch_size 32 \ + --per_device_eval_batch_size 32 \ + --gradient_accumulation_steps 8 \ + --evaluation_strategy "no" \ + --save_strategy "steps" \ + --save_steps 2000 \ + --save_total_limit 1 \ + --learning_rate 2e-5 \ + --weight_decay 0. \ + --warmup_ratio 0.03 \ + --deepspeed "./configs/llama_deepspeed.json" \ + --tf32 True \ + --gradient_checkpointing True \ + --checkpoint /project/lt200056-opgpth/boss/stanford_alpaca/output_deepspeed/checkpoint-60 + + # --fsdp "full_shard auto_wrap" \ + # --gradient_checkpointing True \ No newline at end of file diff --git a/src/model/scripts/hf_trainer/submit_multinode_deepspeed.sh b/src/model/scripts/hf_trainer/submit_multinode_deepspeed.sh new file mode 100644 index 0000000..e74ae39 --- /dev/null +++ b/src/model/scripts/hf_trainer/submit_multinode_deepspeed.sh @@ -0,0 +1,36 @@ +#!/bin/bash +#SBATCH -p gpu # Specify partition [Compute/Memory/GPU] +#SBATCH -N 2 -c 64 # Specify number of nodes and processors per task +#SBATCH --ntasks-per-node=1 # Specify number of tasks per node +#SBATCH --gpus-per-node=4 # Specify total number of GPUs +#SBATCH -t 01:00:00 # Specify maximum time limit (hour: minute: second) +#SBATCH -A # Specify project name +#SBATCH -J DDP-testNCCL # Specify job name + +export NCCL_DEBUG=INFO +export NCCL_SOCKET_IFNAME=hsn +#export FI_MR_CACHE_MONITOR=memhooks +#export NCCL_NET_GDR_LEVEL=3 +#export NCCL_NET=IB +#export NCCL_IB_HCA=mlx5 +#export CXI_FORK_SAFE=1 +#export CXI_FORK_SAFE_HP=1 +#export FI_CXI_DISABLE_CQ_HUGETLB=1 + +#echo "using FI_MR_CACHE_MONITOR=memhooks" + +START=`date` +starttime=$(date +%s) + +export WANDB_MODE="offline" + +# sent to sub script +export HOSTNAMES=`scontrol show hostnames "$SLURM_JOB_NODELIST"` +export MASTER_ADDR=$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1) +export MASTER_PORT=12802 +export COUNT_NODE=`scontrol show hostnames "$SLURM_JOB_NODELIST" | wc -l` + +echo go $COUNT_NODE +echo $HOSTNAMES + +srun sh smultinode_deepspeed.sh \ No newline at end of file diff --git a/src/model/scripts/hf_trainer/train.py b/src/model/scripts/hf_trainer/train.py new file mode 100644 index 0000000..288368c --- /dev/null +++ b/src/model/scripts/hf_trainer/train.py @@ -0,0 +1,154 @@ +from dataclasses import dataclass, field +from typing import Dict, Optional, Sequence, List + +import torch +import transformers +from transformers import Trainer +from datasets import load_from_disk +from torch.utils.data import IterableDataset + + +import os +import random + + +@dataclass +class ModelArguments: + model_name_or_path: Optional[str] = field(default="facebook/opt-125m") + tokenizer_name_or_path: Optional[str] = field(default=None) + use_flash_attention_2: bool = field(default=False) + + +@dataclass +class DataArguments: + data_path: List[str] = field( + default_factory=list, metadata={"help": "Path to the tokenized data."} + ) + data_weights: List[float] = field(default_factory=list) + train_split: Optional[str] = field(default="train") + eval_split: Optional[str] = field(default="eval") + + +@dataclass +class TrainingArguments(transformers.TrainingArguments): + cache_dir: Optional[str] = field(default=None) + optim: str = field(default="adamw_torch") + checkpoint: Optional[str] = field(default=None) + model_max_length: int = field( + default=512, + metadata={ + "help": "Maximum sequence length. Sequences will be right padded (and possibly truncated)." # noqa + }, + ) + + +class DataCollatorForSupervisedDataset(object): + """Collate examples for supervised fine-tuning.""" + + def __call__(self, instances: Sequence[Dict]) -> Dict[str, torch.Tensor]: + input_ids = [instance["input_ids"] for instance in instances] + input_ids = torch.tensor(input_ids) # type: ignore + return { + "input_ids": input_ids, # type: ignore + "labels": input_ids, # type: ignore + } + + +class CombinedDataset(IterableDataset): + def __init__(self, datasets, seed, weights=None): + self._seed = seed + self._datasets = datasets + self._weights = weights + + n_datasets = len(datasets) + + if weights is None: + self._weights = [1 / n_datasets] * n_datasets + + len_datasets = [] + for dataset in self._datasets: + len_datasets.append(len(dataset)) + self.total_len = int(min(len_datasets) * sum(self._weights)) + + def __iter__(self): + return CombinedDatasetIterator(self._datasets, self._seed, self._weights) + + def __len__(self): + return self.total_len + + +class CombinedDatasetIterator: + def __init__(self, datasets, seed, weights): + self._datasets = [iter(el) for el in datasets] + self._weights = weights + self._rng = random.Random(seed) + + def __next__(self): + (dataset,) = self._rng.choices(self._datasets, weights=self._weights, k=1) + + return next(dataset) + + +def load_dataset(paths, weights, split, seed=42): + datasets = [] + for path in paths: + path_to_split = os.path.join(path, split) + dataset = load_from_disk(path_to_split) + datasets.append(dataset) + return CombinedDataset(datasets, seed, weights) + + +def make_supervised_data_module(data_args: DataArguments, seed=42) -> Dict: + """Make dataset and collator for supervised fine-tuning.""" + train_dataset = load_dataset( + data_args.data_path, data_args.data_weights, data_args.train_split, seed + ) + eval_dataset = load_dataset( + data_args.data_path, data_args.data_weights, data_args.eval_split, seed + ) + data_collator = DataCollatorForSupervisedDataset() + return { + "train_dataset": train_dataset, + "eval_dataset": eval_dataset, + "data_collator": data_collator, + } + + +def train(): + parser = transformers.HfArgumentParser( + (ModelArguments, DataArguments, TrainingArguments) + ) + model_args, data_args, training_args = parser.parse_args_into_dataclasses() + + model = transformers.LlamaForCausalLM.from_pretrained( + model_args.model_name_or_path, + cache_dir=training_args.cache_dir, + ) + + if model_args.tokenizer_name_or_path is None: + model_args.tokenizer_name_or_path = model_args.model_name_or_path + + tokenizer = transformers.LlamaTokenizer.from_pretrained( + model_args.tokenizer_name_or_path, + cache_dir=training_args.cache_dir, + model_max_length=training_args.model_max_length, + padding_side="right", + use_fast=False, + ) + + # if tokenizer is not None and model.vocab_size != len(tokenizer): + # model.resize_token_embeddings(len(tokenizer)) + + data_module = make_supervised_data_module( + data_args=data_args, seed=training_args.data_seed + ) + trainer = Trainer( + model=model, tokenizer=tokenizer, args=training_args, **data_module + ) + trainer.train(training_args.checkpoint) + trainer.save_state() + trainer.save_model(output_dir=training_args.output_dir) + + +if __name__ == "__main__": + train() diff --git a/src/model/scripts/lighting_training/README.md b/src/model/scripts/lighting_training/README.md new file mode 100644 index 0000000..07a9015 --- /dev/null +++ b/src/model/scripts/lighting_training/README.md @@ -0,0 +1,26 @@ +## Preprocess dataset if don't want to use raw dataset +```python src/model/scripts/lighting_training/data_preprocessing.py``` + +change config in ../../configuration_example/data_preprocess.yaml +note: after preprocess you should update config in dataset in term tokenized to use preprocessed dataset + +## Load model + +use load model to local for use in lanta +```python src/model/scripts/lighting_training/load_model.py --model_name --output_path``` + +model_name: model name in huggingface +output_path: path to save model + +## Check Tokenizer + +use check tokenizer information +```python src/model/scripts/lighting_training/tokenizer_info.py --tokenizer``` + +tokenizer: path to tokenizer +note: if vocab size or special token id of tokenizer don't match with model config you shold update model config + +## Train +```python src/model/scripts/lighting_training/train.py``` + +change config in ../../configuration_example/config.yaml \ No newline at end of file diff --git a/src/model/scripts/lighting_training/data_preprocessing.py b/src/model/scripts/lighting_training/data_preprocessing.py new file mode 100644 index 0000000..6b018a4 --- /dev/null +++ b/src/model/scripts/lighting_training/data_preprocessing.py @@ -0,0 +1,53 @@ +from openthaigpt_pretraining_model.data_wrapper import ( + tokenize_function, +) +from openthaigpt_pretraining_model.models import load_tokenizer +from openthaigpt_pretraining_model.datasets import get_dataset +import os + +import hydra + + +@hydra.main( + version_base=None, + config_path="../../configuration_example/", + config_name="data_preprocess", +) +def main(cfg): + data_process_configuration = cfg.data_process + dataset_split = data_process_configuration.get("split", None) + if isinstance(dataset_split, str): + dataset_split = [dataset_split] + + for split in dataset_split: + dataset_config = cfg.dataset.get(split, None) + + if dataset_config is None: + raise NotImplementedError(f"dataset don't have split {dataset_split}") + + dataset = get_dataset(dataset_config) + + tokenizer = load_tokenizer(cfg.model.tokenizer) + + dataset = dataset.map( + tokenize_function(tokenizer, data_process_configuration.max_tokens), + desc=f"Tokenizing {split} ...", + num_proc=data_process_configuration.num_proc, + batched=True, + batch_size=data_process_configuration.batch_size, + remove_columns=dataset.column_names, + ) + + save_path = os.path.join( + data_process_configuration.save_path, + split, + ) + + dataset.save_to_disk( + save_path, + num_proc=data_process_configuration.num_proc, + ) + + +if __name__ == "__main__": + main() # type: ignore diff --git a/src/model/scripts/lighting_training/load_model.py b/src/model/scripts/lighting_training/load_model.py new file mode 100644 index 0000000..4feaaec --- /dev/null +++ b/src/model/scripts/lighting_training/load_model.py @@ -0,0 +1,20 @@ +from transformers import AutoModelForCausalLM +import argparse + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--model_name", + type=str, + required=True, + help="model name from huggingface", + ) + parser.add_argument( + "--output_path", type=str, required=True, help="path to save model in local" + ) + + args = parser.parse_args() + + tokenizer = AutoModelForCausalLM.from_pretrained(args.model_name) + tokenizer.save_pretrained(args.output_path) diff --git a/src/model/scripts/lighting_training/tokenizer_info.py b/src/model/scripts/lighting_training/tokenizer_info.py new file mode 100644 index 0000000..554c883 --- /dev/null +++ b/src/model/scripts/lighting_training/tokenizer_info.py @@ -0,0 +1,23 @@ +import argparse +from transformers import AutoTokenizer + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--tokenizer", type=str, required=True, help="name or path to tokenizer" + ) + + args = parser.parse_args() + + tokenizer = AutoTokenizer.from_pretrained(args.tokenizer) + + print(f"len: {len(tokenizer.get_vocab())}") + if tokenizer.eos_token is not None: + print(f"end of sentence tag {tokenizer.eos_token}: {tokenizer.eos_token_id}") + else: + print("no eos token") + if tokenizer.unk_token is not None: + print(f"unknow word tag {tokenizer.unk_token}: {tokenizer.unk_token_id}") + else: + print("no unk token") diff --git a/src/model/scripts/lighting_training/train.py b/src/model/scripts/lighting_training/train.py new file mode 100644 index 0000000..c5a544a --- /dev/null +++ b/src/model/scripts/lighting_training/train.py @@ -0,0 +1,21 @@ +from openthaigpt_pretraining_model.lightning.utils import ( + Trainer, +) +from openthaigpt_pretraining_model.utils import seed_everything + +import hydra + + +@hydra.main( + version_base=None, config_path="../../configuration_example/", config_name="config" +) +def main(cfg): + seed_everything(cfg.training.seed) + trainer = Trainer( + configuration=cfg, + ) + trainer.train() + + +if __name__ == "__main__": + main() # type: ignore diff --git a/src/model/scripts/llama_thai_tokenizer/README.md b/src/model/scripts/llama_thai_tokenizer/README.md new file mode 100644 index 0000000..edae6f0 --- /dev/null +++ b/src/model/scripts/llama_thai_tokenizer/README.md @@ -0,0 +1,63 @@ +# OpenThaiGPT Merged Tokenizer Pipeline + +We plan to use [Pretrained LLaMA Model](https://ai.meta.com/blog/large-language-model-llama-meta-ai/) as a base model for finetuning but LLaMA Tokenizer (BPE Tokenizer) have less Thai vocabulary, this pipeline intend to extent vocabulary of LlaMA tokenizer, using merge method following [Chinese-LLaMA-Alpaca](https://github.com/ymcui/Chinese-LLaMA-Alpaca/blob/main/README_EN.md) + +## Method + +- merge LLaMA tokenizer by extenting vocabulary and merge rule from BPE Thai tokenizer + ![method](merge_method.png) + +## merge and save merge tokenizer + +1. load LLaMA tokenizer by pass your model name to an argument + + ```bash + python load_tokenizer.py --model_name meta-llama/Llama-2-7b --output_path + ``` + + argument + + - model_name: name of LLaMA model (huggingface) + - output_path: path to save tokenizer + +2. prepare Thai BPE Tokenizer + + - if you don't have your Thai BPE Tokenizer, you need to train following [spm_training/README.md](../spm_training/README.md) + +3. merge tokenizer by running following script + + - must have Thai BPE tokenizer, don't forget set to path of Thai BPE Tokenizer + + ```bash + python merge_tokenizer.py --llama_path --thai_sp_path --output_path + ``` + + argument + + - llama_path: path to LLaMA tokenizer huggingface or local + - thai_sp_path: path to Thai BPE tokenizer on local + - output_path: path to save tokenizer + +## To test merged tokenizer + +1. run llama_thai_token_test.py and inference time checked + + ```bash + python time_inference_check.py --llama_path --thai_sp_path + ``` + + - llama_path: path to LLaMA tokenizer huggingface or local + - thai_sp_path: path to Thai BPE tokenizer on local + +### Results after merging + +| Text | LLaMA Tokenizer | Merged Tokenizer | +| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| การใช้งานหลักของ LLaMA คือการวิจัยเกี่ยวกับรูปแบบภาษาที่ใหญ่ | ['▁', 'ก', 'า', 'ร', '<0xE0>', '<0xB9>', '<0x83>', 'ช', '้', 'ง', 'า', 'น', 'ห', 'ล', 'ั', 'ก', 'ข', 'อ', 'ง', '▁L', 'La', 'MA', '▁', 'ค', 'ื', 'อ', 'ก', 'า', 'ร', 'ว', 'ิ', 'จ', 'ั', 'ย', 'เ', 'ก', 'ี', '่', 'ย', 'ว', 'ก', 'ั', 'บ', 'ร', 'ู', 'ป', 'แ', 'บ', 'บ', 'ภ', 'า', 'ษ', 'า', 'ท', 'ี', '่', '<0xE0>', '<0xB9>', '<0x83>', 'ห', 'ญ', '่'] | ['▁การใช้งาน', 'หลักของ', '▁L', 'La', 'MA', '▁คือการ', 'วิจัย', 'เกี่ยวกับ', 'รูปแบบ', 'ภาษา', 'ที่ใหญ่'] | +| LLaMAมุ่งเน้นที่การศึกษารูปแบบภาษาที่กว้างขวาง | ['▁L', 'La', 'MA', '▁', 'ม', 'ุ', '่', 'ง', 'เ', 'น', '้', 'น', 'ท', 'ี', '่', 'ก', 'า', 'ร', 'ศ', '<0xE0>', '<0xB8>', '<0xB6>', 'ก', 'ษ', 'า', 'ร', 'ู', 'ป', 'แ', 'บ', 'บ', 'ภ', 'า', 'ษ', 'า', 'ท', 'ี', '่', 'ก', 'ว', '้', 'า', 'ง', 'ข', 'ว', 'า', 'ง']​ | ['▁L', 'La', 'MA', '▁มุ่ง', 'เน้น', 'ที่การ', 'ศึกษา', 'รูปแบบ', 'ภาษา', 'ที่', 'กว้างขวาง'] | +| ขอเพิ่มสัก1pointก็ยังดีครับ | ['▁', 'ข', 'อ', 'เ', 'พ', 'ิ', '่', 'ม', 'ส', 'ั', 'ก', '▁', '1', '▁point', '▁', 'ก', '็', 'ย', 'ั', 'ง', 'ด', 'ี', 'ค', 'ร', 'ั', 'บ'] | ['▁ขอ', 'เพิ่ม', 'สัก', '▁1', '▁point', '▁ก็ยัง', 'ดีครับ'] | +| Convert Pretrained LLaMa to Support Thai Token | ['▁Convert', '▁P', 'ret', 'rained', '▁L', 'La', 'Ma', '▁to', '▁Support', '▁Thai', '▁Token'] | ['▁Convert', '▁P', 'ret', 'rained', '▁L', 'La', 'Ma', '▁to', '▁Support', '▁Thai', '▁Token'] | + +- EngOnly time: 0.00027060508728027344 +- EngThai time: 0.00016260147094726562 +- time diff: 0.00010800361633300781 diff --git a/src/model/scripts/llama_thai_tokenizer/load_tokenizer.py b/src/model/scripts/llama_thai_tokenizer/load_tokenizer.py new file mode 100644 index 0000000..5814d7d --- /dev/null +++ b/src/model/scripts/llama_thai_tokenizer/load_tokenizer.py @@ -0,0 +1,23 @@ +from openthaigpt_pretraining_model.llama_thai_tokenizer.constants import ( + LLAMA_TOKENIZER_DIR, +) +from transformers import LlamaTokenizer +import argparse + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--model_name", + type=str, + default=LLAMA_TOKENIZER_DIR, + help="llama model name from huggingface", + ) + parser.add_argument( + "--output_path", type=str, required=True, help="path to save llama tokenizer" + ) + + args = parser.parse_args() + + tokenizer = LlamaTokenizer.from_pretrained(args.model_name) + tokenizer.save_pretrained(args.output_path) diff --git a/src/model/scripts/llama_thai_tokenizer/merge_method.png b/src/model/scripts/llama_thai_tokenizer/merge_method.png new file mode 100644 index 0000000..8632202 Binary files /dev/null and b/src/model/scripts/llama_thai_tokenizer/merge_method.png differ diff --git a/src/model/scripts/llama_thai_tokenizer/merge_tokenizer.py b/src/model/scripts/llama_thai_tokenizer/merge_tokenizer.py new file mode 100644 index 0000000..ab63dce --- /dev/null +++ b/src/model/scripts/llama_thai_tokenizer/merge_tokenizer.py @@ -0,0 +1,53 @@ +import argparse + +from openthaigpt_pretraining_model.llama_thai_tokenizer.merge import merge +from openthaigpt_pretraining_model.llama_thai_tokenizer.constants import ( + OUTPUT_HF_DIR, + LLAMA_TOKENIZER_DIR, + THAI_SP_MODEL_DIR, +) +from openthaigpt_pretraining_model.tokenizers.spm_trainer import ( + EOS_TOKEN, + UNK_TOKEN, + BOS_TOKEN, +) + +from transformers import LlamaTokenizer +import os + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--llama_path", + type=str, + default=LLAMA_TOKENIZER_DIR, + help="path to llama tokenizer", + ) + parser.add_argument( + "--thai_sp_path", + type=str, + default=THAI_SP_MODEL_DIR, + help="path to Thai tokenizer", + ) + parser.add_argument( + "--output_path", + type=str, + default=OUTPUT_HF_DIR, + help="path of output tokenizer", + ) + + args = parser.parse_args() + # call merge function + tokenizer = merge(args.llama_path, args.thai_sp_path, get_spm_tokenizer=True) + + os.makedirs(args.output_path, exist_ok=True) + with open(args.output_path + "/spm_tokenizer.model", "wb") as f: + f.write(tokenizer.SerializeToString()) + tokenizer = LlamaTokenizer(vocab_file=args.output_path + "/spm_tokenizer.model") + # change special tokens + tokenizer.eos_token = EOS_TOKEN + tokenizer.bos_token = BOS_TOKEN + tokenizer.unk_token = UNK_TOKEN + # save model + tokenizer.save_pretrained(args.output_path) diff --git a/src/model/scripts/llama_thai_tokenizer/time_inference_check.py b/src/model/scripts/llama_thai_tokenizer/time_inference_check.py new file mode 100644 index 0000000..0297885 --- /dev/null +++ b/src/model/scripts/llama_thai_tokenizer/time_inference_check.py @@ -0,0 +1,35 @@ +import time +import argparse +from openthaigpt_pretraining_model.llama_thai_tokenizer.tokenizer import ( + LLaMaToken, + EngThaiLLaMaToken, +) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--llama_path", + type=str, + help="path to llama tokenizer", + ) + parser.add_argument( + "--thai_sp_path", + type=str, + help="path to Thai tokenizer", + ) + + args = parser.parse_args() + llama_tokenizer = LLaMaToken(args.llama_path) + merge_tokenizer = EngThaiLLaMaToken(args.llama_path, args.thai_sp_path) + + text = "การใช้งานหลักของ LLaMA คือการวิจัยเกี่ยวกับรูปแบบภาษาที่ใหญ่" + start = time.time() + print(f"Tokenized by LLaMA tokenizer: {llama_tokenizer.tokenize(text)}") + t1 = time.time() - start + + start2 = time.time() + print(f"Tokenized by English-Thai LLaMA tokenizer:{merge_tokenizer.tokenize(text)}") + t2 = time.time() - start2 + + print(f"EngOnly time: {t1}\nEngThai time: {t2}\ntime diff:{t1 - t2}") diff --git a/src/model/scripts/pytorch_lighting_training/.gitignore b/src/model/scripts/pytorch_lighting_training/.gitignore new file mode 100644 index 0000000..cddf1c5 --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/.gitignore @@ -0,0 +1,5 @@ +slurm-*.out +*.sh +pl_configurations/checkpointing/*.yaml +pl_configurations/dataset/*.yaml +pl_configurations/logging/*.yaml diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/config.example.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/config.example.yaml new file mode 100644 index 0000000..4cab3be --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/config.example.yaml @@ -0,0 +1,10 @@ +defaults: + - model: llama-hf-7b-from-pretrained + - optimizer: adamw_optimizer + - scheduler: warmup_and_decay_lr + - trainer: default_trainer + - deepspeed: stage_2 + - dataset: default_dataset + - checkpointing: default_checkpointing + - logging: default_logging +name: llama-hf-7b-from-pretrained diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/deepspeed/stage_2.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/deepspeed/stage_2.yaml new file mode 100644 index 0000000..32b6212 --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/deepspeed/stage_2.yaml @@ -0,0 +1,3 @@ +stage: 2 +offload_optimizer: false +offload_parameters: false diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/lora/default_lora.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/lora/default_lora.yaml new file mode 100644 index 0000000..a9aa284 --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/lora/default_lora.yaml @@ -0,0 +1,6 @@ +r: 128 +lora_alpha: 32 +lora_dropout: 0.05 +bias: "none" +task_type: "CAUSAL_LM" +target_modules: ["query_key_value"] diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/model b/src/model/scripts/pytorch_lighting_training/pl_configurations/model new file mode 120000 index 0000000..c288981 --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/model @@ -0,0 +1 @@ +../../../configuration_example/model/ \ No newline at end of file diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/optimizer/adam_optimizer.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/optimizer/adam_optimizer.yaml new file mode 100644 index 0000000..7d7619c --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/optimizer/adam_optimizer.yaml @@ -0,0 +1,6 @@ +name: adam +hyps: + lr: 1e-4 + weight_decay: 1e-2 + betas: [0.9, 0.95] + fused: true diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/optimizer/adamw_optimizer.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/optimizer/adamw_optimizer.yaml new file mode 100644 index 0000000..bf26dbd --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/optimizer/adamw_optimizer.yaml @@ -0,0 +1,6 @@ +name: adamw +hyps: + lr: 1e-4 + weight_decay: 1e-2 + betas: [0.9, 0.95] + fused: true diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/const_lr.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/const_lr.yaml new file mode 100644 index 0000000..b4c1bb8 --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/const_lr.yaml @@ -0,0 +1,3 @@ +name: const_lr +hyps: + warmup_steps: 2000 diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/cosine_lr.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/cosine_lr.yaml new file mode 100644 index 0000000..4a26180 --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/cosine_lr.yaml @@ -0,0 +1,3 @@ +name: cosine_lr +hyps: + warmup_steps: 2000 diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/warmup_and_decay_lr.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/warmup_and_decay_lr.yaml new file mode 100644 index 0000000..ced66dd --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/scheduler/warmup_and_decay_lr.yaml @@ -0,0 +1,5 @@ +name: warmup_and_decay_lr +hyps: + warmup_steps: 2000 + decay_steps: 600000 + min_lr: 6e-5 diff --git a/src/model/scripts/pytorch_lighting_training/pl_configurations/trainer/default_trainer.yaml b/src/model/scripts/pytorch_lighting_training/pl_configurations/trainer/default_trainer.yaml new file mode 100644 index 0000000..b8752ab --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pl_configurations/trainer/default_trainer.yaml @@ -0,0 +1,7 @@ +resume_from_checkpoint: null +num_nodes: 1 +num_gpus: 4 +batch_size: 1 +accumulate_grad_batches: 512 +max_steps: 1e6 +precision: 16-mixed diff --git a/src/model/scripts/pytorch_lighting_training/pretraining.py b/src/model/scripts/pytorch_lighting_training/pretraining.py new file mode 100644 index 0000000..a072cc9 --- /dev/null +++ b/src/model/scripts/pytorch_lighting_training/pretraining.py @@ -0,0 +1,26 @@ +import hydra +from openthaigpt_pretraining_model.pl_trainer import causal_pretraining + + +@hydra.main( + version_base=None, + config_path="./pl_configurations", + config_name="config", +) +def pretraining(cfg): + causal_pretraining( + name=cfg.name, + model_config=cfg.model, + optimizer_config=cfg.optimizer, + scheduler_config=cfg.get("scheduler", None), + trainer_config=cfg.trainer, + lora_config=cfg.get("lora", None), + deepspeed_config=cfg.get("deepspeed", None), + dataset_config=cfg.dataset, + checkpointing_config=cfg.checkpointing, + logging_config=cfg.logging, + ) + + +if __name__ == "__main__": + pretraining() diff --git a/src/model/scripts/sh_file/lighting_training/README.md b/src/model/scripts/sh_file/lighting_training/README.md new file mode 100644 index 0000000..bb9e270 --- /dev/null +++ b/src/model/scripts/sh_file/lighting_training/README.md @@ -0,0 +1,30 @@ +## Install + +```bash +ml Miniconda3 + +conda create -n python=3.10 + +conda activate + +pip install -e ./src/core +pip install -e ./src/model +``` + +## Setup config + +Setup config in src\model\configuration_example + +## Preprocess Dataset + +```bash +sbatch src\model\scripts\sh_file\lighting_training\dataprocess.sh +``` + +after you proprecess dataset you should add dataset path after preprocess to dataset config + +## Train + +```bash +sbatch src\model\scripts\sh_file\lighting_training\train.sh +``` \ No newline at end of file diff --git a/src/model/scripts/sh_file/lighting_training/dataprocess.sh b/src/model/scripts/sh_file/lighting_training/dataprocess.sh new file mode 100644 index 0000000..34fd9fc --- /dev/null +++ b/src/model/scripts/sh_file/lighting_training/dataprocess.sh @@ -0,0 +1,15 @@ +#!/bin/bash +#SBATCH -p gpu +#SBATCH --gpus=0 +#SBATCH -N 1 -c 64 #number of CPUs +#SBATCH --ntasks-per-node=1 #number of GPUs +#SBATCH -t 12:00:00 +#SBATCH -A # your project id +#SBATCH -J data_process + +ml Miniconda3 + +conda deactivate +conda activate # your environment + +python src/model/scripts/lighting_training/data_preprocessing.py \ No newline at end of file diff --git a/src/model/scripts/sh_file/lighting_training/train.sh b/src/model/scripts/sh_file/lighting_training/train.sh new file mode 100644 index 0000000..1314ac9 --- /dev/null +++ b/src/model/scripts/sh_file/lighting_training/train.sh @@ -0,0 +1,15 @@ +#!/bin/bash +#SBATCH -p gpu +#SBATCH --gpus=4 +#SBATCH -N 1 -c 64 #number of CPUs +#SBATCH --ntasks-per-node=1 #number of GPUs +#SBATCH -t 48:00:00 +#SBATCH -A # your project id +#SBATCH -J train + +ml Miniconda3 + +conda deactivate +conda activate # your environment + +srun python src/model/scripts/lighting_training/train.py \ No newline at end of file diff --git a/src/model/scripts/spm_training/README.md b/src/model/scripts/spm_training/README.md new file mode 100644 index 0000000..89c3ee6 --- /dev/null +++ b/src/model/scripts/spm_training/README.md @@ -0,0 +1,28 @@ +# OpenThaiGPT tokenizer training pipeline + +## Description + +The OpenThaiGPT tokenizer training pipeline is a pipeline for training tokenizer specially for Thai language. + +## how to train + +1. you need to config argument first [configuration_example/spm/training_v1.yaml](../../configuration_example/spm/training_v1.yaml) + + - output_path (str): The path and prefix to use when saving the trained tokenizer. + - vocab_size (int): The size of the vocabulary to use when training the tokenizer. Defaults to the number of available CPU cores. + - streaming (bool): dataset streaming. Defaults to True. + - load_dataset_path (str): The name of the Hugging Face dataset to load. Defaults to "oscar". + - load_dataset_name (str): The name of the dataset split to use. Defaults to "unshuffled_deduplicated_th". + - load_dataset_local_path (str): The path to a local directory containing the input data. If specified, the Hugging Face dataset is not used. Defaults to None. + - load_dataset_data_type (str): The file type of the input data if using a local directory + - large_corpus (bool): Whether to use a large corpus. Defaults to False. + - mode(spm | bpe): type of tokenizer. Defaults to spm + +2. train tokenizer by running following script, don't forget to check and + + ```bash + python train.py + ``` + +3. View the Results + result will be in diff --git a/src/model/scripts/spm_training/train.py b/src/model/scripts/spm_training/train.py new file mode 100644 index 0000000..a08bafd --- /dev/null +++ b/src/model/scripts/spm_training/train.py @@ -0,0 +1,30 @@ +import argparse +from openthaigpt_pretraining_model.tokenizers.spm_trainer import ( + train_tokenizer, +) +from openthaigpt_pretraining_model.utils import load_hydra_config + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--configuration", + type=str, + default="../configuration_example/spm_training.yaml", + ) + + args = parser.parse_args() + + config = load_hydra_config(args.configuration).spm + + train_tokenizer( + output_path=config.output_path, + vocab_size=config.vocab_size, + is_slurm=config.is_slurm, + load_dataset_path=config.load_dataset_path, + load_dataset_name=config.load_dataset_name, + load_dataset_local_path=config.load_dataset_local_path, + load_dataset_data_type=config.load_dataset_data_type, + large_corpus=config.large_corpus, + mode=config.mode, + ) diff --git a/src/model/setup.py b/src/model/setup.py new file mode 100644 index 0000000..1a12479 --- /dev/null +++ b/src/model/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup + +setup( + name="openthaigpt_pretraining_model", + version="0.1", + packages=["openthaigpt_pretraining_model"], +) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..80415a2 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Unit test package for openthaigpt.""" diff --git a/tests/core/square_test.py b/tests/core/square_test.py new file mode 100644 index 0000000..7b6b9de --- /dev/null +++ b/tests/core/square_test.py @@ -0,0 +1,14 @@ +from openthaigpt_pretraining.example import SQUARE_TEST_CASES, CUBE_TEST_CASES + + +def test_square(): + for test_case in SQUARE_TEST_CASES: + assert test_case["x"] ** 2 == test_case["y"] + + +def test_cube(): + for test_case in CUBE_TEST_CASES: + assert test_case["x"] ** 3 == test_case["y"] + + +# sawadee krub pom:) diff --git a/tests/data/core_test.py b/tests/data/core_test.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/data/jsonl_data_example/example.jsonl b/tests/data/jsonl_data_example/example.jsonl new file mode 100644 index 0000000..419a1a7 --- /dev/null +++ b/tests/data/jsonl_data_example/example.jsonl @@ -0,0 +1,2 @@ +{"text":"ufabet 88 แทงบอลได้ใน 1 อาทิตย์"} +{"text":"เสือโคร่ง หรือ เสือลายพาดกลอน เป็นสัตว์เลี้ยงลูกด้วยน้ำนมอันดับสัตว์กินเนื้อ มีชื่อวิทยาศาสตร์ว่า Panthera tigris"} diff --git a/tests/data/mc4_test.py b/tests/data/mc4_test.py new file mode 100644 index 0000000..d871bf2 --- /dev/null +++ b/tests/data/mc4_test.py @@ -0,0 +1,30 @@ +from testcases.mc4_testcases import ( + DOCUMENT_REMOVE_TEST_CASES, + CLEAN_TEXT_TEST_CASES, + CLEAN_DATASET_TEST_CASES, +) + +from openthaigpt_pretraining_data.internet.mc4.preprocess import ( + clean_with_remove_document, + clean_text, + clean_dataset, +) +from utils_test import compare_dataset + +import copy + + +def test_document_remove(): + for test_case in DOCUMENT_REMOVE_TEST_CASES: + assert clean_with_remove_document(test_case["doc"]) == test_case["remove"] + + +def test_clean_text(): + for test_case in CLEAN_TEXT_TEST_CASES: + assert clean_text(test_case["doc"]) == test_case["new_doc"] + + +def test_clean_dataset(): + for test_case in CLEAN_DATASET_TEST_CASES: + test_case = copy.deepcopy(test_case) + compare_dataset(clean_dataset(test_case["dataset"]), test_case["new_dataset"]) diff --git a/tests/data/oscar_test.py b/tests/data/oscar_test.py new file mode 100644 index 0000000..79d1e61 --- /dev/null +++ b/tests/data/oscar_test.py @@ -0,0 +1,46 @@ +from testcases.oscar_testcases import ( + DOCUMENT_REMOVE_TEST_CASES, + CHECK_RATIO_TEST_CASES, + REMOVE_KEYWORDS_TEST_CASES, + CLEAN_TEXT_TEST_CASES, + CLEAN_DATASET_TEST_CASES, +) + +from openthaigpt_pretraining_data.internet.oscar.preprocess import ( + contains_document_removal_keywords, + check_ratio_bad_substring, + remove_partial_keywords, + clean_text, + clean_dataset, +) +from utils_test import compare_dataset + +import copy + + +def test_document_remove(): + for test_case in DOCUMENT_REMOVE_TEST_CASES: + assert ( + contains_document_removal_keywords(test_case["doc"]) == test_case["remove"] + ) + + +def test_check_ratio(): + for test_case in CHECK_RATIO_TEST_CASES: + assert check_ratio_bad_substring(test_case["doc"]) == test_case["remove"] + + +def test_remove_partial_keywords(): + for test_case in REMOVE_KEYWORDS_TEST_CASES: + assert remove_partial_keywords(test_case["doc"]) == test_case["new_doc"] + + +def test_clean_text(): + for test_case in CLEAN_TEXT_TEST_CASES: + assert clean_text(test_case["doc"]) == test_case["new_doc"] + + +def test_clean_dataset(): + for test_case in CLEAN_DATASET_TEST_CASES: + test_case = copy.deepcopy(test_case) + compare_dataset(clean_dataset(test_case["dataset"]), test_case["new_dataset"]) diff --git a/tests/data/pantip_test.py b/tests/data/pantip_test.py new file mode 100644 index 0000000..80428f1 --- /dev/null +++ b/tests/data/pantip_test.py @@ -0,0 +1,12 @@ +from openthaigpt_pretraining_data.pantip.text_cleaning import clean_html_tags + +CLEAN_HTML_TAGS_TEST_CASES = [ + {"data": "

Hello world

", "expected_output": "Hello world"}, + {"data": "

Hello world", "expected_output": "Hello world"}, + {"data": "Hello world", "expected_output": "Hello world"}, +] + + +def test_clean_html_tags(): + for test_case in CLEAN_HTML_TAGS_TEST_CASES: + assert clean_html_tags(test_case["data"]) == test_case["expected_output"] diff --git a/tests/data/square_test.py b/tests/data/square_test.py new file mode 100644 index 0000000..c018f99 --- /dev/null +++ b/tests/data/square_test.py @@ -0,0 +1,11 @@ +from openthaigpt_pretraining_data.example import SQUARE_TEST_CASES, CUBE_TEST_CASES + + +def test_square(): + for test_case in SQUARE_TEST_CASES: + assert test_case["x"] ** 2 == test_case["y"] + + +def test_cube(): + for test_case in CUBE_TEST_CASES: + assert test_case["x"] ** 3 == test_case["y"] diff --git a/tests/data/testcases/core_testcases.py b/tests/data/testcases/core_testcases.py new file mode 100644 index 0000000..7a20bb0 --- /dev/null +++ b/tests/data/testcases/core_testcases.py @@ -0,0 +1,136 @@ +# flake8: noqa +import numpy as np + +DOCUMENT_REMOVE_TEST_CASES = [ + { + "remove": True, + "doc": """หนังxจีนมาใหม่ TM0165 แม่เลี้ยงสาวWang Xiaoni หลับอยู่ เจอลูกเลี้ยงชวนเพื่อนมารุมเย็ดแม่เลี้ยง จับมอมยาสลบก่อนลวนลามลงมืดข่มขืนxxx สวิง 3-1 เย็ดจนแตกในซะใจ""", + }, + { + "remove": True, + "doc": """ถูต่ำลงนิด ต่อชีวิตเรียวกังรับแขกเข้าโรงแรมเลยจับดูดควย ดูดควยต่อชีวิตทำให้โรงแรมอยู่รอดต่อไปได้ฟินเวอร์ หนังโป๊ญี่ปุ่น หนังav ID:STARS-230 แสดงโดย Honjou Suzu""", + }, + { + "remove": True, + "doc": """UFABET สุดยอดเว็บแ ท ง บ อ ลออนไลน์ ชวนเพื่อนรับค่าคอม 0.9% ทุกการเดิมพัน เว็บหลัก ราคาบอลดีที่สุด เว็บเดียวครบ ยูฟ่าเบท เว็บตรง""", + }, + { + "remove": True, + "doc": """เกมยิงปลา เดิมพันเริ่มต้น 1 บาท ปลาตัวใหญ่แตกง่าย โบนัทเพียบ UFABET เว็บเดิมพันอันดับ 1 ของเอเชีย สมัครเกมยิงปลา ได้ที่ @UFADEAL""", + }, + { + "remove": True, + "doc": """const buttons=document.querySelectorAll('button');buttons.forEach(button=>{button.addEventListener('click',()=>{const randomColor=Math.floor(Math.random()*16777215).toString(16);document.body.style.backgroundColor="#"+randomColor;const messages=["You clicked a button!","Nice job!","Wow, you're on a roll!","Keep it up!"];const randomIndex=Math.floor(Math.random()*messages.length);alert(messages[randomIndex]);});});let secondsLeft=60;const countdown=setInterval(()=>{if(secondsLeft>0){console.log(`${secondsLeft} seconds left`);secondsLeft--;}else{console.log("Time's up!");clearInterval(countdown);}},1000);const name=prompt("What's your name?");const welcomeMessage=document.createElement('h1');welcomeMessage.textContent=`Welcome, ${name}!`;document.body.appendChild(welcomeMessage);""", + }, + { + "remove": True, + "doc": """const number=5;const double=(n)=>{return n*2;};const result=double(number);console.log(result);const greet=(name)=>{return `Hello, ${name}!`;};const message=greet("John");console.log(message);const multiply=(a,b)=>a*b;const product=multiply(3,4);console.log(product);""", + }, + { + "remove": False, + "doc": """มัสก์เกิดและเติบโตในพริทอเรีย ประเทศแอฟริกาใต้ เขาเข้าเรียนที่มหาวิทยาลัยพริทอเรีย ก่อนย้ายไปประเทศแคนาดาเมื่ออายุ 17 ปี โดยได้รับสัญชาติผ่านมารดาที่เกิดในแคนาดา สองปีต่อมา เขาเข้าเรียนที่มหาวิทยาลัยควีน และย้ายไปเรียนที่มหาวิทยาลัยเพนซิลเวเนีย ซึ่งเขาได้รับปริญญาตรีสาขาเศรษฐศาสตร์และฟิสิกส์ เขาย้ายไปอยู่ที่แคลิฟอร์เนียในปี ค.ศ. 1995 เพื่อเข้าเรียนที่มหาวิทยาลัยสแตนฟอร์ด แต่ลาออกหลังจากเข้าเรียนได้สองวันเพื่อประกอบอาชีพทางธุรกิจแทน โดยร่วมก่อตั้งบริษัทซอฟต์แวร์เว็บชื่อ ซิป2 กับ คิมบัล มัสก์ น้องชายของเขา; บริษัทถูกซื้อโดยคอมแพค ในราคา 307 ล้านดอลลาร์สหรัฐในปี ค.ศ. 1999 ในปีเดียวกันนั้น มัสก์ได้ร่วมก่อตั้งธนาคารออนไลน์ชื่อ เอ็กซ์.คอม ซึ่งควบรวมกับบริษัท คอนฟินิตี้ ในปี ค.ศ. 2000 เพื่อก่อตั้งบริษัทเพย์แพล อีเบย์ซื้อกิจการเพย์แพลในปี ค.ศ. 2002 ด้วยมูลค่า 1.5 พันล้านดอลลาร์สหรัฐ""", + }, + { + "remove": False, + "doc": """คาบิกอน หรือ Snorlax เป็นโปเกมอนที่มีลักษณะคล้ายหมีตัวใหญ่ มีผิวสีน้ำเงินเข้มอมเขียว ใบหน้า หน้าท้องและเท้ามีสีครีม ลำตัวประกอบด้วยหน้าท้องเป็นส่วนใหญ่เนื่องจากแขนขาค่อนข้างเล็ก ซึ่งพุงป่อง ๆ ของมันมีไว้เพื่อเก็บพลังงานสำรองนั่นเอง มันมีหัวโต หูตั้ง และดวงตาที่เหมือนกับกำลังนอนหลับตลอดเวลา และมีฟันเขี้ยวแหลม 2 ซี่ที่ยื่นออกมาจากขากรรไกรล่าง โดยทั่วไปแล้วคาบิกอนจะมีความสูงประมาณ 2 เมตร และมีน้ำหนักประมาณ 450 กก. """, + }, +] + +CHECK_RATIO_TEST_CASES = [ + {"remove": True, "doc": "กันยายน เมษายน เม.ย. พ.ค. ม.ค. ร.ด."}, + { + "remove": True, + "doc": """บ ิ ต ค อ ย น ์ ( B i t c o i n ) ห ร ื อ B T C ค ื อ ส ก ุ ล เ ง ิ น ด ิ จ ิ ทั ล ( C r y p t o c u r r e n c y ) ส ก ุ ล แ ร ก ข อ ง โ ล ก ที่ ถู ก สร้ าง ข ึ้ น บ น “ บ ล็ อ ก เ ช น ” ( B l o c k c h a i n ) ซ ึ่ ง เ ป็ น เ ท ค โ น โ ล ยี ที่ ใ ช้""", + }, + { + "remove": True, + "doc": """หมอน, ส้มโอ, รถไฟ, กุ้ง, เนื้อวัว, หอยนางรม, กระดาษ, แม่น้ำ, ปลาซาบะ, เตียง, สุนัข, กล้อง, ปูนา, โทรทัศน์, หอยเชลล์, สายไหม, มะม่วง, ก้อนแกลบ, กะปิ, ปลาหมึก""", + }, + { + "remove": True, + "doc": """bGF2aWVlc3RiZWxsZW1hZy5jb20# oxixagi-a.anchor.com [URL=http://oxixagi-u.com/]oxixagi-u.anchor.com[/URL] http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/…""", + }, + { + "remove": False, + "doc": """บิตคอยน์ (Bitcoin) หรือ BTC คือสกุลเงินดิจิทัล (Cryptocurrency) สกุลแรกของโลกที่ถูกสร้างขึ้นบน “บล็อกเชน” (Blockchain) ซึ่งเป็นเทคโนโลยีที่ใช้""", + }, + { + "remove": False, + "doc": """วันที่ 1 มกราคม เป็นวันแรกของปี ตามปฏิทินสุริยคติแบบเกรกอเรียน เมื่อถึงวันนี้จะยังเหลือวันอีก 364 วันในปีนั้น (365 วันในปีอธิกสุรทิน)""", + }, +] + +REMOVE_KEYWORDS_TEST_CASES = [ + { + "new_doc": """ น้องม่อน กินข้าววันไหนดี""", + "doc": """Posted by: น้องม่อน กินข้าววันไหนดี""", + }, + { + "new_doc": """บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล""", + "doc": """หน้าหลัก | ติดต่อเรา | สถานที่ตั้ง บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล""", + }, + { + "new_doc": """1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา""", + "doc": """1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา""", + }, +] + +CLEAN_TEXT_TEST_CASES = [ + { + "new_doc": "น้องม่อน กินข้าววันไหนดี", + "doc": "Posted by: น้องม่อน กินข้าววันไหนดี", + }, + { + "new_doc": "1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา", + "doc": "1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา", + }, + { + "new_doc": "", + "doc": "ถูต่ำลงนิด ต่อชีวิตเรียวกังรับแขกเข้าโรงแรมเลยจับดูดควย ดูดควยต่อชีวิตทำให้โรงแรมอยู่รอดต่อไปได้ฟินเวอร์ หนังโป๊ญี่ปุ่น หนังav ID:STARS-230 แสดงโดย Honjou Suzu", + }, + { + "new_doc": "", + "doc": """const buttons=document.querySelectorAll('button');buttons.forEach(button=>{button.addEventListener('click',()=>{const randomColor=Math.floor(Math.random()*16777215).toString(16);document.body.style.backgroundColor="#"+randomColor;const messages=["You clicked a button!","Nice job!","Wow, you're on a roll!","Keep it up!"];const randomIndex=Math.floor(Math.random()*messages.length);alert(messages[randomIndex]);});});let secondsLeft=60;const countdown=setInterval(()=>{if(secondsLeft>0){console.log(`${secondsLeft} seconds left`);secondsLeft--;}else{console.log("Time's up!");clearInterval(countdown);}},1000);const name=prompt("What's your name?");const welcomeMessage=document.createElement('h1');welcomeMessage.textContent=`Welcome, ${name}!`;document.body.appendChild(welcomeMessage);""", + }, + { + "new_doc": "บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล", + "doc": "หน้าหลัก | ติดต่อเรา | สถานที่ตั้ง บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล", + }, + { + "new_doc": "", + "doc": "บ ิ ต ค อ ย น ์ ( B i t c o i n ) ห ร ื อ B T C ค ื อ ส ก ุ ล เ ง ิ น ด ิ จ ิ ทั ล ( C r y p t o c u r r e n c y ) ส ก ุ ล แ ร ก ข อ ง โ ล ก ที่ ถู ก สร้ าง ข ึ้ น บ น “ บ ล็ อ ก เ ช น ” ( B l o c k c h a i n ) ซ ึ่ ง เ ป็ น เ ท ค โ น โ ล ยี ที่ ใ ช้", + }, + { + "new_doc": "มัสก์เกิดและเติบโตในพริทอเรีย ประเทศแอฟริกาใต้ เขาเข้าเรียนที่มหาวิทยาลัยพริทอเรีย ก่อนย้ายไปประเทศแคนาดาเมื่ออายุ 17 ปี โดยได้รับสัญชาติผ่านมารดาที่เกิดในแคนาดา สองปีต่อมา เขาเข้าเรียนที่มหาวิทยาลัยควีน และย้ายไปเรียนที่มหาวิทยาลัยเพนซิลเวเนีย ซึ่งเขาได้รับปริญญาตรีสาขาเศรษฐศาสตร์และฟิสิกส์ เขาย้ายไปอยู่ที่แคลิฟอร์เนียในปี ค.ศ. 1995 เพื่อเข้าเรียนที่มหาวิทยาลัยสแตนฟอร์ด แต่ลาออกหลังจากเข้าเรียนได้สองวันเพื่อประกอบอาชีพทางธุรกิจแทน โดยร่วมก่อตั้งบริษัทซอฟต์แวร์เว็บชื่อ ซิป2 กับ คิมบัล มัสก์ น้องชายของเขา; บริษัทถูกซื้อโดยคอมแพค ในราคา 307 ล้านดอลลาร์สหรัฐในปี ค.ศ. 1999 ในปีเดียวกันนั้น มัสก์ได้ร่วมก่อตั้งธนาคารออนไลน์ชื่อ เอ็กซ์.คอม ซึ่งควบรวมกับบริษัท คอนฟินิตี้ ในปี ค.ศ. 2000 เพื่อก่อตั้งบริษัทเพย์แพล อีเบย์ซื้อกิจการเพย์แพลในปี ค.ศ. 2002 ด้วยมูลค่า 1.5 พันล้านดอลลาร์สหรัฐ", + "doc": """มัสก์เกิดและเติบโตในพริทอเรีย ประเทศแอฟริกาใต้ เขาเข้าเรียนที่มหาวิทยาลัยพริทอเรีย ก่อนย้ายไปประเทศแคนาดาเมื่ออายุ 17 ปี โดยได้รับสัญชาติผ่านมารดาที่เกิดในแคนาดา สองปีต่อมา เขาเข้าเรียนที่มหาวิทยาลัยควีน และย้ายไปเรียนที่มหาวิทยาลัยเพนซิลเวเนีย ซึ่งเขาได้รับปริญญาตรีสาขาเศรษฐศาสตร์และฟิสิกส์ เขาย้ายไปอยู่ที่แคลิฟอร์เนียในปี ค.ศ. 1995 เพื่อเข้าเรียนที่มหาวิทยาลัยสแตนฟอร์ด แต่ลาออกหลังจากเข้าเรียนได้สองวันเพื่อประกอบอาชีพทางธุรกิจแทน โดยร่วมก่อตั้งบริษัทซอฟต์แวร์เว็บชื่อ ซิป2 กับ คิมบัล มัสก์ น้องชายของเขา; บริษัทถูกซื้อโดยคอมแพค ในราคา 307 ล้านดอลลาร์สหรัฐในปี ค.ศ. 1999 ในปีเดียวกันนั้น มัสก์ได้ร่วมก่อตั้งธนาคารออนไลน์ชื่อ เอ็กซ์.คอม ซึ่งควบรวมกับบริษัท คอนฟินิตี้ ในปี ค.ศ. 2000 เพื่อก่อตั้งบริษัทเพย์แพล อีเบย์ซื้อกิจการเพย์แพลในปี ค.ศ. 2002 ด้วยมูลค่า 1.5 พันล้านดอลลาร์สหรัฐ""", + }, + { + "new_doc": "คาบิกอน หรือ Snorlax เป็นโปเกมอนที่มีลักษณะคล้ายหมีตัวใหญ่ มีผิวสีน้ำเงินเข้มอมเขียว ใบหน้า หน้าท้องและเท้ามีสีครีม ลำตัวประกอบด้วยหน้าท้องเป็นส่วนใหญ่เนื่องจากแขนขาค่อนข้างเล็ก ซึ่งพุงป่อง ๆ ของมันมีไว้เพื่อเก็บพลังงานสำรองนั่นเอง มันมีหัวโต หูตั้ง และดวงตาที่เหมือนกับกำลังนอนหลับตลอดเวลา และมีฟันเขี้ยวแหลม 2 ซี่ที่ยื่นออกมาจากขากรรไกรล่าง โดยทั่วไปแล้วคาบิกอนจะมีความสูงประมาณ 2 เมตร และมีน้ำหนักประมาณ 450 กก.", + "doc": """คาบิกอน หรือ Snorlax เป็นโปเกมอนที่มีลักษณะคล้ายหมีตัวใหญ่ มีผิวสีน้ำเงินเข้มอมเขียว ใบหน้า หน้าท้องและเท้ามีสีครีม ลำตัวประกอบด้วยหน้าท้องเป็นส่วนใหญ่เนื่องจากแขนขาค่อนข้างเล็ก ซึ่งพุงป่อง ๆ ของมันมีไว้เพื่อเก็บพลังงานสำรองนั่นเอง มันมีหัวโต หูตั้ง และดวงตาที่เหมือนกับกำลังนอนหลับตลอดเวลา และมีฟันเขี้ยวแหลม 2 ซี่ที่ยื่นออกมาจากขากรรไกรล่าง โดยทั่วไปแล้วคาบิกอนจะมีความสูงประมาณ 2 เมตร และมีน้ำหนักประมาณ 450 กก. """, + }, +] + +CLEAN_DATASET_TEST_CASES = [] +np.random.seed(0) + +docs = [] +new_docs = [] +for testcase in CLEAN_TEXT_TEST_CASES: + docs.append(testcase["doc"]) + new_docs.append(testcase["new_doc"]) + +for i in range(10): + n = np.random.randint(1, 5, 1) + arr = np.random.choice(len(docs), n, replace=False) + + selected_docs = [] + selected_new_docs = [] + + for d in arr: + selected_docs.append(docs[d]) + if new_docs[d] != "": + selected_new_docs.append(new_docs[d]) + + CLEAN_DATASET_TEST_CASES.append( + {"dataset": selected_docs, "new_dataset": selected_new_docs} + ) diff --git a/tests/data/testcases/mc4_testcases.py b/tests/data/testcases/mc4_testcases.py new file mode 100644 index 0000000..9acaf2b --- /dev/null +++ b/tests/data/testcases/mc4_testcases.py @@ -0,0 +1,737 @@ +# flake8: noqa +import numpy as np + +DOCUMENT_REMOVE_TEST_CASES = [ + { + "remove": True, + "doc": """เล่มที่2 บทที่ 41 ต่างหูแห่งการต่อต้าน... +อี รึ่งชั่วโมงต่อมา ๤า๱ใต้การโจมตี๪ั๞บ้าคลั่งของวัวดุคลั่งแค้นทั้งสิบสองตัวตั้งแ๺่ต้นจนจบเย่เทียนเซี่ยไม่ได้รับบาดเจ็บและไม่ถูกสัมผัสเลยแม้แ๺่๦ิ๨เดียว ยิ่งเ๯๝าผ่านไปการตอบสนองของเย่เทียนเซี่ยก็ยิ่งผ่อนคลายลง เนื่องจาก๻๪๞ที่วัวดุคลั่งแค้นเหล่านั้นเปิ๨ฉา ุ่งโจมตีเขา รูปแบบการโจมตีของพวกมันจะเป็๞เส้นตรง ไม่สามารถ๺ามการเคลื่อนที่ของเป้าหมายที่เป็๞แนวโค้งได้ นี่เป็๞๮๞ึ่๫ใ๦เหตุผลสำคัญที่เย่เทียนเซี่ยสามารถรอดชีวิตมาได้นานขนาดนี้โดยไม่ได้รับบาดเจ็บเลยแม้แ๺่ที่เดียว +เ๣ื่๪วัวดุคลั่งแค้นตัวแรกล้มลง ความกดดันของเย่เทียนเซี่ยก็ค่อยๆหายไปทีละน้อย รอยยิ้มแห่งความสุขฉายชัดบนใบ๩๦้าของเขา และแล้วขณะที่เย่เทียนเซี่ยกำลังเคลื่อนที่ด้วยความเร็วเขาก็หาโอกาสโจมตีได้อี รั้ง ๣ื๪ขวาของเขาเหวี่ยงออกไปด้าน๩๦้า โจมตีด้วยพลัง๪ั๞ยอดเยี่ยม..... +เ๯๝าผ่านไปทีละ๦ิ๨ๆ ใ๦การต่อสู้๪ั๞ยุ่งเหยิงเป็๞เ๯๝านานของผู้เล่นเ๝เ๯๝ 10 และบอสสามดาวเ๝เ๯๝ 10 ทั้ง 12 ตัว เพียง๻้า๞ทานไว้ได้สิบกว่าวินาทีก็เพียงพอที่จะทำให้ผู้คนอื่นอ้าปา ้างได้แล้ว ตำนาน“ราชาปีศาจไร้พ่าย” ไม่ได้มาจากไอเทม๪ั๞แข็งแกร่งและ๳ุ๟สมบัติที่เขามี แ๺่เป็๞เพราะความเทพของเขาที่สามารถรักษาตำแหน่งอยู่เหนือผู้คนเป็๞ล้านได้ ใ๦โลกแห่งเกม๷่๪๞๩๦้านี้เพียงแค่ชื่อเทียนโม่เซี่ยโผล่ขึ้นมา ไม่ว่าฉากนั้นจะยิ่งใหญ่แค่ไหน ก็ล้วนกลายเป็๞การแสดง๪ั๞งดงามที่มีเขาเป็๞ตัวละครหลัก +แ๱๫สีดำถูกปล่อยออกไป วัวดุคลั่งแค้นตัวที่สองก็ล้มลง.......๮๧ั๫จากนั้นสิบกว่าวินาที วัวดุคลั่งแค้นอีกตัวก็ล้มลง๤า๱ใต้การโจมตีของห้วงเ๯๝าแห่งโชคชะ๺า +""", + }, + { + "remove": True, + "doc": """แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ ป การศ กษา 2555 +Download "แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ ป การศ กษา 2555" +แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ จ ดท าข นจากข อเสนอแนะของ คณะกรรมการประเม นค ณภาพภายในมหาว ทยาล ยพาย พ ประจ า 2554 ประกอบด วยข อม ล 2 ส วนด งน 1. เอกสารส วนหน า (ร าง) แผนพ ฒนาค ณภาพ มหาว ทยาล ยพาย พ ข อม ลท ใช ในการจ ดท า : ข อเสนอแนะในภาพรวม 2. เอกสารแนบ แนวทางปร บปร งแก ไขเพ อพ ฒนาค ณภาพ ข อม ลท ใช ในการจ ดท า : ข อเสนอแนะรายองค ประกอบ หมายเหต มหาว ทยาล ยพาย พจะพ จารณาปร บงบประมาณกลาง เพ อรองร บแผนพ ฒนา ค ณภาพ เป นส าค ญ +ประเด น (องค ประกอบค ณภาพ ต วบ งช ท เก ยวข อง) ความเช อมโยงก บ แผนงานต างๆ (ต วบ งช : kpi) ต วบ งช ความส าเร จ ตามประเด น ค าเป าหมาย ความส าเร จ ตามประเด น แผนงาน โครงการ หร อแนวทางการด าเน นงาน ในการให บร การทางว ชาการ แล ว งบประมาณ ผ ร บผ ดชอบ ระยะเวลา การรายงาน ข อม ล 2 มหาว ทยาล ยพาย พจะ สน บสน นและอ านวย ความสะดวกในการท า ว จ ยของอาจารย มาก ข น (องค ประกอบ 4 ต วบ งช สกอ. 4.1, 4.2, 4.3 ต วบ งช สมศ. 5, 6) แผนกลย ทธ 55-59: (kpi 13, 15, 16, 17, 42) แผนปฏ บ ต การ 55 : (kpi 18, 20, 21, 22, 47) แผนบร หารความ เส ยง 55 ร อยละของ จ านวน อาจารย ประจ า ท ท าว จ ยต อ จ านวน อาจารย ท งหมด ร อยละ 25 1.จ ดเจ าหน าท ส าน กว จ ยไปด แลและอ านวยความสะดวก ในการท าว จ ยเป นรายคณะว ชา 2.ปร บปร งข นตอนการ""", + }, + { + "remove": True, + "doc": """ฝากเงิน การแทงบอล ยังไงให้ปลอดถัยที่สุด +การแทงบอล หลายคนอาจจะมองว่า เป็นกิจกรรมที่ทำให้เสียเงิน มากกว่าได้ แต่ในความเป็นจริงแล้วมีคนลงทุน หารายได้กับ การแทงบอล อย่างมากมาย และหลายคนก็มองว่า การแทงบอล ออนไลน์มีความเสี่ยง ต่อการโดนโกงสูงมาก ดังนั้นการที่เราเลือกเว็บพนัน ที่มีความมั่นคงสูง อย่างเช่น FIFA55 BNK คุณไม่จำเป็นต้องกังวลเลยว่าจะโดนโกง เล่นได้แล้วไม่จ่าย เพราะทางเว็บ FIFA55 BNK เป็นเว็บตรง ไม่ผ่านเอเย่นต์ และเรื่องพื้นฐานอย่างการฝาก – ถอน เงินเข้าออกระบบ วันนี้ทางเราจึงจะมาแนะนำ วิธีการฝากเงินแบบต่างๆ เพื่อให้เกิดความผิดพลาด ที่น้อยที่สุด +""", + }, + { + "remove": True, + "doc": """Lปาร์ม่า3 - 0อตาลันต้า - กัลโช่ เซเรีย อา +Lลาซิโอ0 - 2ปาร์ม่า - กัลโช่ เซเรีย อา +Wปาร์ม่า1 - 3เจนัว - กัลโช่ เซเรีย อา +Wเอ็มโปลี1 - 0ปาร์ม่า - กัลโช่ เซเรีย อา +Lปาร์ม่า3 - 0นาโปลี - กัลโช่ เซเรีย อา +Wสปอล0 - 3โฟรซิโนเน่กัลโช่ เซเรีย +Dโฟรซิโนเน่3 - 3เอ็มโปลีกัลโช่ เซเรีย +Lโตริโน่3 - 2โฟรซิโนเน่กัลโช่ เซเรีย +Lโฟรซิโนเน่1 - 2เจนัวกัลโช่ เซเรีย +Lโรม่า4 - 0โฟรซิโนเน่กัลโช่ เซเรีย +ปาร์ม่า2 - 0โฟรซิโนเน่กัลโช่ เซเรีย +โฟรซิโนเน่2 - 1ปาร์ม่ากัลโช่ เซเรีย +โฟรซิโนเน่1 - 2ปาร์ม่ากัลโช่ เซเรีย +ปาร์ม่า2 - 2โฟรซิโนเน่กัลโช่ เซเรีย +ตารางคะแนนกัลโช่ เซเรีย อา อิตาลี ล่าสุด +ยูเวนตุส 11 10 1 0 24 8 16 31 +อินเตอร์ มิลาน 11 8 1 2 21 6 15 25 +นาโปลี 11 8 1 2 24 12 12 25 +เอซี มิลาน 10 5 3 2 20 14 6 18 +ลาซิโอ 10 6 0 4 13 12 1 18""", + }, + { + "remove": True, + "doc": """โรงแรมอันดับ 1 จาก 4 แห่ง ใน a Petropolis +ที่พั ร้อมอาหารเช้าอันดับ 10 จาก 21 แห่ง ใน Bento Goncalves +โรงแรมอันดับ 4 จาก 9 แห่ง ใน Bento Goncalves +โรงแรมอันดับ 9 จาก 9 แห่ง ใน Bento Goncalves +ที่พั ร้อมอาหารเช้าอันดับ 4 จาก 21 แห่ง ใน Bento Goncalves +โรงแรมอันดับ 2 จาก 9 แห่ง ใน Bento Goncalves +โรงแรมอันดับ 7 จาก 9 แห่ง ใน Bento Goncalves +ที่พักแบบพิเศษอันดับ 2 จาก 94 แห่ง ใน กรามาโด +ที่พั ร้อมอาหารเช้าอันดับ 1 จาก 20 แห่ง ใน a Petropolis +ที่พั ร้อมอาหารเช้าอันดับ 1 จาก 1 แห่ง ใน Garibaldi +ที่พั ร้อมอาหารเช้าอันดับ 32 จาก 124 แห่ง ใน กรามาโด +โรงแรมอันดับ 3 จาก 14 แห่ง ใน กาชีอัสดูซูล""", + }, + { + "remove": True, + "doc": """พิเศษสำหรับ ลูกค้าใหม่สั่งครั้งแรก คลิกที่นี่ เพื่อรับส่วนลด$10 เมื่อสั่งสินค้าครบ $40 (หากสั่งต่ำกว่า $40 จะได้รับส่วนลด $5) ขาย วิตามิน อาหารเสริม ราคาถูก วิธีสั่งของ iherb pantip รีวิว คูปองส่วนลด +ลูกค้าใหม่สั่งของ iHerb ได้ส่วนลดเพิ่ม $10 +เมื่อใช้โค้ดคูปอง TPK615 ในการสั่งซื้อสินค้าครบ $40 +คลิกที่นี่ เพื่อไปหน้าสินค้าทดลองราคาพิเศษ +คลิกที่นี่ เพื่อไปหน้าโปรโมชั่นประจำสัปดาห์ +คลิกที่นี่ เพื่อไปยังหน้าหลัก เว็บ iHerb.com +iHerb สินค้าราคาพิเศษ +สั่งภายในวันที่ 3 กันยายน 2557 +สินค้ายี่ห้อดังลดทุกชิ้น 20% +D'Adamo Personalized Nutrition Made in Nature Nordic Care, LLC. +สินค้าอื่นๆลดกระหน่ำ แชมพูสระผมอาบน้ำสูตรอ่อนโยนจาก Mild By Nature ราคาเพียง $0.95 +(ราคาพิเศษสั่งได้ 1 กระปุกเท่านั้น) +โกโก้ผงสำหรับบำรุงสุขภาพ(หัวใจ) ราคาเพียง $6.95 จากปกติ 19.99 +เซรั่มบำรุงผิวจากสารสกัดเปลือกสนฝรั่งเศส ราคาเพียง $2.95 +อาหารเสริมต้านอนุมูลอิสระขั้นเทพ Madre Labs SuperFoods ลด 25% ทุกชิ้น""", + }, + { + "remove": True, + "doc": """ให้เช่า บ้านมือสอง ใกล้ MRT แยกติวานนท์ | The Nation +MRT แยกติวานนท์ เช่า +ให้เช่า บ้านมือสอง MRT แยกติวานนท์ +เลือก บ้านมือสอง ได้หลากหลายรูปแบบ ใกล้ MRT แยกติวานนท์ +ค้นหา บ้านมือสอง ได้ สำหรับ ทุกงบประมาณ และ ทุกรูปแบบ ใกล้ MRT แยกติวานนท์ +บ้านมือสอง ประเภทใด ที่คุณกำลังมองหาใกล้ MRT แยกติวานนท์? +คุณเป็น เจ้าของ บ้านมือสอง ใกล้ MRT แยกติวานนท์ หรือไม่? +อสังหาริมทรัพย์ ให้เช่า ใกล้ MRT แยกติวานนท์ 0 อสังหาริมทรัพย์ +คอนโด ให้เช่า ใกล้ MRT แยกติวานนท์ 0 คอนโด +อพาร์ทเม้นท์ ให้เช่า ใกล้ MRT แยกติวานนท์ 0 อพาร์ทเม้นท์ +เพ้นท์เฮ้าส์ ให้เช่า ใกล้ MRT แยกติวานนท์ 0 เพนท์เฮ้าส์ +บ้าน ให้เช่า ใกล้ MRT แยกติวานนท์ 0 บ้าน +ทาวน์เฮ้าส์ ให้เช่า ใกล้ MRT แยกติวานนท์ 0 ทาวน์เฮ้าส์""", + }, + { + "remove": True, + "doc": """{"BOOKING_FEATURES": ["IB_STREAMLINED_SELECTED_ROOM","IB_NEW_REG_FLOW_INTERRUPTER","IB_SHOW_EMAIL_FOR_INSECURE_LOGIN","RCMS_INLINE_ROOM_GRID_MAX_OCC","IB_POST_BOOKING_LOGIN","IB_IRG_PERFORMANCE_METRICS","IB_IRG_MATCH_META","CHILDREN_SEARCH","IB_DW_INLINE_PASSWORD","HR_IB_EXCLUDE_TAXES_AND_FEES","IB_DW_CCNAME_WITH_AUTOCOMPLETE","IB_IRG_PERFORMANCE_METRICS_MOBILE","STORED_CARDS","IB_POST_BOOK_LOGIN_CTA","IB_PRICE_WINS_COPY","IB_DW_PROMPT_KNOWN_EMAIL","IB_PRICES_OUTSIDE_ROOM_BUTTON","IB_HIDE_MSNBC_LARGEST_SITE_QUOTE","IB_EXIT_INTERRUPTER","IB_SHOW_AMENITIES_AS_ICONS","IB_NEW_REG_FLOW","META_AIR","IB_INLINE_ROOM_GRID","IB_TIME_OF_STAY_PAYMENT_TYPES_V3","IBEX_HIGH_EQUITY_BRANDING","IB_PRICE_WINS_POST_TX","IB_BOOKING_FORM_FAVICON","IB_URGENCY_BLOCK","IB_NEW_REG_FLOW_POST_BOOK"] , "IMPRESSION_KEY": "f0b77ea85bb94dc2bf6463d2c3e24ae5", "roomSelectionModel": null, "ibAvailability": false, "metaAvailability": false, "numHacTries": -1, "checkIn": null, "checkOut": null, "lowestPrice": null, "hasDates": null, "hacComplete": false, "contentIdMappings": {}, "pollingEnabled": false, "preventScroll": false, "offerClickToken": null, "conditionalUpdate": false, "divClasses": "ppr_rup ppr_priv_ibex_inline_room_grid", "singlePartnerRoomGridWidget": {"widget":{"name":"ibex_room_grid","divClasses":"prw_rup prw_ibex_room_grid","moduleList":["handlers","tracking"],"js":""", + }, + { + "remove": True, + "doc": """,this.$list=e(t).appendTo(this.$grid).on("click touchstart","li",function(){o.jumpTo(e(this).data("index"))}),this.$list.find("img").hide().one("load",function(){var t,n,o,s,i=e(this).parent().removeClass("fancybox-thumbs-loading"),a=i.outerWidth(),r=i.outerHeight();t=this.naturalWidth||this.width,n=this.naturalHeight||this.height,o=t/a,s=n/r,o>=1&&s>=1&&(o>s?(t/=s,n=r):(t=a,n/=o)),e(this).css({width:Math.floor(t),height:Math.floor(n),"margin-top":Math.min(0,Math.floor(.3*r-.3*n)),"margin-left":Math.min(0,Math.floor(.5*a-.5*t))}).show()}).each(function(){this.src=e(this).data("src")})},focus:function(){this.instance.current&&this.$list.children().removeClass("fancybox-thumbs-active").filter('[data-index="'+this.instance.current.index+'"]').addClass("fancybox-thumbs-active").focus()},close:function(){this.$grid.hide()},update:function(){this.instance.$refs.container.toggleClass("fancybox-container--thumbs",this.isVisible),this.isVisible?(this.$grid||this.create(),this.$grid.show(),this.focus()):this.$grid&&this.$grid.hide(),this.instance.update()},hide:function(){this.isVisible=!1,this.update()},show:function(){this.isVisible=!0,this.update()},toggle:function(){this.isVisible?this.hide():this.show()}}),e(t).on("onInit.fb",function(t,e){var o=e.group[0],s=e.group[1];e.opts.thumbs&&!""", + }, + { + "remove": True, + "doc": """ครีมรักษาฝ้าเลือด รูปภาพลินินไวท์เทนนิ่งครีม +ฝ้ากระน้ำมันในทะเล buckthorn ฝ้ากระหายไปว่าจะทำอย่างไร, askorutin ของผิวคล้ำในความคิดเห็นของใบหน้า ครีมสำหรับผิวคล้ำ. จุดที่คอในระหว่างตั้งครรภ์ ไวท์เทนนิ่งครีมจากจุดเม็ดสีสำหรับมือ, ฝ้ากระไข่ เพลงของฉัน Nadyushka ฝ้ากระสีแดง. +ครีมโสมทาฝ้าแดด มาทดลองใช้ ครีมบำรุงซื้อจากร้าน 7-11 เพลง ansambly และ vesnushki เต้นรำ +สิ่งที่เป็นไวท์เทนนิ่งครีม เอาของเหลวสีไนโตรเจนจุดการจัดอันดับ, ยาจุดอายุซื้อ ลักษมีคิดเห็นไวท์เทนนิ่งครีม. เกาหลีกับกระ ฝ้ากระ Minusovka Varlamov, ขัดผิวธรรมชาติ Siberica ไวท์เทนนิ่ง exfoliant อ่อน ไวท์เทนนิ่งครีมจาก Garnier. +วิธีแก้ฝ้าเลือด ฝ้าลึก ฝ้าฮอร์โมน รุนแรงสำหรับคนผิวบอบบาง ความคิดเห็นในการลบฝ้ากระเลเซอร์ ครีมบางอย่างสำหรับฝ้ากระ +ฝ้ากระอนุบาล n ต้นโอ๊ก ธรรมชาติบำบัดกับกระ, ครีม zashtishtayushtiy ของผิวคล้ำ น้ำว่านหางจระเข้ในจุดอายุ. ความคิดเห็น Urinotherapy ของจุดเม็ดสี ด้วยครีมผิวคล้ำ, คนสวยที่มีฝ้ากระ โรงเรียนอนุบาลฝ้ากระความคิดเห็นครัสโนดาร์. +5 วิธีรักษาฝ้า(melasma )ด้วยมะนาว(Lemon)ปลอดภัยเห็นผลจริง! แก้ไขจุดเม็ดสีในการแต่งหน้า""", + }, + { + "remove": True, + "doc": """แผนที่ เธฃเน�เธฒเธ�เธญเธฒเธซเธฒเธฃเธ�เน�เธฒเธ�เธ�เธฃเธนเธญเธตเน�เธ� เน�เธ�เธฃ.038-612-261 จังหวัดระยอง :: แผนที่ประเทศไทย , Thailand-Map-Guide.com +แผนที่ เธฃเน�เธฒเธ�เธญเธฒเธซเธฒเธฃเธ�เน�เธฒเธ�เธ�เธฃเธนเธญเธตเน�เธ� เน�เธ�เธฃ.038-612-261 จังหวัดระยอง +แสดงเส้นทางเดินทาง เส้นทางขับรถ จาก อนุสาวรีย์ชัยสมรภูมิ (กรุงเทพฯ) ไป เธฃเน�เธฒเธ�เธญเธฒเธซเธฒเธฃเธ�เน�เธฒเธ�เธ�เธฃเธนเธญเธตเน�เธ� เน�เธ�เธฃ.038-612-261 จังหวัดระยอง +- คลิกที่นี่... เพื่อดูแผนที่เธฃเน�เธฒเธ�เธญเธฒเธซเธฒเธฃเธ�เน�เธฒเธ�เธ�เธฃเธนเธญเธตเน�เธ� เน�เธ�เธฃ.038-612-261 แบบเต็มจอ""", + }, + { + "remove": True, + "doc": """E0B89F Tesla-E0 B9 89 E0 miniB8 B2 ระบบเครื่องยนต์E0 B9 E0-version +Angry Bird E0 B9 80 E0 B8 81 E0 B8 A1 E0 B8 AA E0 B9 8C E0 B8 82 E0 B8 B1 E0 B8 9A E0 B8 A3 E0 B8 96 E0 B8 8A E0 B8 99 E0 B8 9C E0 B8 B5 E0 B8 8B E0 B8 AD E0 B8 A1 E0 B8 9A E0 B9 80 E0 B8 81 E0 B8 A1 E0 B8 AA E0 B9 8C E0 B8 97 E0 B8 B3 E0 B9 80 E0 B8 84 E0 B9 89 E0 B8 81 E0 B8 81 E0 B8 A5 E0 B9 89 E0 B8 A7 E0 B8 A2 E0 B8 AB E0 B8 AD% E0 B9 80 E0 B8 81 E0 B8 A1 E0 B9 81 E0 B8 95 E0 B9 88 E0 B8 87 E0 B8 95 E0 B8 B1 E0 B8 A7 E0 B8 99 E0 B8 B2 E0 B8 87 E0 B8 9F E0 B9 89 E0 B8 B2 E0 B9 81 E0 B8 AA E0 B8 99 E0 B8 AA E0 B8 A7 E0 B8 A2 +รวมผลิตภัณฑ์สำหรับ a Core 8 0 สำหรับ E46)""", + }, +] + +CLEAN_TEXT_TEST_CASES = [ + { + "new_doc": """ไอเดียบ้านไร่สําหรับการเพลิดเพลินกับความสงบของธรรมชาติ """, + "doc": """พบ 1,023 ตำแหน่ง << 1 - 20 21 - 40 41 - 60 61 - 80 81 - 100 101 - 120 121 - 140 141 - 160 161 - 180 181 - 200 201 - 220 221 - 240 241 - 260 261 - 280 281 - 300 301 - 320 321 - 340 341 - 360 361 - 380 381 - 400 401 - 420 421 - 440 441 - 460 461 - 480 481 - 500 501 - 520 521 - 540 541 - 560 561 - 580 581 - 600 601 - 620 621 - 640 641 - 660 661 - 680 681 - 700 701 - 720 721 - 740 741 - 760 761 - 780 781 - 800 801 - 820 821 - 840 841 - 860 861 - 880 881 - 900 901 - 920 921 - 940 941 - 960 961 - 980 981 - 1000 100 +งานสิทธิบัตรและประกันสังคม + ไอเดียบ้านไร่สําหรับการเพลิดเพลินกับความสงบของธรรมชาติ << ย้อนกลับ [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ][ 8 ][ 9 ][ 10 ][ 11 ] 12 [ 13 ][ 14 ][ 15 ][ 16 ][ 17 ][ 18 ][ 19 ][ 20 ][ 21 ][ 22 ][ 23 ][ 24 ][ 25 ][ 26 ][ 27 ][ 28 ][ 29 ][ 30 ][ 31 ][ 32 ][ 33 ][ 34 ][ 35 ][ 36 ][ 37 ][ 38 ][ 39 ][ 40 ][ 41 ][ 42 ][ 43 ][ 44 ][ 45 ][ 46 ][ 47 ] หน้าถัดไป>> +<< ก่อนหน้า 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 ถัดไป>>วันที่ 18 กรกฎาคม 2562 ชม 99564 ครั้ง +ก่อนหน้า 1 2 3 4 [5] 6 7 8 9 10 11 12 ต่อไป""", + }, + { + "new_doc": """ตัว code embedded server-side no views today No views yet """, + "doc": """ตัว code embedded server-side <% if ( total_view > 0 ) { %> <%= total_view > 1 ? "total views" : "total view" %> <% if ( today_view > 0 ) { %> <%= today_view > 1 ? "views today" : "view today" %> no views today No views yet <% uncompleted format""", + }, + { + "new_doc": """โตเกียวเป็นเมืองหลวงที่ทันสมัย และเต็มไปด้วยแสงสี และมีสถานที่ท่องเที่ยวที่น่าสนใจหลายแห่ง ส่วนที่ไหนที่ควรจัดอยู่ในโปรแกรมเที่ยวญี่ปุ่นครับ ในระยะยาวกับผู้ป่วยที่มีจุดกลางรับภาพจอประสาทตาบวม +Dr Hykin กล่าวเสริมว่าอย่างไรก็ดีเขาเชื่อว่าการใช้เลเซอร์รักษายังมีบทบาทสำคัญในการรักษาผู้ป่วยที่มีจุดกลางรับภาพจอประสาทตาบวมจากเบาหวาน(DME) ล่นแล้วอาจจะติดใจก็ได้ เอาล่ะงั้นเราจะเสียเวลากันทำไมเลือกเล่นแบบโต๊ะใหญ่แล้วต่อด้วยสนุ๊กระเบิดกันเลยดีกว่า +ยะลา -ซาไกเข้าเมืองขอเมล็ดพันธุ์พืชทางการเกษตรไปปลูก (ชมคลิป) - หนังสือพิมพ์ ดี ดี โพสต์นิวส์ +นักเรียนแชมป์โลกโครงงานวิทยาศาสตร์""", + "doc": r"""ต่อไป โครงการบ้านศรุตาปา +โตเกียวเป็นเมืองหลวงที่ทันสมัยและเต็มไปด้วยแสงสี และมีสถานที่ท่องเที่ยวที่น่าสนใจหลายแห่ง ส่วนที่ไหนที่ควรจัดอยู่ในโปรแกรมเที่ยวญี่ปุ่นครับ
ในระยะยาวกับผู้ป่วยที่มีจุดกลางรับภาพจอประสาทตาบวม + Dr Hykin กล่าวเสริมว่าอย่างไรก็ดีเขาเชื่อว่าการใช้เลเซอร์รักษายังมีบทบาทสำคัญในการรักษาผู้ป่วยที่มีจุดกลางรับภาพจอประสาทตาบวมจากเบาหวาน(DME)
ล่นแล้วอาจจะติดใจก็ได้ เอาล่ะงั้นเราจะเสียเวลากันทำไมเลือกเล่นแบบโต๊ะใหญ่แล้วต่อด้วยสนุ๊กระเบิดกันเลยดีกว่า +ยะลา-ซาไกเข้าเมืองขอเมล็ดพันธุ์พืชทางการเกษตรไปปลูก (ชมคลิป) - หนังสือพิมพ์ ดี ดี โพสต์นิวส์ +ยะลา-ซาไกเข้าเมืองขอเมล็ดพันธุ์พืชทางการเกษตรไปปลูก (ชมคลิป) +ข่าว ศน.สพม.8 > +นักเรียนแชมป์โลกโครงงานวิทยาศาสตร์""", + }, + { + "new_doc": """มีข้อความข้างหน้า มีข้อความต่อ""", + "doc": """http://www.dobrolubie.ru/forum/index.php?showuser=59153 +http://www.uzsat.net/index.php?showuser=22989 ตัวหนังสือแทรก +http://www.prevedrussia.ru/projectrussiaclub/forum/index.php?showuser=17747 +http://www.feedagg.com/feed/583/member.php?u=215917 +มีข้อความข้างหน้า http://www.bizmama.ru/forum/index.php?showuser=35150 มีข้อความต่อ +http://www.jagfile.info/forum/index.php?action=profile;u=6233 +http://forum.tvoi.net.ua/index.php?showuser=32548 +http://bellydance-sakh.ru/forum/index.php?showuser=71723 +http://www.thainationalfilm.com/site/webboard/profile.php?mode=viewprofile&u=91394 +http://www.forum.lacrimosafan.ru/index.php?showuser=24795 +http://www.akiba-online.com/forum/member.php?u=509353 +http://forum.streetbox.ru/index.php?s=0e393c8c0bffcf96760525b9fcfa164c&showuser=41952 มีข้อความต่อไป +http://www.hizkod.com/member.php?7-cacomeza +http://jedeni.ru/index.php?showuser=5431 +http://forum.sa.volgocity.ru/index.php?showuser=369628 +https://iapi.bot.or.th/Stat/Stat-ExchangeRate/DAILY_AVG_EXG_RATE_V1/?start_period=2018-02-01&end_period=2018-02-01¤cy=USD +http://radiofreewashington.com http://cankardeslernakliyat.com http://survivalsolarkit.com http://nosscholengemeenschap.com http://viajesferrer.com http://pennsylvania-resorts.comrow=862 +http://www.journal-social.mcu.ac.th/wp-content/uploads/2015/06/%E0%B9%90%E0%B9%97-%E0%B8%94%E0%B8%A7%E0%B8%87%E0%B9%83%E0%B8%88.pdf +https://example.com/search?query=language+model&page=2#results +alibaba.com shopee.co.th look.mp4 data.pdf +ห้อง.เดี่ยว ปลาทอง.jp""", + }, + { + "new_doc": """อาไวเกมส์เยือนแพ้รวด ทีเด็ดบอลวางฟลูมิเนนเซเบาๆ""", + "doc": r"""| 18/05/61 | เปิดดู 2285 | หมวด คอนโดมิเนียม | กรุงเทพมหานคร | ดูแผนที่ +| 18/05/61 | เปิดดู 3125 | หมวด คอนโดมิเนียม | กรุงเทพมหานคร | ดูแผนที่ +| 18/05/61 | เปิดดู 1974 | หมวด คอนโดมิเนียม | ชลบุรี | ดูแผนที่ +| 16/03/61 | เปิดดู 2170 | หมวด คอนโดมิเนียม | กรุงเทพมหานคร | ดูแผนที่ +| 13/11/60 | เปิดดู 2022 | หมวด คอนโดมิเนียม | กรุงเทพมหานคร | ดูแผนที่ +| 16/06/60 | เปิดดู 1861 | หมวด คอนโดมิเนียม ผู้สูงอายุ | กรุงเทพมหานคร | ดูแผนที่ +|เริ่มต้น abcde efgh | ijklm +ข้อความทดสอบ|ab/d|de fg + เริ่มข้อความ |20/05/62| 22/05/63 | สิ้นสุดข้อความ + +อาไวเกมส์เยือนแพ้รวด ทีเด็ดบอลวางฟลูมิเนนเซเบาๆ + |23 ก.ย 2562| 22 ก.ย 2562| 21 ก.ย 2562| 20 ก.ย 2562| 19 ก.ย 2562| 18 ก.ย 2562| 17 ก.ย 2562| 16 ก.ย 2562| 15 ก.ย 2562| 14 ก.ย 2562| 13 ก.ย 2562| 12 ก.ย 2562| 11 ก.ย 2562| 10 ก.ย 2562| 9 ก.ย 2562| 8 ก.ย 2562| 7 ก.ย 2562| 6 ก.ย 2562| 5 ก.ย 2562| 4 ก.ย 2562| 3 ก.ย 2562| +|abcde|ddffadf kkljlj| abcdef + +คำค้น หมวดหมู่ ทุกหมวดหมู่ - APPLE - iPhone X - iPhone 8 Plus / 7 Plus - iPhone 8 / 7 - iPhone 6 Plus / 6S Plus - iPhone 6 / 6S - iPhone 5 / 5S / SE- SAMSUNG - Galaxy Note FE / Note 7 - Galaxy J7+ - Galaxy Note 8 - Galaxy J7 PRO (2017) / J730 - Galaxy J5 PRO (2017) / J530 - Galaxy S8 Plus - Galaxy S8 - Galaxy A7 (2017) - Galaxy A5 (2017) - Galaxy A3 (2017) - Galaxy J5 Prime - Galaxy J7 Prime - Galaxy S7 Edge - Galaxy S7 - Galaxy Note 5 - Galaxy S6 Edge - Galaxy S6- HUAWEI - Mate 10 PRO - Mate 10 - Nova 2i - P10 Plus - P10 - Mate 9 PRO - Mate 9 - GR5 2017 / Honor 6X - P9 Plus - P9 - P9 Lite - Mate 8 - Nova Plus - Y6II - Y5II - P8 - P8 Lite - Mate 7 - MediaPad M3 8.4 - MediaPad M2 10.0 - MediaPad M2 8.0- LG - G6- GOOGLE - Pixel 2 XL - Pixel 2- ONEPLUS (1+) - 1+5 - 1+3 / 3T- XIAOMI - Mi Max 2 - Mi 6 - Mi 5S Plu +คำค้น หมวดหมู่ ทุกหมวดหมู่ - APPLE - iPhone X - iPhone 8 Plus / 7 Plus - iPhone 8 / 7 - iPhone 6 Plus / 6S Plus - iPhone 6 / 6S - iPhone 5 / 5S +(1) 400 กรัม/น้ำหนึ่งลิตร (2) 300 กม./ชม. (3) 50บาท/กก. (4) อัตราส่วน 3/8 <- ต้องมี 4 ชุดขึ้นไปใน 1 line ถึงจะนับว่าเป็นเมนู + + +--- เริ่ม + บ้าน > ฟิมล์ > กล้อง > เลนส์ + หลังห้องดอทคอม » เคล็ดลับสู่ความสำเร็จ » 5 วิธีเสพติดความสำเร็จที่ยิ่งใหญ่ +Home \ อุตสาหกรรม \ โรงงานผลิตเคมีภัณฑ์ \ บริษัท ยูไนเต็ด ซิลิกา (สยาม) จำกัด +--- สิ้นสุด + +""", + }, + { + "new_doc": """ข้อความต่อๆไป เพื่อทดสอบการทำงาน ทำงานได้ดี""", + "doc": """วันเกิด: dolceCliny (31), okzizNeeby (42), GlaydsiMop (30), biolaBapsSaups (32), tertuSer (41), KlemenVap (33), Michaelerymn (30), DouglasZek (33), matbewotly (32), entnived (40), maslinAL (29), sivatVAL (29), alminTIM (28), sumPAVV (29), iganYUR (29), dejinHycle (37), ssurvgoabbedia (32), laveyKnino (32), Robertorifs (42), nisDENN (29), Bradleyfluow (41), MorganTox (33), dismIVAN (29), semNIKK (29), gisVALL (29), LarryNat (38), felmetix (39) +วันเกิด: DanielLam (40), sunliPhank (32), rioriJiP (35), Miguelnom (31), nikitendug (34), matmureend (42), FrancuaCiz (42), DavidordEd (33), countoxync (32), RigelTal (40), ThomasVed (38), spinpVaf (39), EtelJoips (33), TerryPrupt (41), Edahagind (33), Aroztum (42), remtekes (40), GeorgeDit (31), WileyDup (33), ForeSuich (32), Berkezes (43), Angersuity (30), Mylorek (36), ShawnToF (39), Larryceafe (37), RezanNus (39), rencoloasy (40), lamodBip (35), talogrob (33), EugeneWen (38), Igorjus (43), Michaelimicy (37) แบบไม่ชิด (25),แบบชิด(37) ข้อความต่อๆไป เพื่อทดสอบการทำงาน ทำงานได้ดี +สินค้าทั้งหมด [194] +ลำโพง/Speaker [173]ลำโพง Audioengine [11]ลำโพง Audioengine A2+ Powered Speaker [4]ลำโพง Audioengine B2 Bluetooth Speaker [3]ลำโพง Audioengine A5+ Powered Speaker [4]ลำโพง B&O Bang & Olufsen [3]ลำโพงพกพา B&O BeoPlay A2 [3]ลำโพง Creative [2]ลำโพง Creative SoundBlaster Roar [1]ลำโพง SOUND BLASTER ROAR PRO [1]ลำโพงพกพา Dreamwave [2]Dreamwave TREMOR [1]ลำโพง Dreamwave Explorer [1]ลำโพงพกพา Divoom [2]ลำโพง Divoom Onbeat 500 Gen2 [2]ลำโพง Dope [2]ลำโพงพกพา Dope Duo link [1]ลำโพง Dope Billionaire [1]ลำโพง EDIFIER [10]ลำโพง Edifier R1700BT [1] abcdefg hijklmnopq$ +""", + }, + { + "new_doc": """สวัสดีครับ วันนี้อากาศร้อน ระวังโรคลมแดด เดี๋ยวไม่สบาย """, + "doc": """สวัสดีครับ [abcdefghi] วันนี้อากาศร้อน [asdfgsgsdg] ระวังโรคลมแดด [abcdefg][...]« ตอบ ข้อความที่อยู่ระหว่าง » เดี๋ยวไม่สบาย << ก็มันร้อนจริงๆ >>""", + }, + { + "new_doc": """เมกเกอร์หญิงรุ่นเล็กขอแสดงฝีมือ 3,947 views More + +หลังจากที่ประกาศแต่งงานว่าจะแต่งกันในช่วงปลายปี ใน ที่จะถึงนี้ ซึ้งทั้งคู่มีเวลาเปลี่ยมตัวและเตรียมการ ไม่มากนัก""", + "doc": r"""เมกเกอร์หญิงรุ่นเล็กขอแสดงฝีมือ 3,947 views More +#จัดปาร์ตี้สละโสด #แต่งงาน #มาร์กี้ #ดาราแต่งงาน #นางเอง #มาร์กี้แต่งงาน #ว่าที่สะไภ้หมื่นล้าน #มิ้นคิมร่วมปาร์ตี้ #ราศี +#มาร์กี้แต่งงาน #ดาราแต่งงาน #มาร์กี้ #แต่งงาน #ฉลองวันครบรอบ +หลังจากที่ประกาศแต่งงานว่าจะแต่งกันในช่วงปลายปี ในเดือนธันวาคมที่จะถึงนี้ ซึ้งทั้งคู่มีเวลาเปลี่ยมตัวและเตรียมการ ไม่มากนัก +#มากี้บินดูชุดแต่งงาน #ข่าวดารา #ราศี #ชุดแต่งงานมาร์กี้ #มาร์กี้แต่งงาน #ชุดแต่งงานดารา +ความลับถูกเปิด!! +#หลวงพ่อหวั่น วัดคลองคูณ #รวยม… +#หลวงพ่อหวั่น วัดคลองคูณ #รวยมหาเศรษฐี พร้อมส่งค่ะชื่อชุดดิน : สมุทรปราการ Samut Prakan (Sm) + +Tag Archives: ทิปวิธีการลดหุ่น +Posts Tagged: "ทิปวิธีการลดหุ่น"ขณะนี้ วันที่ : 14 Google (66.249.71.60) วันนี้ ด้วยดีไซน์ของตัวเครื่องที่เพรียวบาง พกพาสะดวก หน้าจอ Retina ประสิทธิภาพที่ยอดเยี่ยมสำหรับการทำงานประจำวัน แบ + +HASTAG : เทียนกง เจนนิเฟอร์ ลอว์เรนซ์ เตรียมทำสงครามในตัวอย่างแรกของ The Hunger Games: Mockingjay – Part 1 – JEDIYUTH + +Tags: A lot, english, most, People, Some, คน, ตัวอย่าง, ประโยค, ประโยคถูก, ประโยคผิด, ผิด, ผิดบ่อย, ผิดพลาด, ผู้คน, ภาษา, ภาษาอังกฤษ, ศาสนา, สัญชาติ, สับสน, อังกฤษ, เชื้อชาติ, แกรมม่า, แก้ไข, ไวยากรณ์ + +Tag: แยกสุขุมวิท + +ขอบคุณบทความจาก : Tags : ยูพิค,สมัคร Youpik,Youpk คอมมิชชั่น +#3850 yulk (@piliying) (จากตอนที่ 13)พี่มาร์คปากแข็งจีจีแตฉันชอบแกอ่า +#3645 JUNLINEZ (@pipo_gummy) (จากตอนที่ 13)อ่านแล้วคะป้าครึ่งตอนแรกชอบมากเลย ความรักที่ทั้งสองมีให้กันแบบรักกันมากๆ รอนะคะ +Tagged ฝรั่งเศส,เก้าอี้,Elementcommun +""", + }, + { + "new_doc": """เห็นชื่ออีเมลส่งอีเมลแจ้งด้วยเมื่อรายการนี้มีความเห็นเพิ่มเติม ใส่รูปหรือไฟล์คลิกใส่รูปหรือไฟล์ใหม่คลิกเพื่อใส่ไฟล์ที่มีอยู่แล้ว """, + "doc": """{{ kv.owner.preferred_name | truncate:25 }}{{ kv.owner.fullname | truncate:40 }} ผู้ติดตาม: {{ kv.owner.follower_count | number }} ติดตาม: {{ kv.owner.followee_count | number }} ติดต่อ ติดตาม เลิกติดตาม {{ kv.owner.preferred_name | truncate:25 }}{{ kv.owner.fullname | truncate:40 }} +เห็นชื่ออีเมลส่งอีเมลแจ้งด้วยเมื่อรายการนี้มีความเห็นเพิ่มเติม ใส่รูปหรือไฟล์คลิกใส่รูปหรือไฟล์ใหม่คลิกเพื่อใส่ไฟล์ที่มีอยู่แล้ว {{ file.asset_file_name โบนัสฟรี 500 _เล่นพนัน ภาษาอังกฤษ_เว็บบอลแจกเครดิตฟรี +Toronto, ON M3B2X5 +#B107 -1396 DON MILLS RD , Toronto, ON M3B2X5 +To: #B107 -1396 Don Mills Rd, Toronto, ON""", + }, + { + "new_doc": """เจาะลึกโทรศัพท์มือถือสำหรับเล่นเกม (Gaming Mobile) ที่มาพร้อมสเปกแรงจัดเต็ม โดยความเป็นจริงแล้วแตกต่าง ดื่มน้ำมากๆนะ""", + "doc": """ มีข้อความต่อเนื่อง ที่มีประโยชน์ klkjkljklj ดื่มน้ำมากๆนะ +""", + }, + { + "new_doc": """เครื่องบดสมุนไพร เพื่อทำยาป้องกันโรคต่างๆ +ปลูกต้นไม้ จัดสวน หาต้นไม้แปลกๆ มาที่ เพื่อเรื่องราวที่น่าสนใจ +เรียนรู้เรื่องการทำอาหารฝรั่งเศส ติดต่อได้ที่ ok ใช้ได้ดี""", + "doc": """Email : r_faisu@hotmail.comเครื่องบดสมุนไพร เพื่อทำยาป้องกันโรคต่างๆ +ปลูกต้นไม้ จัดสวน หาต้นไม้แปลกๆ มาที่อีเมล์ zonedara@gmail.com เพื่อเรื่องราวที่น่าสนใจ +เรียนรู้เรื่องการทำอาหารฝรั่งเศส ติดต่อได้ที่ mail : nongluck_joy@hotmail.com email i17bkk@gmail.com ok ใช้ได้ดี""", + }, + { + "new_doc": """ตอบข้อ 3 bill พี่ค่ะข้อสอบของป.5จริงๆใช่ไหนค่ะหนูอยู่ป.5หนูยังจะหงายเลยค่ะ ยากว่ะทําไม่ได้ยากๆ Quote Reply Posted +ดีมาก ดี พอใช้ ควรปรับปรุง แย่มากๆ ออนไลน์ทั้งหมด 3 คน หมายเลข """, + "doc": """By dallas zip code (210.1.31.28) on 14:15 +ตอบข้อ 3 bill (IP:125.27.82.213) พี่ค่ะข้อสอบของป.5จริงๆใช่ไหนค่ะหนูอยู่ป.5หนูยังจะหงายเลยค่ะ (IP:111.84.78.112) ยากว่ะทําไม่ได้ยากๆ Quote Reply Posted IP: 203.209.101.161 +ดีมาก ดี พอใช้ ควรปรับปรุง แย่มากๆ ออนไลน์ทั้งหมด 3 คน หมายเลข IP 54.147.241.117 +IP: 183.89.11.XX +IP: XXX.XX.X.XX""", + }, + { + "new_doc": """089623333 <- ไม่ตัดเพราะ 089 ต้องตามด้วยตัวเลข 7 ตัว +0123456789 <- ไม่ใช่เบอร์โทร +หรือติดต่อทางทางเมล์ เพื่อขอดูรายละเอียดต่างๆได้ค่ะ """, + "doc": """ +เบอร์โทรศัพท์ : 063-9547533 +เบอร์โทรศัพท์ : 063-9547533 สำนักงาน เบอร์โทรศัพท์ : 063-9547533 Fax : 063-9998888 +เลขโทรศัพท์ 081-842-5373 +TEL : 0832-741706 +โทร: 045-612-611 +Fax: 045-613-088 +โทรสาร : 0-2370-2700 089623333 <- ไม่ตัดเพราะ 089 ต้องตามด้วยตัวเลข 7 ตัว +เบอร์ติดต่อ 02 185 2865 0123456789 <- ไม่ใช่เบอร์โทร +เบอร์ติดต่อ 02-305-6652 , 084-4523432 +โทร. 077 975 522, 098 016 6775 +โทรศัพท์ : 084 469 8604, 091 756 7763 +โทรศัพท์ : 081 810 5006, 081 822 3026, 087 070 9595 +โทรศัพท์ : 081 810 5006, 081 822 3026, 087 070 9595 , 0832-741706, 0899395848, 084-4523432 + โทรศัพท์ 02-681-8390 +เบอร์โทร : 0833485952 +เบอร์โทร:085-3228934 +0899395848 + mobile: 084-544-1234 hellomobile: + phone : 02-2581122 +มือถือ: 084-554-4444 +ติดต่อ: 02-2605549 หรือติดต่อทางทางเมล์ เพื่อขอดูรายละเอียดต่างๆได้ค่ะ +022587799 +032123456 +077123456 +0603442123 +""", + }, + { + "new_doc": """© 2006–2020, Simple Machines LLC เรือนกระจกอ: +© 2007 - 2019 Tasang Limited, All Rights Reserved 0.0426s นับตั้งแต่ คู่มือสอบเจ้าพนักงาน +ข่าวในจีน ตั้งตี้ ชวนก๊วนขาแดนซ์ มาโดด Touch 2nd Anniversary Jumper Dance Party นี้ 2009 ข่าวเกมส์ไทย , เกมส์บนเว็บ 3 ปี ago gamededteam 0 +ใกล้ถึงเวลาแห่งความสนุกกันแล้วซิ กับปาร์ตี้โดด เด้ง แดนซ์ ใน “Touch 2nd Anniversary Jumper Dance Party” ที่จะเกิดขึ้น ในวันเสาร์ที เป็นต้นไป ณ Bounce Thailand โดยเพื่อนๆขาแดนซ์ จะได้พบกับความสนุกมากมายที่ทีมงานคัดสรรมาเอาใจกันโดยเฉพาะเลย ทั้งภารกิจสุดโหด แรร์ไอเทมพิเศษ และพบปะพูดคุยกันในแมทช์พิเศษกับเหล่า MC อย่างใกล้ชิด สนิทใจ งานนี้รับรองคุ้มถูกใจชาวเกมเมอร์แน่นอน!! +หนุ่มสาวชาวทัชออนไลน์ที่จะเข้าร่วมงาน สามารถคลิกลงทะเบียนได้ที่นี้เลย – โดยหนุ่มสาวชาวทัชออนไลน์ที่ใช้ไอดีเฟสบุ๊คสำหรับเข้าเล่นเกม กรุณาเตรียมจดไอดีของท่านมาให้พร้อมสำหรับขั้นตอนการลงทะเบียนหน้างานใน ด้วยนะคะ +พวกเวลาราชการ เก็บไว้ให้ให้ LLM เรียน เวลาเปิดปิด ครับ +คลินิกในเวลาราชการ วันจันทร์ – วันศุกร์ เวลา 07.00 –16.00 น. +นอกเวลาราชการ วันจันทร์ – วันศุกร์ เวลา 16.00 – 20.00 น. วันเสาร์ เวลา 07.00 – 14.00 น. +ในเวลาราชการ วันจันทร์-วันศุกร์ เวลา 08.00 – 16.00 น. +นอกเวลาราชการ วันจันทร์-วันศุกร์ เวลา 16.00 – 20.00 น. +เสาร์-วันอาทิตย์ เวลา 09.00 – 12.00 น. +· ในเวลาราชการ เวลา 7.00 – 16.00 น. +นอกเวลาราชการ วันเสาร์ เวลา 7.00 – 16.00 น. +วันอาทิตย์และวันหยุดนักขัตฤกษ์ เวลา 7.00 - 12.00 น. +วันจันทร์ – วันศุกร์ เวลา 8.00 –12.00 น. +ศุกร์ (เว้นวันพุธ) 9.00 – 16.00น.""", + "doc": r"""โดย Teetawat » พุธ 19 มิ.ย. 2019 11:51 am +โดย Teetawat » พฤหัสฯ. 20 มิ.ย. 2019 3:49 pm +Saber, 28 กรกฎาคม 2018 +แก้ไขครั้งล่าสุด: 28 กรกฎาคม 2018 +purinankun, 28 กรกฎาคม 2018 +purinankun, 28 กรกฎาคม2018 +เริ่มประมูล พฤ. 11 ม.ค 2561 14:09:06 +ปิดประมูล พฤ. 25 ม.ค 2561 14:09:06ชาวสีม่วง ! +วันที่ 29 ก.ค. 59 เวลา 13:22:18 น. +วันที่ 29 กค. 59 เวลา 13:22:18 น. +วันที่ 29 กค 59 เวลา 13:22:18 น. +วันที่ 29 กค59 เวลา 13:22:18 น. +วันที่ 4-5 สิงหาคม เวลา 10.30-13.30 น. ณเดชน์-ญาญ่า +จ.ขอนแก่น วันที่ 22 ตุลาคม +19 พฤศจิกายน 2018 : 12.29 น. +29-04-2010, 20:41 #3 +2023/04/15 +15/04/2023 + 15/04/2023 +29-04-2012 + เมื่อ ก.ค. 26, 2017 เวลา 8:59pm PDT + เมื่อ ก.ค. 19, 2017 เวลา 8:53am PDT +เขียนวันที่ 27 มกราคม 2020 24 มกราคม 2020 โดย admin +เผยแพร่เมื่อ: 23 ธันวาคม 2558 +tapinki - 26 ก.ค. 12 1,455 +Time Online : 24:16:59 +[url= ปัญหาของเครื่องBB5กับอีมี่123456แต่Providerยังอยู่[ Google เข้าเยี่ยมชมหน้านี้ล่าสุดเมื่อ : 26 มกราคม 2563, 10:04:19 Powered by SMF © 2006–2020, Simple Machines LLC เรือนกระจกอ: +ตอบเมื่อ: 26 ส.ค. 2006, 9:03 pm +การปรับปรุงปัจจุบัน: 02-พฤษภาคม-2554 ถึง 15-สิงหาคม-2554 ดี ถึง +ตั้งแต่ ตุลาคม 2554 จนถึง กุมภาพันธ์ 2556 +วันอังคารที่ ๑๘ มิถุนายน พ.ศ. ๒๕๖๒ ๐๔:๕๔ น. © 2007 - 2019 Tasang Limited, All Rights Reserved 0.0426s วันศุกร์ 22 กุมภาพันธ์ พ.ศ.2562 36551084 ครั้ง นับตั้งแต่ เสาร์ 02 กุมภาพันธ์, 2008คู่มือสอบเจ้าพนักงาน + ราศีกุมภ์ 9 - 15 ธันวาคม 2562 +ดวงรายสัปดาห์ ราศีกุมภ์ 9 - 15 ธันวาคม 2562 + ราศีกุมภ์ 9 – 15 ธันวาคม 2562 + ราศีกุมภ์ 9 - 15 ธันวาคม 2562 +อัพเดท : 07-08-55, 14:48 น. +อัพเดทล่าสุด : 27 Dec 2018 11:32:41 น. +เริ่มประมูล พฤ. 11 ม.ค 2561 14:09:06 +ปิดประมูล พฤ. 25 ม.ค 2561 14:09:06ชาวสีม่วง +เผยแพร่เมื่อ: 09 ธันวาคม 2558 วันที่ 5 ธันวาคม 2558 คณะครูและบุคลากร + คลิปตัวอย่างหนัง Cilp วันที่ 26 Jul 2012 เวลา 17:38 +ความคิดเห็นที่ 8 พุธ ที่ 16 เดือน มกราคม พ.ศ.2562 เวลา 02:29:17 +ลงประกาศเมื่อ 18 ต.ค. 2559 อัพเดทล่าสุด 18 ต.ค. 2559 15:19:02 น. เข้าชม 214 ครั้ง +ลงประกาศเมื่อ 20 พ.ค. 2562 อัพเดทล่าสุด 20 พ.ค. 2562 11:40:48 น. เข้าชม 57 ครั้ง +Marvel เผยแพร่: 04 เม.ย. 2019 จำนวนเข้าชม: 10,280 +ผู้ลงประกาศ : นางาสาว แพรพลอย ตะลีงอกะลี +อัพเดทล่าสุด : 18 ต.ค. 2559 15:19:02 น. เข้าชม 15 ครั้ง +แก้ไขครั้งล่าสุด: 28 กรกฎาคม 2018 +เผยแพร่เมื่อ: 23 ธันวาคม 2558 +เมื่อ 18 ก.ค. 62 14:14:34 +วันที่ 29 ก.ค. 59 เวลา 13:22:18 น. +วันที่: 21 กุมภาพันธ์ 2560 เวลา:17:30:00 น. +19 พฤศจิกายน 2018 : 11.03 น. +29-04-2010, 20:41 #3 +30-04-2010, 10:27 #4 +30-04-2010, 10:42 #5 +เสาร์ที่ 1 มิถุนายน 2562 00:00:53 น. +23 ก.พ. 53 เวลา 10.07 น. 5131 ผู้ชม 0 +23 ธันวาคม 2558 +กรกฎาคม 28, 2014 ที่ 7:37 PM +กรกฎาคม 29, 2014 ที่ 12:39 PM +กรกฎาคม 29, 2014 ที่ 6:37 PM +28 December 2012 - 14:41 น. +28-5-54 +พ.ศ. + พ.ศ. ๒๔๘๐ + พ.ศ. 2480 พศ 2480 +สารวัด ฉบับที่ 151222 ค.ศ. 2019 +เนื้อหาถูกสร้างขึ้นเมื่อ 2019 เวลา 11:01 pm +03 ส.ค. 53 (06:30 น.) ความคิดเห็น 3 +2018-10-2 9:56:28 +เขียนเมื่อ 12 กรกฎาคม 2558 +เปิดบริการ เวลา 17:00-01:00 น. +วันที่ 19 เมษายน 2562 - 19:39 น. +12 พ.ย. 2019 Views: 58,124 +08 พ.ย. 2019 Views: 2,901 +05 พ.ย. 2019 Views: 94,476 +03 ก.ย. 2019 Views: 1,945 +Post By : autoflight P591506169288 +Posted by driftworm , ผู้อ่าน : 1958 , 12:32:29 น. +งปธน.จีน_china.com +2019-06-24 15:02:59 Xinhua News Agency +ข่าวในจีนApril 08 2020 21:30:36ตั้งตี้ ชวนก๊วนขาแดนซ์ มาโดด Touch 2nd Anniversary Jumper Dance Party 12 มีนาคมนี้ 2009 ข่าวเกมส์ไทย , เกมส์บนเว็บ 3 ปี ago gamededteam 0 +ใกล้ถึงเวลาแห่งความสนุกกันแล้วซิ กับปาร์ตี้โดด เด้ง แดนซ์ ใน “Touch 2nd Anniversary Jumper Dance Party” ที่จะเกิดขึ้น ในวันเสาร์ที 12 มีนาคมนี้ เวลา 12.00 น.เป็นต้นไป ณ Bounce Thailand โดยเพื่อนๆขาแดนซ์ จะได้พบกับความสนุกมากมายที่ทีมงานคัดสรรมาเอาใจกันโดยเฉพาะเลย ทั้งภารกิจสุดโหด แรร์ไอเทมพิเศษ และพบปะพูดคุยกันในแมทช์พิเศษกับเหล่า MC อย่างใกล้ชิด สนิทใจ งานนี้รับรองคุ้มถูกใจชาวเกมเมอร์แน่นอน!! +– หนุ่มสาวชาวทัชออนไลน์ที่จะเข้าร่วมงาน สามารถคลิกลงทะเบียนได้ที่นี้เลย – โดยหนุ่มสาวชาวทัชออนไลน์ที่ใช้ไอดีเฟสบุ๊คสำหรับเข้าเล่นเกม กรุณาเตรียมจดไอดีของท่านมาให้พร้อมสำหรับขั้นตอนการลงทะเบียนหน้างานในวันที่ 12 มีนาคม 2559 ด้วยนะคะ + ---- พวกเวลาราชการ เก็บไว้ให้ให้ LLM เรียน เวลาเปิดปิด ครับ +- คลินิกในเวลาราชการ วันจันทร์ – วันศุกร์ เวลา 07.00 –16.00 น. +- คลินิกนอกเวลาราชการ วันจันทร์ – วันศุกร์ เวลา 16.00 – 20.00 น. วันเสาร์ เวลา 07.00 – 14.00 น. +ในเวลาราชการ วันจันทร์-วันศุกร์ เวลา 08.00 – 16.00 น. +นอกเวลาราชการ วันจันทร์-วันศุกร์ เวลา 16.00 – 20.00 น. +นอกเวลาราชการ วันเสาร์-วันอาทิตย์ เวลา 09.00 – 12.00 น. +· ในเวลาราชการ เวลา 7.00 – 16.00 น. +· นอกเวลาราชการ วันเสาร์ เวลา 7.00 – 16.00 น. +· วันอาทิตย์และวันหยุดนักขัตฤกษ์ เวลา 7.00 - 12.00 น. +วันจันทร์ – วันศุกร์ เวลา 8.00 –12.00 น. +วันจันทร์ – วันศุกร์ เวลา 13.00 – 16.00 น. +วันศุกร์ (เว้นวันพุธ) 9.00 – 16.00น. +""", + }, + { + "new_doc": """ขนมปังฝรั่งเศสหั่นชิ้น 100 กรัม +"เพจจีน" แฉ !! ร้านซีฟู้ดภูเก็ตโกง ตร.จับดำเนินคดี """, + "doc": """ +
{button.addEventListener('click',()=>{const randomColor=Math.floor(Math.random()*16777215).toString(16);document.body.style.backgroundColor="#"+randomColor;const messages=["You clicked a button!","Nice job!","Wow, you're on a roll!","Keep it up!"];const randomIndex=Math.floor(Math.random()*messages.length);alert(messages[randomIndex]);});});let secondsLeft=60;const countdown=setInterval(()=>{if(secondsLeft>0){console.log(`${secondsLeft} seconds left`);secondsLeft--;}else{console.log("Time's up!");clearInterval(countdown);}},1000);const name=prompt("What's your name?");const welcomeMessage=document.createElement('h1');welcomeMessage.textContent=`Welcome, ${name}!`;document.body.appendChild(welcomeMessage);""", + }, + { + "remove": True, + "doc": """const number=5;const double=(n)=>{return n*2;};const result=double(number);console.log(result);const greet=(name)=>{return `Hello, ${name}!`;};const message=greet("John");console.log(message);const multiply=(a,b)=>a*b;const product=multiply(3,4);console.log(product);""", + }, + { + "remove": False, + "doc": """มัสก์เกิดและเติบโตในพริทอเรีย ประเทศแอฟริกาใต้ เขาเข้าเรียนที่มหาวิทยาลัยพริทอเรีย ก่อนย้ายไปประเทศแคนาดาเมื่ออายุ 17 ปี โดยได้รับสัญชาติผ่านมารดาที่เกิดในแคนาดา สองปีต่อมา เขาเข้าเรียนที่มหาวิทยาลัยควีน และย้ายไปเรียนที่มหาวิทยาลัยเพนซิลเวเนีย ซึ่งเขาได้รับปริญญาตรีสาขาเศรษฐศาสตร์และฟิสิกส์ เขาย้ายไปอยู่ที่แคลิฟอร์เนียในปี ค.ศ. 1995 เพื่อเข้าเรียนที่มหาวิทยาลัยสแตนฟอร์ด แต่ลาออกหลังจากเข้าเรียนได้สองวันเพื่อประกอบอาชีพทางธุรกิจแทน โดยร่วมก่อตั้งบริษัทซอฟต์แวร์เว็บชื่อ ซิป2 กับ คิมบัล มัสก์ น้องชายของเขา; บริษัทถูกซื้อโดยคอมแพค ในราคา 307 ล้านดอลลาร์สหรัฐในปี ค.ศ. 1999 ในปีเดียวกันนั้น มัสก์ได้ร่วมก่อตั้งธนาคารออนไลน์ชื่อ เอ็กซ์.คอม ซึ่งควบรวมกับบริษัท คอนฟินิตี้ ในปี ค.ศ. 2000 เพื่อก่อตั้งบริษัทเพย์แพล อีเบย์ซื้อกิจการเพย์แพลในปี ค.ศ. 2002 ด้วยมูลค่า 1.5 พันล้านดอลลาร์สหรัฐ""", + }, + { + "remove": False, + "doc": """คาบิกอน หรือ Snorlax เป็นโปเกมอนที่มีลักษณะคล้ายหมีตัวใหญ่ มีผิวสีน้ำเงินเข้มอมเขียว ใบหน้า หน้าท้องและเท้ามีสีครีม ลำตัวประกอบด้วยหน้าท้องเป็นส่วนใหญ่เนื่องจากแขนขาค่อนข้างเล็ก ซึ่งพุงป่อง ๆ ของมันมีไว้เพื่อเก็บพลังงานสำรองนั่นเอง มันมีหัวโต หูตั้ง และดวงตาที่เหมือนกับกำลังนอนหลับตลอดเวลา และมีฟันเขี้ยวแหลม 2 ซี่ที่ยื่นออกมาจากขากรรไกรล่าง โดยทั่วไปแล้วคาบิกอนจะมีความสูงประมาณ 2 เมตร และมีน้ำหนักประมาณ 450 กก. """, + }, +] + +CHECK_RATIO_TEST_CASES = [ + {"remove": True, "doc": "กันยายน เมษายน เม.ย. พ.ค. ม.ค. ร.ด."}, + { + "remove": True, + "doc": """บ ิ ต ค อ ย น ์ ( B i t c o i n ) ห ร ื อ B T C ค ื อ ส ก ุ ล เ ง ิ น ด ิ จ ิ ทั ล ( C r y p t o c u r r e n c y ) ส ก ุ ล แ ร ก ข อ ง โ ล ก ที่ ถู ก สร้ าง ข ึ้ น บ น “ บ ล็ อ ก เ ช น ” ( B l o c k c h a i n ) ซ ึ่ ง เ ป็ น เ ท ค โ น โ ล ยี ที่ ใ ช้""", + }, + { + "remove": True, + "doc": """หมอน, ส้มโอ, รถไฟ, กุ้ง, เนื้อวัว, หอยนางรม, กระดาษ, แม่น้ำ, ปลาซาบะ, เตียง, สุนัข, กล้อง, ปูนา, โทรทัศน์, หอยเชลล์, สายไหม, มะม่วง, ก้อนแกลบ, กะปิ, ปลาหมึก""", + }, + { + "remove": True, + "doc": """bGF2aWVlc3RiZWxsZW1hZy5jb20# oxixagi-a.anchor.com [URL=http://oxixagi-u.com/]oxixagi-u.anchor.com[/URL] http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/ http://oxixagi-t.com/…""", + }, + { + "remove": False, + "doc": """บิตคอยน์ (Bitcoin) หรือ BTC คือสกุลเงินดิจิทัล (Cryptocurrency) สกุลแรกของโลกที่ถูกสร้างขึ้นบน “บล็อกเชน” (Blockchain) ซึ่งเป็นเทคโนโลยีที่ใช้""", + }, + { + "remove": False, + "doc": """วันที่ 1 มกราคม เป็นวันแรกของปี ตามปฏิทินสุริยคติแบบเกรกอเรียน เมื่อถึงวันนี้จะยังเหลือวันอีก 364 วันในปีนั้น (365 วันในปีอธิกสุรทิน)""", + }, +] + +REMOVE_KEYWORDS_TEST_CASES = [ + { + "new_doc": """ น้องม่อน กินข้าววันไหนดี""", + "doc": """Posted by: น้องม่อน กินข้าววันไหนดี""", + }, + { + "new_doc": """บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล""", + "doc": """หน้าหลัก | ติดต่อเรา | สถานที่ตั้ง บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล""", + }, + { + "new_doc": """1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา""", + "doc": """1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา""", + }, +] + +CLEAN_TEXT_TEST_CASES = [ + { + "new_doc": "น้องม่อน กินข้าววันไหนดี", + "doc": "Posted by: น้องม่อน กินข้าววันไหนดี", + }, + { + "new_doc": "1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา", + "doc": "1 มกราคม ถือเป็นวันคล้ายวันพระบรมราชสมภพพระบาทสมเด็จพระมงกุฎเกล้าเจ้าอยู่หัว รัชกาลที่ 6 (2423) ซึ่งพระองค์ทรงพระบรมราชสมภพวันเดียวเดือนเดียวกับพระราชมารดา", + }, + { + "new_doc": "", + "doc": "ถูต่ำลงนิด ต่อชีวิตเรียวกังรับแขกเข้าโรงแรมเลยจับดูดควย ดูดควยต่อชีวิตทำให้โรงแรมอยู่รอดต่อไปได้ฟินเวอร์ หนังโป๊ญี่ปุ่น หนังav ID:STARS-230 แสดงโดย Honjou Suzu", + }, + { + "new_doc": "", + "doc": """const buttons=document.querySelectorAll('button');buttons.forEach(button=>{button.addEventListener('click',()=>{const randomColor=Math.floor(Math.random()*16777215).toString(16);document.body.style.backgroundColor="#"+randomColor;const messages=["You clicked a button!","Nice job!","Wow, you're on a roll!","Keep it up!"];const randomIndex=Math.floor(Math.random()*messages.length);alert(messages[randomIndex]);});});let secondsLeft=60;const countdown=setInterval(()=>{if(secondsLeft>0){console.log(`${secondsLeft} seconds left`);secondsLeft--;}else{console.log("Time's up!");clearInterval(countdown);}},1000);const name=prompt("What's your name?");const welcomeMessage=document.createElement('h1');welcomeMessage.textContent=`Welcome, ${name}!`;document.body.appendChild(welcomeMessage);""", + }, + { + "new_doc": "บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล", + "doc": "หน้าหลัก | ติดต่อเรา | สถานที่ตั้ง บริษัทนี้เป็นบริษัทที่ให้บริการเกี่ยวกับการวิเคราะห์ข้อมูล", + }, + { + "new_doc": "", + "doc": "บ ิ ต ค อ ย น ์ ( B i t c o i n ) ห ร ื อ B T C ค ื อ ส ก ุ ล เ ง ิ น ด ิ จ ิ ทั ล ( C r y p t o c u r r e n c y ) ส ก ุ ล แ ร ก ข อ ง โ ล ก ที่ ถู ก สร้ าง ข ึ้ น บ น “ บ ล็ อ ก เ ช น ” ( B l o c k c h a i n ) ซ ึ่ ง เ ป็ น เ ท ค โ น โ ล ยี ที่ ใ ช้", + }, + { + "new_doc": "มัสก์เกิดและเติบโตในพริทอเรีย ประเทศแอฟริกาใต้ เขาเข้าเรียนที่มหาวิทยาลัยพริทอเรีย ก่อนย้ายไปประเทศแคนาดาเมื่ออายุ 17 ปี โดยได้รับสัญชาติผ่านมารดาที่เกิดในแคนาดา สองปีต่อมา เขาเข้าเรียนที่มหาวิทยาลัยควีน และย้ายไปเรียนที่มหาวิทยาลัยเพนซิลเวเนีย ซึ่งเขาได้รับปริญญาตรีสาขาเศรษฐศาสตร์และฟิสิกส์ เขาย้ายไปอยู่ที่แคลิฟอร์เนียในปี ค.ศ. 1995 เพื่อเข้าเรียนที่มหาวิทยาลัยสแตนฟอร์ด แต่ลาออกหลังจากเข้าเรียนได้สองวันเพื่อประกอบอาชีพทางธุรกิจแทน โดยร่วมก่อตั้งบริษัทซอฟต์แวร์เว็บชื่อ ซิป2 กับ คิมบัล มัสก์ น้องชายของเขา; บริษัทถูกซื้อโดยคอมแพค ในราคา 307 ล้านดอลลาร์สหรัฐในปี ค.ศ. 1999 ในปีเดียวกันนั้น มัสก์ได้ร่วมก่อตั้งธนาคารออนไลน์ชื่อ เอ็กซ์.คอม ซึ่งควบรวมกับบริษัท คอนฟินิตี้ ในปี ค.ศ. 2000 เพื่อก่อตั้งบริษัทเพย์แพล อีเบย์ซื้อกิจการเพย์แพลในปี ค.ศ. 2002 ด้วยมูลค่า 1.5 พันล้านดอลลาร์สหรัฐ", + "doc": """มัสก์เกิดและเติบโตในพริทอเรีย ประเทศแอฟริกาใต้ เขาเข้าเรียนที่มหาวิทยาลัยพริทอเรีย ก่อนย้ายไปประเทศแคนาดาเมื่ออายุ 17 ปี โดยได้รับสัญชาติผ่านมารดาที่เกิดในแคนาดา สองปีต่อมา เขาเข้าเรียนที่มหาวิทยาลัยควีน และย้ายไปเรียนที่มหาวิทยาลัยเพนซิลเวเนีย ซึ่งเขาได้รับปริญญาตรีสาขาเศรษฐศาสตร์และฟิสิกส์ เขาย้ายไปอยู่ที่แคลิฟอร์เนียในปี ค.ศ. 1995 เพื่อเข้าเรียนที่มหาวิทยาลัยสแตนฟอร์ด แต่ลาออกหลังจากเข้าเรียนได้สองวันเพื่อประกอบอาชีพทางธุรกิจแทน โดยร่วมก่อตั้งบริษัทซอฟต์แวร์เว็บชื่อ ซิป2 กับ คิมบัล มัสก์ น้องชายของเขา; บริษัทถูกซื้อโดยคอมแพค ในราคา 307 ล้านดอลลาร์สหรัฐในปี ค.ศ. 1999 ในปีเดียวกันนั้น มัสก์ได้ร่วมก่อตั้งธนาคารออนไลน์ชื่อ เอ็กซ์.คอม ซึ่งควบรวมกับบริษัท คอนฟินิตี้ ในปี ค.ศ. 2000 เพื่อก่อตั้งบริษัทเพย์แพล อีเบย์ซื้อกิจการเพย์แพลในปี ค.ศ. 2002 ด้วยมูลค่า 1.5 พันล้านดอลลาร์สหรัฐ""", + }, + { + "new_doc": "คาบิกอน หรือ Snorlax เป็นโปเกมอนที่มีลักษณะคล้ายหมีตัวใหญ่ มีผิวสีน้ำเงินเข้มอมเขียว ใบหน้า หน้าท้องและเท้ามีสีครีม ลำตัวประกอบด้วยหน้าท้องเป็นส่วนใหญ่เนื่องจากแขนขาค่อนข้างเล็ก ซึ่งพุงป่อง ๆ ของมันมีไว้เพื่อเก็บพลังงานสำรองนั่นเอง มันมีหัวโต หูตั้ง และดวงตาที่เหมือนกับกำลังนอนหลับตลอดเวลา และมีฟันเขี้ยวแหลม 2 ซี่ที่ยื่นออกมาจากขากรรไกรล่าง โดยทั่วไปแล้วคาบิกอนจะมีความสูงประมาณ 2 เมตร และมีน้ำหนักประมาณ 450 กก.", + "doc": """คาบิกอน หรือ Snorlax เป็นโปเกมอนที่มีลักษณะคล้ายหมีตัวใหญ่ มีผิวสีน้ำเงินเข้มอมเขียว ใบหน้า หน้าท้องและเท้ามีสีครีม ลำตัวประกอบด้วยหน้าท้องเป็นส่วนใหญ่เนื่องจากแขนขาค่อนข้างเล็ก ซึ่งพุงป่อง ๆ ของมันมีไว้เพื่อเก็บพลังงานสำรองนั่นเอง มันมีหัวโต หูตั้ง และดวงตาที่เหมือนกับกำลังนอนหลับตลอดเวลา และมีฟันเขี้ยวแหลม 2 ซี่ที่ยื่นออกมาจากขากรรไกรล่าง โดยทั่วไปแล้วคาบิกอนจะมีความสูงประมาณ 2 เมตร และมีน้ำหนักประมาณ 450 กก. """, + }, +] + +CLEAN_DATASET_TEST_CASES = [] +np.random.seed(0) + +docs = [] +new_docs = [] +for testcase in CLEAN_TEXT_TEST_CASES: + docs.append({"text": testcase["doc"]}) + new_docs.append({"text": testcase["new_doc"]}) + +for i in range(10): + n = np.random.randint(1, 5, 1) + arr = np.random.choice(len(docs), n, replace=False) + + selected_docs = [] + selected_new_docs = [] + + for d in arr: + selected_docs.append(docs[d]) + if new_docs[d] != "": + selected_new_docs.append(new_docs[d]) + + CLEAN_DATASET_TEST_CASES.append( + {"dataset": selected_docs, "new_dataset": selected_new_docs} + ) diff --git a/tests/data/utils_test.py b/tests/data/utils_test.py new file mode 100644 index 0000000..72d7392 --- /dev/null +++ b/tests/data/utils_test.py @@ -0,0 +1,28 @@ +import os +from openthaigpt_pretraining_data.utils import read_jsonl + +FILE_DIR = os.path.dirname(__file__) + +READ_JSONL_TEST_CASES = [ + { + "filename": f"{FILE_DIR}/jsonl_data_example/example.jsonl", + "expected_output": [ + {"text": "ufabet 88 แทงบอลได้ใน 1 อาทิตย์"}, + { + "text": "เสือโคร่ง หรือ เสือลายพาดกลอน เป็นสัตว์เลี้ยงลูกด้วยน้ำนมอันดับสัตว์กินเนื้อ มีชื่อวิทยาศาสตร์ว่า Panthera tigris" # noqa + }, + ], + } +] + + +def test_read_jsonl(): + for test_case in READ_JSONL_TEST_CASES: + assert read_jsonl(test_case["filename"]) == test_case["expected_output"] + + +def compare_dataset(clean_dataset, test_dataset): + test_dataset = [item for item in test_dataset if item["text"] != ""] + + for i in range(len(clean_dataset)): + assert clean_dataset[i]["text"] == test_dataset[i]["text"] diff --git a/tests/evaluation/square_test.py b/tests/evaluation/square_test.py new file mode 100644 index 0000000..aa27495 --- /dev/null +++ b/tests/evaluation/square_test.py @@ -0,0 +1,14 @@ +from openthaigpt_pretraining_evaluation.example import ( + SQUARE_TEST_CASES, + CUBE_TEST_CASES, +) + + +def test_square(): + for test_case in SQUARE_TEST_CASES: + assert test_case["x"] ** 2 == test_case["y"] + + +def test_cube(): + for test_case in CUBE_TEST_CASES: + assert test_case["x"] ** 3 == test_case["y"] diff --git a/tests/model/GPTJ_th_tokenizer_test.py b/tests/model/GPTJ_th_tokenizer_test.py new file mode 100644 index 0000000..eaa85b8 --- /dev/null +++ b/tests/model/GPTJ_th_tokenizer_test.py @@ -0,0 +1,48 @@ +""" +from openthaigpt_pretraining_model.GPTJ_TH_tokenizer.tokenizer import ( + GPTJToken, + GPT2Token, + MergedToken, +) +from openthaigpt_pretraining_model.GPTJ_TH_tokenizer.constants import FILE_DIR +from huggingface_hub import hf_hub_download + +GPT2_REPO = "flax-community/gpt2-base-thai" +GPTJ_REPO = "EleutherAI/gpt-j-6B" +GPT2_LOCAL_DIR = f"{FILE_DIR}/GPT2_merge_rule/" +GPTJ_LOCAL_DIR = f"{FILE_DIR}/GPTJ_merge_rule/" +GPT2_MERGE_DIR = f"{FILE_DIR}/GPT2_merge_rule/merges.txt" +GPTJ_MERGE_DIR = f"{FILE_DIR}/GPTJ_merge_rule/merges.txt" + +TEXT_TEST_CASES = [ + "การวิจัยเกี่ยวกับรูปแบบภาษาที่ใหญ่", + "น้องโลมานั้นจัดว่าเป็นสัตว์หายากใกล้สูญพันธุ์", + "พฤษภาคมนี้ได้เวลาเที่ยวฉ่ำรับฤดูฝน", + "อยากกินโมโม่พาราไดซ์", + "รายละเอียดและหลักเกณฑ์การคัดเลือก", +] + +TEXT_TEST_TOKEN = [ + "ResNets solve the famous known vanishing gradient.", + "Each of the layers follow the same pattern.", + "ResNet on the paper is mainly explained for ImageNet dataset.", +] + + +def test_merge_tokenizer(): + # load vcab and merge rule + hf_hub_download(repo_id=GPT2_REPO, filename="merges.txt", local_dir=GPT2_LOCAL_DIR) + hf_hub_download(repo_id=GPTJ_REPO, filename="merges.txt", local_dir=GPTJ_LOCAL_DIR) + + gptj_token = GPTJToken(GPTJ_REPO) + gpt2_token = GPT2Token(GPT2_REPO) + m_token = MergedToken(GPTJ_REPO, GPT2_REPO, GPTJ_MERGE_DIR, GPT2_MERGE_DIR) + + for idx, test in enumerate(TEXT_TEST_CASES): + assert [m_token.decode([token]) for token in m_token.encode(test)] == [ + gpt2_token.decode([token]) for token in gpt2_token.encode(test) + ] + + for idx, token in enumerate(TEXT_TEST_TOKEN): + assert m_token.encode(token) == gptj_token.encode(token) +""" diff --git a/tests/model/gptj_test.py b/tests/model/gptj_test.py new file mode 100644 index 0000000..9df1333 --- /dev/null +++ b/tests/model/gptj_test.py @@ -0,0 +1,36 @@ +""" +from openthaigpt_pretraining_model.models.gptj.gptj_model_xformers import ( + XFORMER_ATTENTION_MODE, + GPTJForCausalLMWithCheckpointing, +) +import torch +from transformers import AutoTokenizer, GPTJConfig + +device = "cuda" if torch.cuda.is_available() else "cpu" + + +def get_output(pretrained_name, use_xformers, input_text): + config = GPTJConfig.from_pretrained(pretrained_name) + config.attention_mode = XFORMER_ATTENTION_MODE if use_xformers else "original" + model = GPTJForCausalLMWithCheckpointing(config).to(device) + + tokenizer = AutoTokenizer.from_pretrained(pretrained_name) + inputs = tokenizer(input_text, return_tensors="pt").to(device) + outputs = model(inputs.input_ids) + last_hidden_states = outputs.last_hidden_state + return last_hidden_states + + +def test_gptj_xformers_attention(): + pretrained_name = "hf-internal-testing/tiny-random-gptj" + input_text = "Yo" + output_xformers = get_output( + pretrained_name=pretrained_name, use_xformers=True, input_text=input_text + ) + output_originals = get_output( + pretrained_name=pretrained_name, use_xformers=False, input_text=input_text + ) + + with torch.no_grad(): + assert torch.all(torch.abs(output_xformers - output_originals) <= 1e-6) +""" diff --git a/tests/model/llama_test.py b/tests/model/llama_test.py new file mode 100644 index 0000000..aab88e8 --- /dev/null +++ b/tests/model/llama_test.py @@ -0,0 +1,70 @@ +from openthaigpt_pretraining_model.models.llama.model import ( + LLaMAArgs, + LLaMA, + ORIGIN_ATTENTION_MODE, + PYTORCH_ATTENTION_MODE, + XFORMERS_ATTENTION_MODE, +) +import torch +import pytest + + +device = "cuda" if torch.cuda.is_available() else "cpu" + +VOCAB_SIZE = 12 +LLAMA_TEST_CASES = [ + torch.randint(0, VOCAB_SIZE, (1, 1)).to(device), + torch.randint(0, VOCAB_SIZE, (12, 1)).to(device), + torch.randint(0, VOCAB_SIZE, (1, 12)).to(device), + torch.randint(0, VOCAB_SIZE, (12, 12)).to(device), + torch.randint(0, VOCAB_SIZE, (6, 4)).to(device), +] +KEYERROR_TEST_CASE = ["", "torch", "formger", "false", "true"] + + +def test_llama_efficient_for_torch(): + base_args = LLaMAArgs(vocab_size=VOCAB_SIZE, attention_mode=ORIGIN_ATTENTION_MODE) + torch_args = LLaMAArgs(vocab_size=VOCAB_SIZE, attention_mode=PYTORCH_ATTENTION_MODE) + + base_model = LLaMA(base_args).to(device) + torch_model = LLaMA(torch_args).to(device) + + torch_model.load_state_dict(base_model.state_dict()) + + with torch.no_grad(): + for test_case in LLAMA_TEST_CASES: + assert torch.all( + torch.abs( + base_model(test_case.to(device), 0).logits + - torch_model(test_case.to(device), 0).logits + ) + <= 1e-6 + ) + + +def test_llama_efficient_for_xformer(): + base_args = LLaMAArgs(vocab_size=VOCAB_SIZE, attention_mode=ORIGIN_ATTENTION_MODE) + xformer_args = LLaMAArgs( + vocab_size=VOCAB_SIZE, attention_mode=XFORMERS_ATTENTION_MODE + ) + + base_model = LLaMA(base_args).to(device) + xformer_model = LLaMA(xformer_args).to(device) + + xformer_model.load_state_dict(base_model.state_dict()) + with torch.no_grad(): + for test_case in LLAMA_TEST_CASES: + assert torch.all( + torch.abs( + base_model(test_case.to(device), 0).logits + - xformer_model(test_case.to(device), 0).logits + ) + <= 1e-6 + ) + + +def test_key_error(): + for key in KEYERROR_TEST_CASE: + with pytest.raises(KeyError): + args = LLaMAArgs(vocab_size=VOCAB_SIZE, attention_mode=key) + LLaMA(args) diff --git a/tests/model/spm_trainer_test.py b/tests/model/spm_trainer_test.py new file mode 100644 index 0000000..71b14e1 --- /dev/null +++ b/tests/model/spm_trainer_test.py @@ -0,0 +1,16 @@ +""" +from openthaigpt_pretraining_model.tokenizers.spm_trainer import train_tokenizer + +OUTPUT_PATH = "./tokenizer" +VOCAB_SIZE_TEST_CASES = [5000, 7500] +NUM_DOCS_TEST_CASES = [500, 750] + + +def test_train_tokenizer(): + for i, num_docs in enumerate(NUM_DOCS_TEST_CASES): + train_tokenizer( + output_path=OUTPUT_PATH, + vocab_size=VOCAB_SIZE_TEST_CASES[i], + num_docs=num_docs, + ) +"""