mirror of
https://github.com/bab2min/Kiwi.git
synced 2026-06-17 01:54:27 +00:00
Compare commits
3 commits
main
...
dev_win_ar
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8bfdda93ae | ||
|
|
86a684de7d | ||
|
|
33953f867e |
232 changed files with 327389 additions and 435815 deletions
16
.github/ISSUE_TEMPLATE/형태소-분석-오류-제보.md
vendored
16
.github/ISSUE_TEMPLATE/형태소-분석-오류-제보.md
vendored
|
|
@ -1,16 +0,0 @@
|
|||
---
|
||||
name: 형태소 분석 오류 제보
|
||||
about: Kiwi 형태소 분석기의 분석 결과에 오류가 있는 경우 이 템플릿을 사용합니다.
|
||||
title: "[분석오류]"
|
||||
labels: 형태소 분석 오류
|
||||
assignees: bab2min
|
||||
|
||||
---
|
||||
|
||||
**오류가 발견된 Kiwi 버전**: `(0.22.2)`
|
||||
**입력 문장**: `(집에 가고 시퍼)`
|
||||
**추가적인 분석 옵션**: `(continual_typos 오타 교정 사용, 방언 분석은 사용하지 않음)`
|
||||
**Kiwi의 분석 결과**: `(집/NNG 에/JKB 가/VV 고/EC 시퍼/NNG)`
|
||||
**실제 나오기를 기대한 결과**: `(집/NNG 에/JKB 가/VV 고/EC 싶/VX 어/EF)`
|
||||
|
||||
(괄호 안의 값은 예시입니다. 이 값을 지우고 제보하시고자 하는 내용을 채워 넣어주세요.)
|
||||
47
.github/workflows/arm64_centos7.yml
vendored
47
.github/workflows/arm64_centos7.yml
vendored
|
|
@ -7,16 +7,14 @@ on:
|
|||
jobs:
|
||||
build-centos:
|
||||
name: Arm64-Centos7
|
||||
runs-on: ubuntu-24.04-arm
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
- name: Print CPU Info
|
||||
run: cat /proc/cpuinfo
|
||||
- uses: bab2min/run-on-arch-action@multiple-step-v2
|
||||
- uses: bab2min/run-on-arch-action@use-custom-image
|
||||
id: runcmd
|
||||
with:
|
||||
image: quay.io/pypa/manylinux2014_aarch64
|
||||
|
|
@ -25,31 +23,24 @@ jobs:
|
|||
mkdir -p "${PWD}/artifacts"
|
||||
dockerRunArgs: |
|
||||
--volume "${PWD}/artifacts:/artifacts"
|
||||
multipleRun: |
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
/opt/python/cp310-cp310/bin/pip install "cmake<4"
|
||||
yum install java-1.8.0-openjdk-devel -y
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir build && pushd build && /opt/python/cp310-cp310/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_USE_MIMALLOC=0 -DKIWI_JAVA_BINDING=1 ..
|
||||
make -j2 && popd
|
||||
- name: Test
|
||||
run: |
|
||||
./build/test/kiwi-test
|
||||
mkdir eval_results && ./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t knlm -o eval_results/ && ./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t sbg -o eval_results/
|
||||
cp -r build /artifacts/
|
||||
cp -r eval_results /artifacts/
|
||||
- name: Benchmark
|
||||
run: |
|
||||
curl -OL https://latina.bab2min.pe.kr/_data/kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=none ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=balanced ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=neon ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
run: |
|
||||
yum install java-1.8.0-openjdk-devel -y
|
||||
mkdir build && pushd build && cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_USE_MIMALLOC=0 -DKIWI_JAVA_BINDING=1 ..
|
||||
make -j2 && popd
|
||||
./build/test/kiwi-test
|
||||
mkdir eval_results && ./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt -o eval_results/ && ./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt --sbg -o eval_results/
|
||||
mkdir eval_results_balanced && KIWI_ARCH_TYPE=balanced ./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt -o eval_results_balanced/
|
||||
cp -r build /artifacts/
|
||||
cp -r eval_results /artifacts/
|
||||
|
||||
curl -OL https://latina.bab2min.pe.kr/_data/kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=none ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=balanced ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=neon ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifacts Arm64-Centos7
|
||||
name: Artifacts ${{ matrix.name }}
|
||||
path: |
|
||||
artifacts/build/*kiwi*
|
||||
artifacts/build/test/*kiwi*
|
||||
|
|
|
|||
51
.github/workflows/centos5.yml
vendored
Normal file
51
.github/workflows/centos5.yml
vendored
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
name: Centos5
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build-centos:
|
||||
name: Centos5
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: docker://hoshizora/manylinux1-clang_x86_64
|
||||
|
||||
steps:
|
||||
- name: Install Git LFS
|
||||
run: |
|
||||
mkdir ../gitlfs && pushd ../gitlfs
|
||||
curl -L https://github.com/git-lfs/git-lfs/releases/download/v2.13.2/git-lfs-linux-amd64-v2.13.2.tar.gz | tar -zxv
|
||||
./install.sh
|
||||
popd
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Pull LFS files
|
||||
run: git lfs pull
|
||||
- name: Update CMake
|
||||
run: /opt/python/cp36-cp36m/bin/pip install "cmake<3.20"
|
||||
- name: Checkout Old Version googletest
|
||||
run: cd third_party/googletest && git checkout v1.8.x && cd ../..
|
||||
- name: Configure Build
|
||||
run: mkdir build && cd build && /opt/python/cp36-cp36m/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_USE_MIMALLOC=0 -DKIWI_USE_CPUINFO=0 ..
|
||||
- name: Build
|
||||
run: cd build && make -j2
|
||||
- name: Run Unit Test
|
||||
run: ./build/test/kiwi-test
|
||||
- name: Run Unit Test in Debug mode
|
||||
if: failure()
|
||||
run: |
|
||||
mkdir build_debug && cd build_debug && /opt/python/cp36-cp36m/bin/cmake -DCMAKE_BUILD_TYPE=Debug -DKIWI_USE_MIMALLOC=0 -DKIWI_USE_CPUINFO=0 .. && make -j2
|
||||
cd .. && gdb -ex run -ex bt ./build_debug/test/kiwi-test
|
||||
- name: Run Evaluator
|
||||
run: |
|
||||
mkdir eval_results
|
||||
./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt -o eval_results/
|
||||
./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt --sbg -o eval_results/
|
||||
- run: tar -zcvf arts.tgz build/*kiwi* build/test/*kiwi* eval_results/*.txt
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: Artifacts Centos5
|
||||
path: arts.tgz
|
||||
53
.github/workflows/centos6.yml
vendored
Normal file
53
.github/workflows/centos6.yml
vendored
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
name: Centos6
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build-centos6:
|
||||
name: Centos6
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: docker://quay.io/pypa/manylinux2010_x86_64
|
||||
|
||||
steps:
|
||||
- name: Install Git LFS
|
||||
run: |
|
||||
mkdir ../gitlfs && pushd ../gitlfs
|
||||
curl -L https://github.com/git-lfs/git-lfs/releases/download/v2.10.0/git-lfs-linux-amd64-v2.10.0.tar.gz | tar -zxv
|
||||
./install.sh
|
||||
popd
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Pull LFS files
|
||||
run: git config --global --add safe.directory /__w/Kiwi/Kiwi && git lfs pull
|
||||
- name: Update CMake
|
||||
run: |
|
||||
/opt/python/cp36-cp36m/bin/pip install cmake
|
||||
yum install java-1.8.0-openjdk-devel.x86_64 -y
|
||||
- name: Configure Build
|
||||
run: mkdir build && cd build && /opt/python/cp36-cp36m/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_JAVA_BINDING=1 ..
|
||||
- name: Build
|
||||
run: cd build && make -j2
|
||||
- name: Run Unit Test
|
||||
run: ./build/test/kiwi-test
|
||||
- name: Run Java Unit Test
|
||||
run: |
|
||||
cd bindings/java
|
||||
curl -OL https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
|
||||
curl -OL https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
|
||||
javac -cp "*:../../build/bindings/java/*:." -encoding utf-8 kr/pe/bab2min/KiwiTest.java
|
||||
java -cp "*:../../build/bindings/java/*:." org.junit.runner.JUnitCore kr.pe.bab2min.KiwiTest
|
||||
- name: Run Evaluator
|
||||
run: |
|
||||
mkdir eval_results
|
||||
./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt -o eval_results/
|
||||
./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt --sbg -o eval_results/
|
||||
- run: tar -zcvf arts.tgz build/*kiwi* build/test/*kiwi* eval_results/*.txt build/bindings/java/*.jar
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: Artifacts Centos6
|
||||
path: arts.tgz
|
||||
52
.github/workflows/centos7.yml
vendored
52
.github/workflows/centos7.yml
vendored
|
|
@ -1,52 +0,0 @@
|
|||
name: Centos7
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
build-centos7:
|
||||
name: Centos7
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
- name: Print CPU Info
|
||||
run: cat /proc/cpuinfo
|
||||
- uses: bab2min/run-on-arch-action@multiple-step
|
||||
id: runcmd
|
||||
with:
|
||||
image: quay.io/pypa/manylinux2014_x86_64
|
||||
githubToken: ${{ github.token }}
|
||||
multipleRun: |
|
||||
- name: Update CMake
|
||||
run: |
|
||||
/opt/python/cp310-cp310/bin/pip install "cmake<4"
|
||||
yum install java-1.8.0-openjdk-devel.x86_64 -y
|
||||
- name: Configure Build
|
||||
run: mkdir build && cd build && /opt/python/cp310-cp310/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_JAVA_BINDING=1 ..
|
||||
- name: Build
|
||||
run: cd build && make -j2
|
||||
- name: Run Unit Test
|
||||
run: ./build/test/kiwi-test
|
||||
- name: Run Java Unit Test
|
||||
run: |
|
||||
cd bindings/java
|
||||
curl -OL https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
|
||||
curl -OL https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
|
||||
javac -cp "*:../../build/bindings/java/*:." -encoding utf-8 test/KiwiTest.java
|
||||
java -cp "*:../../build/bindings/java/*:." org.junit.runner.JUnitCore test.KiwiTest
|
||||
- name: Run Evaluator
|
||||
run: |
|
||||
mkdir eval_results
|
||||
./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t cong -o eval_results/
|
||||
./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t cong-global -o eval_results/
|
||||
- run: tar -zcvf arts.tgz build/*kiwi* build/test/*kiwi* eval_results/*.txt build/bindings/java/*.jar
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Artifacts Centos7
|
||||
path: arts.tgz
|
||||
60
.github/workflows/macos.yml
vendored
60
.github/workflows/macos.yml
vendored
|
|
@ -9,22 +9,28 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- name: "macOS 15 Arm64 + Xcode 16.0"
|
||||
os: macos-15
|
||||
arch: arm64
|
||||
- name: "macOS 11 + Xcode 11.7"
|
||||
os: macos-11
|
||||
compiler: xcode
|
||||
version: "16.0"
|
||||
- name: "macOS 15 + Xcode 16.0"
|
||||
os: macos-15-intel
|
||||
arch: x86_64
|
||||
version: "11.7"
|
||||
- name: "macOS 11 + Xcode 12.2"
|
||||
os: macos-11
|
||||
compiler: xcode
|
||||
version: "16.0"
|
||||
version: "12.4"
|
||||
- name: "macOS 11 + gcc-10"
|
||||
os: macos-11
|
||||
compiler: gcc
|
||||
version: "10"
|
||||
- name: "macOS 11 + gcc-11"
|
||||
os: macos-11
|
||||
compiler: gcc
|
||||
version: "11"
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
name: ${{ matrix.name }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
|
|
@ -34,12 +40,13 @@ jobs:
|
|||
echo "CC=gcc-${{ matrix.version }}" >> $GITHUB_ENV
|
||||
echo "CXX=g++-${{ matrix.version }}" >> $GITHUB_ENV
|
||||
else
|
||||
ls -ls /Applications/
|
||||
sudo xcode-select -switch /Applications/Xcode_${{ matrix.version }}.app
|
||||
echo "CC=clang" >> $GITHUB_ENV
|
||||
echo "CXX=clang++" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: Configure Build
|
||||
run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DKIWI_JAVA_BINDING=1 ..
|
||||
run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_JAVA_BINDING=1 ..
|
||||
- name: Build
|
||||
run: cd build && make -j2
|
||||
- name: Run Unit Test
|
||||
|
|
@ -54,33 +61,26 @@ jobs:
|
|||
cd bindings/java
|
||||
curl -OL https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
|
||||
curl -OL https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
|
||||
javac -cp "*:../../build/bindings/java/*:." -encoding utf-8 test/KiwiTest.java
|
||||
java -cp "*:../../build/bindings/java/*:." org.junit.runner.JUnitCore test.KiwiTest
|
||||
javac -cp "*:../../build/bindings/java/*:." -encoding utf-8 kr/pe/bab2min/KiwiTest.java
|
||||
java -cp "*:../../build/bindings/java/*:." org.junit.runner.JUnitCore kr.pe.bab2min.KiwiTest
|
||||
- name: Run Evaluator
|
||||
run: |
|
||||
mkdir eval_results
|
||||
./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t cong -o eval_results/
|
||||
./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t cong-global -o eval_results/
|
||||
./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt -o eval_results/
|
||||
./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt --sbg -o eval_results/
|
||||
- name: Run Benchmark
|
||||
run: |
|
||||
curl -OL https://latina.bab2min.pe.kr/_data/kowiki1000.txt
|
||||
./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=none ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=balanced ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
if [ "${{ matrix.arch }}" = "x86_64" ]; then
|
||||
KIWI_ARCH_TYPE=sse2 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse4_1 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx2 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse2 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --model-type largest kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse4_1 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --model-type largest kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx2 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --model-type largest kowiki1000.txt
|
||||
else
|
||||
KIWI_ARCH_TYPE=neon ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=neon ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --model-type largest kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=neon ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --typo 6 kowiki1000.txt
|
||||
fi
|
||||
./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=none ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=balanced ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse2 ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse4_1 ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx2 ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx2 ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out --sbg kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx2 ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out --typos 6 kowiki1000.txt
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifacts ${{ matrix.name }}
|
||||
path: |
|
||||
|
|
|
|||
15
.github/workflows/ppc64le_centos7.yml
vendored
15
.github/workflows/ppc64le_centos7.yml
vendored
|
|
@ -10,11 +10,11 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
- uses: bab2min/run-on-arch-action@multiple-step-v2
|
||||
- uses: bab2min/run-on-arch-action@use-custom-image
|
||||
id: runcmd
|
||||
with:
|
||||
image: quay.io/pypa/manylinux2014_ppc64le
|
||||
|
|
@ -24,20 +24,19 @@ jobs:
|
|||
dockerRunArgs: |
|
||||
--volume "${PWD}/artifacts:/artifacts"
|
||||
run: |
|
||||
/opt/python/cp310-cp310/bin/pip install "cmake<4"
|
||||
yum install java-1.8.0-openjdk-devel -y
|
||||
mkdir build && pushd build && /opt/python/cp310-cp310/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_USE_MIMALLOC=0 -DKIWI_JAVA_BINDING=1 ..
|
||||
mkdir build && pushd build && cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_USE_MIMALLOC=0 -DKIWI_JAVA_BINDING=1 ..
|
||||
make -j2 && popd
|
||||
./build/test/kiwi-test
|
||||
mkdir eval_results && ./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t knlm -o eval_results/ && ./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t sbg -o eval_results/
|
||||
mkdir eval_results && ./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt -o eval_results/ && ./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt --sbg -o eval_results/
|
||||
cp -r build /artifacts/
|
||||
cp -r eval_results /artifacts/
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifacts PPC64LE-Centos7
|
||||
name: Artifacts ${{ matrix.name }}
|
||||
path: |
|
||||
artifacts/build/*kiwi*
|
||||
artifacts/build/test/*kiwi*
|
||||
artifacts/eval_results/*.txt
|
||||
artifacts/build/binding/java/*.jar
|
||||
artifacts/build/binding/java/*.jar
|
||||
303
.github/workflows/release.yml
vendored
303
.github/workflows/release.yml
vendored
|
|
@ -5,83 +5,163 @@ on:
|
|||
types: [created]
|
||||
|
||||
jobs:
|
||||
build-centos7:
|
||||
name: Centos7
|
||||
build-centos:
|
||||
name: Centos5
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: docker://hoshizora/manylinux1-clang_x86_64
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Checkout Old Version googletest
|
||||
run: cd third_party/googletest && git checkout v1.8.x && cd ../..
|
||||
- name: Update CMake
|
||||
run: /opt/python/cp36-cp36m/bin/pip install "cmake<3.20"
|
||||
- name: Configure Build
|
||||
run: mkdir build && cd build && /opt/python/cp36-cp36m/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_USE_MIMALLOC=0 -DKIWI_USE_CPUINFO=0 ..
|
||||
- name: Build
|
||||
run: cd build && make -j2
|
||||
- run: |
|
||||
mkdir result
|
||||
cd result
|
||||
mkdir include && mkdir lib && mkdir bin
|
||||
mv ../build/libkiwi* lib/
|
||||
mv ../build/kiwi-* bin/
|
||||
mv ../build/test/kiwi-* bin/
|
||||
cp -r ../include/kiwi include/
|
||||
tar -zcvf ../asset.tgz include/ lib/ bin/
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: asset_Centos5
|
||||
path: asset.tgz
|
||||
|
||||
upload-asset-from-centos:
|
||||
name: Upload asset from Centos5
|
||||
needs: build-centos
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/download-artifact@v2
|
||||
with:
|
||||
submodules: true
|
||||
name: asset_Centos5
|
||||
path: arts
|
||||
- name: Get release
|
||||
id: get_release
|
||||
uses: bruceadams/get-release@v1.3.2
|
||||
uses: bruceadams/get-release@v1.2.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
- uses: bab2min/run-on-arch-action@multiple-step-v2
|
||||
with:
|
||||
image: quay.io/pypa/manylinux2014_x86_64
|
||||
githubToken: ${{ github.token }}
|
||||
multipleRun: |
|
||||
- name: Update CMake
|
||||
run: |
|
||||
/opt/python/cp310-cp310/bin/pip install "cmake<4"
|
||||
yum install java-1.8.0-openjdk-devel.x86_64 -y
|
||||
- name: Configure Build
|
||||
run: mkdir build && cd build && /opt/python/cp310-cp310/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_JAVA_BINDING=1 ..
|
||||
- name: Build
|
||||
run: cd build && make -j2
|
||||
- run: |
|
||||
mkdir result
|
||||
cd result
|
||||
mkdir include && mkdir lib && mkdir bin
|
||||
mv ../build/libkiwi* lib/
|
||||
mv ../build/kiwi-* bin/
|
||||
mv ../build/test/kiwi-* bin/
|
||||
cp -r ../include/kiwi include/
|
||||
tar -zcvf ../asset.tgz include/ lib/ bin/
|
||||
- run: |
|
||||
mv build/bindings/java/kiwi-java*.jar kiwi-java.jar
|
||||
- name: Upload release binary
|
||||
uses: actions/upload-release-asset@v1.0.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.get_release.outputs.upload_url }}
|
||||
asset_path: asset.tgz
|
||||
asset_path: arts/asset.tgz
|
||||
asset_name: kiwi_lnx_centos5_x86_64_${{ steps.get_release.outputs.tag_name }}.tgz
|
||||
asset_content_type: application/octet-stream
|
||||
|
||||
build-centos6:
|
||||
name: Centos6
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: docker://quay.io/pypa/manylinux2010_x86_64
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Update CMake
|
||||
run: |
|
||||
/opt/python/cp36-cp36m/bin/pip install cmake
|
||||
yum install java-1.8.0-openjdk-devel.x86_64 -y
|
||||
- name: Configure Build
|
||||
run: mkdir build && cd build && /opt/python/cp36-cp36m/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_JAVA_BINDING=1 ..
|
||||
- name: Build
|
||||
run: cd build && make -j2
|
||||
- run: |
|
||||
mkdir result
|
||||
cd result
|
||||
mkdir include && mkdir lib && mkdir bin
|
||||
mv ../build/libkiwi* lib/
|
||||
mv ../build/kiwi-* bin/
|
||||
mv ../build/test/kiwi-* bin/
|
||||
cp -r ../include/kiwi include/
|
||||
tar -zcvf ../asset.tgz include/ lib/ bin/
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: asset_Centos6
|
||||
path: asset.tgz
|
||||
- run: |
|
||||
mv build/bindings/java/kiwi-java*.jar kiwi-java.jar
|
||||
- name: Archive jar binaries
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: jar_Centos6
|
||||
path: kiwi-java.jar
|
||||
|
||||
upload-asset-from-centos6:
|
||||
name: Upload asset from Centos6
|
||||
needs: build-centos6
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Get release
|
||||
id: get_release
|
||||
uses: bruceadams/get-release@v1.2.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
- uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: asset_Centos6
|
||||
path: arts
|
||||
- name: Upload release binary
|
||||
uses: actions/upload-release-asset@v1.0.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.get_release.outputs.upload_url }}
|
||||
asset_path: arts/asset.tgz
|
||||
asset_name: kiwi_lnx_x86_64_${{ steps.get_release.outputs.tag_name }}.tgz
|
||||
asset_content_type: application/octet-stream
|
||||
- uses: actions/download-artifact@v2
|
||||
with:
|
||||
name: jar_Centos6
|
||||
path: arts
|
||||
- name: Upload release jar
|
||||
uses: actions/upload-release-asset@v1.0.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.get_release.outputs.upload_url }}
|
||||
asset_path: kiwi-java.jar
|
||||
asset_path: arts/kiwi-java.jar
|
||||
asset_name: kiwi-java-${{ steps.get_release.outputs.tag_name }}-lnx-x86-64.jar
|
||||
asset_content_type: application/octet-stream
|
||||
|
||||
build-macos:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-11]
|
||||
arch: [x86_64, arm64]
|
||||
runs-on: macos-15
|
||||
name: macOS - ${{ matrix.arch }}
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
name: ${{ matrix.os }} - ${{ matrix.arch }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
- name: Get release
|
||||
id: get_release
|
||||
uses: bruceadams/get-release@v1.3.2
|
||||
uses: bruceadams/get-release@v1.2.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
- name: Configure Build
|
||||
run: |
|
||||
mkdir build && cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 -DKIWI_CPU_ARCH=${{ matrix.arch }} -DKIWI_JAVA_BINDING=1 ..
|
||||
run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=10.14 -DKIWI_CPU_ARCH=${{ matrix.arch }} -DKIWI_JAVA_BINDING=1 ..
|
||||
- name: Build
|
||||
run: cd build && make -j2
|
||||
- run: |
|
||||
|
|
@ -114,7 +194,7 @@ jobs:
|
|||
asset_name: kiwi-java-${{ steps.get_release.outputs.tag_name }}-mac-${{ matrix.arch }}.jar
|
||||
asset_content_type: application/octet-stream
|
||||
- if: matrix.arch == 'arm64'
|
||||
run: tar -zcvf model.tgz models/cong/base/sj.* models/cong/base/*.dict models/cong/base/combiningRule.txt models/cong/base/*.mdl
|
||||
run: tar -zcvf model.tgz ModelGenerator/sj.* ModelGenerator/extract.mdl ModelGenerator/*.dict ModelGenerator/combiningRule.txt ModelGenerator/skipbigram.mdl
|
||||
- name: Upload release binary
|
||||
if: matrix.arch == 'arm64'
|
||||
uses: actions/upload-release-asset@v1.0.2
|
||||
|
|
@ -129,14 +209,14 @@ jobs:
|
|||
build-windows:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-2022]
|
||||
os: [windows-2019]
|
||||
arch: [Win32, x64]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
name: ${{ matrix.os }} ${{ matrix.arch }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
|
|
@ -154,7 +234,7 @@ jobs:
|
|||
cmakeListsOrSettingsJson: CMakeListsTxtAdvanced
|
||||
cmakeBuildType: Release
|
||||
buildWithCMake: true
|
||||
cmakeAppendedArgs: -G"Visual Studio 17 2022" -A${{ matrix.arch }} -DKIWI_JAVA_BINDING=1
|
||||
cmakeAppendedArgs: -G"Visual Studio 16 2019" -A${{ matrix.arch }} -DKIWI_JAVA_BINDING=1
|
||||
buildWithCMakeArgs: --config Release
|
||||
buildDirectory: build
|
||||
- run: |
|
||||
|
|
@ -194,13 +274,13 @@ jobs:
|
|||
matrix:
|
||||
arch: [aarch64, ppc64le]
|
||||
name: Centos7-${{ matrix.arch }}
|
||||
runs-on: ${{ matrix.arch == 'aarch64' && 'ubuntu-24.04-arm' || 'ubuntu-latest' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
- uses: bab2min/run-on-arch-action@multiple-step-v2
|
||||
- uses: bab2min/run-on-arch-action@use-custom-image
|
||||
id: runcmd
|
||||
with:
|
||||
image: quay.io/pypa/manylinux2014_${{ matrix.arch }}
|
||||
|
|
@ -209,25 +289,20 @@ jobs:
|
|||
mkdir -p "${PWD}/artifacts"
|
||||
dockerRunArgs: |
|
||||
--volume "${PWD}/artifacts:/artifacts"
|
||||
multipleRun: |
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
/opt/python/cp310-cp310/bin/pip install "cmake<4"
|
||||
yum install java-1.8.0-openjdk-devel -y
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir build && pushd build && /opt/python/cp310-cp310/bin/cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_USE_MIMALLOC=0 -DKIWI_JAVA_BINDING=1 ..
|
||||
make -j2 && popd
|
||||
- name: Release
|
||||
run: |
|
||||
cd build
|
||||
mkdir include && mkdir lib && mkdir bin
|
||||
mv libkiwi* lib/
|
||||
mv kiwi-* bin/
|
||||
mv test/kiwi-* bin/
|
||||
cp -r ../include/kiwi include/
|
||||
tar -zcvf /artifacts/asset.tgz include/ lib/ bin/
|
||||
mv bindings/java/kiwi-java*.jar /artifacts/kiwi-java.jar
|
||||
run: |
|
||||
yum install java-1.8.0-openjdk-devel -y
|
||||
mkdir build && pushd build && cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_USE_MIMALLOC=0 -DKIWI_JAVA_BINDING=1 ..
|
||||
make -j2 && popd
|
||||
./build/test/kiwi-test
|
||||
mkdir eval_results && ./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt -o eval_results/
|
||||
cd build
|
||||
mkdir include && mkdir lib && mkdir bin
|
||||
mv libkiwi* lib/
|
||||
mv kiwi-* bin/
|
||||
mv test/kiwi-* bin/
|
||||
cp -r ../include/kiwi include/
|
||||
tar -zcvf /artifacts/asset.tgz include/ lib/ bin/
|
||||
mv bindings/java/kiwi-java*.jar /artifacts/kiwi-java.jar
|
||||
- name: Get release
|
||||
id: get_release
|
||||
uses: bruceadams/get-release@v1.2.2
|
||||
|
|
@ -251,103 +326,3 @@ jobs:
|
|||
asset_path: artifacts/kiwi-java.jar
|
||||
asset_name: kiwi-java-${{ steps.get_release.outputs.tag_name }}-lnx-${{ matrix.arch }}.jar
|
||||
asset_content_type: application/octet-stream
|
||||
|
||||
build-android:
|
||||
name: Android ARM64
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
- name: Get release
|
||||
id: get_release
|
||||
uses: bruceadams/get-release@v1.3.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
- name: Setup Android NDK
|
||||
uses: nttld/setup-ndk@v1
|
||||
with:
|
||||
ndk-version: r25c
|
||||
add-to-path: true
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
- name: Setup Gradle
|
||||
uses: gradle/gradle-build-action@v2
|
||||
- name: Grant execute permission for gradlew
|
||||
run: |
|
||||
chmod +x bindings/java/gradlew
|
||||
- name: Build Android AAR
|
||||
run: |
|
||||
cd bindings/java
|
||||
./gradlew assembleRelease
|
||||
- name: Package Android AAR release
|
||||
run: |
|
||||
cd bindings/java
|
||||
# Copy the built AAR with correct name
|
||||
find build/outputs/aar/ -name "*.aar" -exec cp {} kiwi-android.aar \; 2>/dev/null || echo "AAR file not found, checking directory structure"
|
||||
echo "Contents of build/outputs/:"
|
||||
find build/outputs/ -type f 2>/dev/null || echo "build/outputs/ not found"
|
||||
|
||||
# Also create a traditional native library package for backwards compatibility
|
||||
mkdir -p result/include result/lib
|
||||
find build -name "*.so" -exec cp {} result/lib/ \; 2>/dev/null || echo "No .so files found"
|
||||
cp -r ../../include/kiwi result/include/ 2>/dev/null || echo "Include directory not found"
|
||||
cd result && tar -zcvf ../kiwi_android_arm64_compat.tgz include/ lib/ && cd ..
|
||||
- name: Upload Android AAR
|
||||
uses: actions/upload-release-asset@v1.0.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.get_release.outputs.upload_url }}
|
||||
asset_path: bindings/java/kiwi-android.aar
|
||||
asset_name: kiwi-android-${{ steps.get_release.outputs.tag_name }}.aar
|
||||
asset_content_type: application/octet-stream
|
||||
- name: Upload Android native library (compatibility)
|
||||
uses: actions/upload-release-asset@v1.0.2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.get_release.outputs.upload_url }}
|
||||
asset_path: bindings/java/kiwi_android_arm64_compat.tgz
|
||||
asset_name: kiwi_android_arm64_${{ steps.get_release.outputs.tag_name }}.tgz
|
||||
asset_content_type: application/octet-stream
|
||||
|
||||
build-emscripten:
|
||||
name: Emscripten
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
- uses: mymindstorm/setup-emsdk@v14
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- name: Build
|
||||
run: |
|
||||
cd bindings/wasm
|
||||
./build.sh
|
||||
- name: Publish to npm
|
||||
run: |
|
||||
npm install -g npm@latest
|
||||
cd bindings/wasm/package
|
||||
npm publish --provenance --access public
|
||||
- name: Build documenation
|
||||
run: |
|
||||
cd bindings/wasm/package
|
||||
npm run doc
|
||||
- name: Publish documenation
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: bindings/wasm/package/doc
|
||||
destination_dir: ./kiwi-nlp
|
||||
|
|
|
|||
183
.github/workflows/swift.yml
vendored
183
.github/workflows/swift.yml
vendored
|
|
@ -1,183 +0,0 @@
|
|||
name: Swift Bindings
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
paths:
|
||||
- 'bindings/swift/**'
|
||||
- 'include/kiwi/capi.h'
|
||||
- 'include/kiwi/Macro.h'
|
||||
- '.github/workflows/swift.yml'
|
||||
push:
|
||||
branches: [ main ]
|
||||
paths:
|
||||
- 'bindings/swift/**'
|
||||
- 'include/kiwi/capi.h'
|
||||
- 'include/kiwi/Macro.h'
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
jobs:
|
||||
swift-build-test:
|
||||
name: Swift Build and Test
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
|
||||
- name: Select Xcode
|
||||
run: sudo xcode-select -switch /Applications/Xcode.app
|
||||
|
||||
- name: Swift Version
|
||||
run: swift --version
|
||||
|
||||
- name: Build C++ Library
|
||||
run: |
|
||||
mkdir build && cd build
|
||||
cmake -DCMAKE_BUILD_TYPE=Release \
|
||||
-DKIWI_BUILD_DYNAMIC=OFF \
|
||||
-DKIWI_BUILD_CLI=OFF \
|
||||
-DKIWI_BUILD_EVALUATOR=OFF \
|
||||
-DKIWI_BUILD_MODEL_BUILDER=OFF \
|
||||
-DKIWI_BUILD_TEST=OFF \
|
||||
-DKIWI_JAVA_BINDING=OFF \
|
||||
-DKIWI_USE_MIMALLOC=ON \
|
||||
..
|
||||
make -j$(sysctl -n hw.ncpu)
|
||||
|
||||
- name: Verify Static Library
|
||||
run: |
|
||||
if [ ! -f build/libkiwi_static.a ]; then
|
||||
echo "Error: libkiwi_static.a not found"
|
||||
exit 1
|
||||
fi
|
||||
file build/libkiwi_static.a
|
||||
ls -lh build/libkiwi_static.a
|
||||
|
||||
- name: Build Swift Package
|
||||
run: |
|
||||
cd bindings/swift
|
||||
swift build -v -Xlinker -L../../build -Xlinker -lkiwi_static
|
||||
|
||||
- name: Run Swift Tests
|
||||
run: |
|
||||
cd bindings/swift
|
||||
swift test -v -Xlinker -L../../build -Xlinker -lkiwi_static
|
||||
|
||||
swift-xcframework:
|
||||
name: Build XCFramework
|
||||
runs-on: macos-latest
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
|
||||
- name: Setup Xcode
|
||||
run: sudo xcode-select -switch /Applications/Xcode.app
|
||||
|
||||
- name: Build XCFramework
|
||||
run: |
|
||||
chmod +x bindings/swift/scripts/build-xcframework.sh
|
||||
bindings/swift/scripts/build-xcframework.sh
|
||||
|
||||
- name: Verify XCFramework
|
||||
run: |
|
||||
if [ ! -d bindings/swift/xcframework/Kiwi.xcframework ]; then
|
||||
echo "Error: Kiwi.xcframework not found"
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f bindings/swift/xcframework/Kiwi.xcframework.zip ]; then
|
||||
echo "Error: Kiwi.xcframework.zip not found"
|
||||
exit 1
|
||||
fi
|
||||
ls -lh bindings/swift/xcframework/
|
||||
|
||||
- name: Calculate Checksum
|
||||
run: |
|
||||
cd bindings/swift/xcframework
|
||||
swift package compute-checksum Kiwi.xcframework.zip > checksum.txt
|
||||
echo "Checksum: $(cat checksum.txt)"
|
||||
|
||||
- name: Archive XCFramework
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Kiwi-xcframework
|
||||
path: |
|
||||
bindings/swift/xcframework/Kiwi.xcframework.zip
|
||||
bindings/swift/xcframework/checksum.txt
|
||||
|
||||
swift-release:
|
||||
name: Release XCFramework
|
||||
runs-on: macos-latest
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
|
||||
- name: Setup Xcode
|
||||
run: sudo xcode-select -switch /Applications/Xcode.app
|
||||
|
||||
- name: Build XCFramework
|
||||
run: |
|
||||
chmod +x bindings/swift/scripts/build-xcframework.sh
|
||||
bindings/swift/scripts/build-xcframework.sh
|
||||
|
||||
- name: Calculate Checksum
|
||||
id: checksum
|
||||
run: |
|
||||
cd bindings/swift/xcframework
|
||||
CHECKSUM=$(swift package compute-checksum Kiwi.xcframework.zip)
|
||||
echo "checksum=$CHECKSUM" >> $GITHUB_OUTPUT
|
||||
echo "Checksum: $CHECKSUM"
|
||||
|
||||
- name: Upload to Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
files: |
|
||||
bindings/swift/xcframework/Kiwi.xcframework.zip
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Output SPM Configuration
|
||||
run: |
|
||||
TAG=${GITHUB_REF#refs/tags/}
|
||||
echo ""
|
||||
echo "=== Swift Package Manager Configuration ==="
|
||||
echo ""
|
||||
echo "Add this to your Package.swift:"
|
||||
echo ""
|
||||
echo ".binaryTarget("
|
||||
echo " name: \"CKiwi\","
|
||||
echo " url: \"https://github.com/${{ github.repository }}/releases/download/$TAG/Kiwi.xcframework.zip\","
|
||||
echo " checksum: \"${{ steps.checksum.outputs.checksum }}\""
|
||||
echo ")"
|
||||
|
||||
swift-linux-check:
|
||||
name: Swift Linux Compatibility Check
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
|
||||
- name: Setup Swift
|
||||
uses: swift-actions/setup-swift@v2
|
||||
with:
|
||||
swift-version: "5.10"
|
||||
|
||||
- name: Check Package Format
|
||||
run: |
|
||||
cd bindings/swift
|
||||
swift package diagnose || true
|
||||
echo "Note: Linux build may not work without modifications, but checking package structure"
|
||||
44
.github/workflows/ubuntu.yml
vendored
44
.github/workflows/ubuntu.yml
vendored
|
|
@ -9,16 +9,24 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- name: "Ubuntu 20.04 + gcc-10"
|
||||
os: ubuntu-20.04
|
||||
compiler: gcc
|
||||
version: "10"
|
||||
- name: "Ubuntu 22.04 + gcc-11"
|
||||
os: ubuntu-22.04
|
||||
compiler: gcc
|
||||
version: "11"
|
||||
- name: "Ubuntu 20.04 + clang-10"
|
||||
os: ubuntu-20.04
|
||||
compiler: clang
|
||||
version: "10"
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
name: ${{ matrix.name }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
|
|
@ -33,10 +41,8 @@ jobs:
|
|||
fi
|
||||
- name: Configure Build
|
||||
run: mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release -DKIWI_JAVA_BINDING=1 ..
|
||||
- name: Print CPU Info
|
||||
run: cat /proc/cpuinfo
|
||||
- name: Build
|
||||
run: cd build && make -j1
|
||||
run: cd build && make -j2
|
||||
- name: Run Unit Test
|
||||
run: ./build/test/kiwi-test
|
||||
- name: Run Unit Test in Debug mode
|
||||
|
|
@ -49,29 +55,27 @@ jobs:
|
|||
cd bindings/java
|
||||
curl -OL https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
|
||||
curl -OL https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
|
||||
javac -cp "*:../../build/bindings/java/*:." -encoding utf-8 test/KiwiTest.java
|
||||
java -cp "*:../../build/bindings/java/*:." org.junit.runner.JUnitCore test.KiwiTest
|
||||
javac -cp "*:../../build/bindings/java/*:." -encoding utf-8 kr/pe/bab2min/KiwiTest.java
|
||||
java -cp "*:../../build/bindings/java/*:." org.junit.runner.JUnitCore kr.pe.bab2min.KiwiTest
|
||||
- name: Run Evaluator
|
||||
run: |
|
||||
mkdir eval_results
|
||||
./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t cong -o eval_results/
|
||||
./build/kiwi-evaluator -m ./models/cong/base --morph eval_data/*.txt -t cong-global -o eval_results/
|
||||
./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt -o eval_results/
|
||||
./build/kiwi-evaluator -m ./ModelGenerator eval_data/*.txt --sbg -o eval_results/
|
||||
- name: Run Benchmark
|
||||
run: |
|
||||
curl -OL https://latina.bab2min.pe.kr/_data/kowiki1000.txt
|
||||
./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=none ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=balanced ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse2 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse4_1 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx2 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx512vnni ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse2 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --model-type largest kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse4_1 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --model-type largest kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx2 ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --model-type largest kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx512vnni ./build/kiwi-cli-* -m ./models/cong/base -e -o test.out --model-type largest kowiki1000.txt
|
||||
./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=none ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=balanced ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse2 ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=sse4_1 ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx2 ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx512bw ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx512bw ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out --sbg kowiki1000.txt
|
||||
KIWI_ARCH_TYPE=avx512bw ./build/kiwi-cli-* -m ./ModelGenerator -e -o test.out --typos 6 kowiki1000.txt
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifacts ${{ matrix.name }}
|
||||
path: |
|
||||
|
|
|
|||
50
.github/workflows/wasm.yml
vendored
50
.github/workflows/wasm.yml
vendored
|
|
@ -1,50 +0,0 @@
|
|||
name: WASM Bindings
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
paths:
|
||||
- 'bindings/wasm/**'
|
||||
- 'src/**'
|
||||
- 'include/**'
|
||||
- 'CMakeLists.txt'
|
||||
- '.github/workflows/wasm.yml'
|
||||
push:
|
||||
branches: [ main ]
|
||||
paths:
|
||||
- 'bindings/wasm/**'
|
||||
- 'src/**'
|
||||
- 'include/**'
|
||||
- 'CMakeLists.txt'
|
||||
- '.github/workflows/wasm.yml'
|
||||
|
||||
jobs:
|
||||
wasm-build-test:
|
||||
name: WASM Build and Test
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20'
|
||||
|
||||
- name: Setup Emscripten
|
||||
uses: mymindstorm/setup-emsdk@v14
|
||||
with:
|
||||
version: '3.1.64' # Latest stable or specific version
|
||||
|
||||
- name: Build WASM
|
||||
run: |
|
||||
chmod +x bindings/wasm/build.sh
|
||||
bindings/wasm/build.sh
|
||||
|
||||
- name: Run WASM Unit Test
|
||||
run: |
|
||||
cd bindings/wasm/package
|
||||
npm run test
|
||||
56
.github/workflows/windows.yml
vendored
56
.github/workflows/windows.yml
vendored
|
|
@ -8,22 +8,20 @@ jobs:
|
|||
build-windows:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [windows-2022]
|
||||
os: [windows-2019]
|
||||
arch: [Win32, x64]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
name: ${{ matrix.os }} ${{ matrix.arch }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
lfs: true
|
||||
- name: Init
|
||||
run: |
|
||||
mkdir build
|
||||
- name: Print CPU Info
|
||||
run: bash -c "cat /proc/cpuinfo"
|
||||
- name: Build
|
||||
uses: lukka/run-cmake@v3
|
||||
with:
|
||||
|
|
@ -31,16 +29,16 @@ jobs:
|
|||
cmakeBuildType: Release
|
||||
buildWithCMake: true
|
||||
#cmakeGenerator: VS16Win${{ matrix.arch }}
|
||||
cmakeAppendedArgs: -G"Visual Studio 17 2022" -A${{ matrix.arch }} -DKIWI_JAVA_BINDING=1
|
||||
cmakeAppendedArgs: -G"Visual Studio 16 2019" -A${{ matrix.arch }} -DKIWI_JAVA_BINDING=1
|
||||
buildWithCMakeArgs: --config Release
|
||||
buildDirectory: build
|
||||
- name: Run Evaluator
|
||||
run: |
|
||||
mkdir eval_results
|
||||
.\build\Release\kiwi-evaluator.exe -m .\models\cong\base -t cong --morph (Get-ChildItem eval_data\*.txt | Select-Object -Expand FullName) -o eval_results\
|
||||
.\build\Release\kiwi-evaluator.exe -m .\models\cong\base -t cong-global --morph (Get-ChildItem eval_data\*.txt | Select-Object -Expand FullName) -o eval_results\
|
||||
.\build\Release\kiwi-evaluator.exe -m .\ModelGenerator (Get-ChildItem eval_data\*.txt | Select-Object -Expand FullName) -o eval_results\
|
||||
.\build\Release\kiwi-evaluator.exe -m .\ModelGenerator --sbg (Get-ChildItem eval_data\*.txt | Select-Object -Expand FullName) -o eval_results\
|
||||
- name: Archive binaries
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifacts ${{ matrix.os }} ${{ matrix.arch }}bit
|
||||
path: |
|
||||
|
|
@ -49,7 +47,6 @@ jobs:
|
|||
eval_results\*.txt
|
||||
build\bindings\java\*.jar
|
||||
- name: Run Unit Test
|
||||
if: matrix.arch == 'x64'
|
||||
run: .\build\test\Release\kiwi-test.exe
|
||||
- name: Run Java Unit Test
|
||||
if: matrix.arch == 'x64'
|
||||
|
|
@ -57,45 +54,26 @@ jobs:
|
|||
cd bindings/java
|
||||
curl -OL https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
|
||||
curl -OL https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
|
||||
javac -cp "*;../../build/bindings/java/*;." -encoding utf-8 test/KiwiTest.java
|
||||
java -cp "*;../../build/bindings/java/*;." org.junit.runner.JUnitCore test.KiwiTest
|
||||
javac -cp "*;../../build/bindings/java/*;." -encoding utf-8 kr/pe/bab2min/KiwiTest.java
|
||||
java -cp "*;../../build/bindings/java/*;." org.junit.runner.JUnitCore kr.pe.bab2min.KiwiTest
|
||||
- name: Run Benchmark
|
||||
run: |
|
||||
curl -OL https://latina.bab2min.pe.kr/_data/kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'none'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'balanced'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'sse2'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out kowiki1000.txt
|
||||
if ( '${{ matrix.arch }}' -eq 'x64' )
|
||||
{
|
||||
$env:KIWI_ARCH_TYPE = 'sse4_1'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'avx2'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'avx512bw'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out kowiki1000.txt
|
||||
}
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out --model-type largest kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out --typo 6 kowiki1000.txt
|
||||
if ( '${{ matrix.arch }}' -eq 'x64' )
|
||||
{
|
||||
$env:KIWI_ARCH_TYPE = 'sse2'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'sse4_1'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'avx2'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'avx512vnni'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'sse2'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out --model-type largest kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'sse4_1'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out --model-type largest kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'avx2'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out --model-type largest kowiki1000.txt
|
||||
$env:KIWI_ARCH_TYPE = 'avx512vnni'
|
||||
.\build\Release\kiwi-cli-*.exe -m .\models\cong\base -e -o test.out --model-type largest kowiki1000.txt
|
||||
}
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out --sbg kowiki1000.txt
|
||||
.\build\Release\kiwi-cli-*.exe -m .\ModelGenerator -e -o test.out --typos 6 kowiki1000.txt
|
||||
|
|
|
|||
6
.gitmodules
vendored
6
.gitmodules
vendored
|
|
@ -15,12 +15,12 @@
|
|||
[submodule "third_party/cpuinfo"]
|
||||
path = third_party/cpuinfo
|
||||
url = https://github.com/pytorch/cpuinfo
|
||||
[submodule "third_party/variant"]
|
||||
path = third_party/variant
|
||||
url = https://github.com/mapbox/variant
|
||||
[submodule "third_party/eigen"]
|
||||
path = third_party/eigen
|
||||
url = https://gitlab.com/libeigen/eigen
|
||||
[submodule "third_party/json"]
|
||||
path = third_party/json
|
||||
url = https://github.com/nlohmann/json
|
||||
[submodule "third_party/streamvbyte"]
|
||||
path = third_party/streamvbyte
|
||||
url = https://github.com/fast-pack/streamvbyte
|
||||
|
|
|
|||
205
CMakeLists.txt
205
CMakeLists.txt
|
|
@ -1,17 +1,13 @@
|
|||
cmake_minimum_required(VERSION 3.12)
|
||||
|
||||
project(kiwi VERSION 0.23.2 DESCRIPTION "Kiwi, Korean Intelligent Word Identifier")
|
||||
project(kiwi VERSION 0.17.1 DESCRIPTION "Kiwi, Korean Intelligent Word Identifier")
|
||||
|
||||
set ( CMAKE_CXX_STANDARD 17 )
|
||||
set ( CMAKE_CXX_STANDARD 14 )
|
||||
set ( CMAKE_VERBOSE_MAKEFILE true )
|
||||
|
||||
option(KIWI_USE_MIMALLOC "Use mimalloc for faster memory allocation" ON)
|
||||
option(KIWI_USE_CPUINFO "Use cpuinfo for dynamic CPU dispatching" ON)
|
||||
option(KIWI_STATIC_WITHOUT_MT "Use /MT Option in building kiwi_static" OFF)
|
||||
option(KIWI_BUILD_DYNAMIC "Build dynamic library" ON)
|
||||
option(KIWI_BUILD_CLI "Build CLI tool" ON)
|
||||
option(KIWI_BUILD_EVALUATOR "Build Evaluator" ON)
|
||||
option(KIWI_BUILD_MODEL_BUILDER "Build Model Builder" ON)
|
||||
option(KIWI_BUILD_TEST "Build Test sets" ON)
|
||||
option(KIWI_JAVA_BINDING "Build Java binding" OFF)
|
||||
set(KIWI_CPU_ARCH "" CACHE STRING "Set architecture type for macOS")
|
||||
|
|
@ -27,14 +23,9 @@ if (NOT CMAKE_BUILD_TYPE)
|
|||
endif()
|
||||
|
||||
if(NOT KIWI_CPU_ARCH)
|
||||
if (EMSCRIPTEN)
|
||||
set(KIWI_CPU_ARCH "wasm")
|
||||
elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)"
|
||||
OR "${ANDROID_ABI}" STREQUAL "x86_64")
|
||||
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)")
|
||||
set(KIWI_CPU_ARCH "x86_64")
|
||||
elseif (HOST_ARCHITECTURE MATCHES "^arm64"
|
||||
OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|aarch64)"
|
||||
OR "${ANDROID_ABI}" STREQUAL "arm64-v8a")
|
||||
elseif (HOST_ARCHITECTURE MATCHES "^arm64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|aarch64)")
|
||||
set(KIWI_CPU_ARCH "arm64")
|
||||
else()
|
||||
set(KIWI_CPU_ARCH "other")
|
||||
|
|
@ -42,44 +33,28 @@ if(NOT KIWI_CPU_ARCH)
|
|||
set(KIWI_CPU_ARCH "${KIWI_CPU_ARCH}" PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
|
||||
if (KIWI_USE_CPUINFO AND
|
||||
(MSVC OR
|
||||
((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 11)
|
||||
)
|
||||
)
|
||||
set ( AVX_VNNI_SUPPORTED ON )
|
||||
else()
|
||||
set ( AVX_VNNI_SUPPORTED OFF )
|
||||
endif()
|
||||
|
||||
if(APPLE AND NOT CMAKE_OSX_ARCHITECTURES)
|
||||
if(APPLE)
|
||||
set(CMAKE_OSX_ARCHITECTURES "${KIWI_CPU_ARCH}")
|
||||
endif()
|
||||
|
||||
set ( CORE_SRCS
|
||||
src/ArchUtils.cpp
|
||||
src/Combiner.cpp
|
||||
src/CoNgramModel.cpp
|
||||
src/Dataset.cpp
|
||||
src/Form.cpp
|
||||
src/FeatureTestor.cpp
|
||||
src/FileUtils.cpp
|
||||
src/HSDataset.cpp
|
||||
src/Joiner.cpp
|
||||
src/Kiwi.cpp
|
||||
src/KiwiBuilder.cpp
|
||||
src/Knlm.cpp
|
||||
src/KTrie.cpp
|
||||
src/PatternMatcher.cpp
|
||||
src/search.cpp
|
||||
src/ScriptType.cpp
|
||||
src/SkipBigramModel.cpp
|
||||
src/SubstringExtractor.cpp
|
||||
src/SwTokenizer.cpp
|
||||
src/TagUtils.cpp
|
||||
src/TypoTransformer.cpp
|
||||
src/UnicodeCase.cpp
|
||||
src/UnkFormScorer.cpp
|
||||
src/Utils.cpp
|
||||
src/WordDetector.cpp
|
||||
src/archImpl/none.cpp
|
||||
|
|
@ -99,13 +74,9 @@ endif()
|
|||
include_directories( include/ )
|
||||
include_directories( third_party/tclap/include )
|
||||
include_directories( third_party/cpp-btree )
|
||||
include_directories( third_party/variant/include )
|
||||
include_directories( third_party/eigen )
|
||||
include_directories( third_party/json/include )
|
||||
include_directories( third_party/streamvbyte/include )
|
||||
add_subdirectory( third_party/streamvbyte )
|
||||
set ( STREAMVBYTE_OBJECTS
|
||||
$<TARGET_OBJECTS:streamvbyte>
|
||||
)
|
||||
if(KIWI_USE_CPUINFO)
|
||||
message(STATUS "Use cpuinfo")
|
||||
include_directories( third_party/cpuinfo/include )
|
||||
|
|
@ -120,6 +91,9 @@ if(KIWI_USE_CPUINFO)
|
|||
set ( ADDITIONAL_FLAGS ${ADDITIONAL_FLAGS} "-DKIWI_USE_CPUINFO" )
|
||||
|
||||
if(MSVC)
|
||||
target_compile_options("clog" PUBLIC
|
||||
/MT
|
||||
)
|
||||
target_compile_options("cpuinfo" PUBLIC
|
||||
/MT
|
||||
)
|
||||
|
|
@ -129,18 +103,15 @@ if(KIWI_USE_CPUINFO)
|
|||
endif()
|
||||
|
||||
set ( CPUINFO_OBJECTS_STATIC
|
||||
$<TARGET_OBJECTS:clog>
|
||||
$<TARGET_OBJECTS:cpuinfo_internals>
|
||||
)
|
||||
set ( CPUINFO_OBJECTS_SHARED
|
||||
$<TARGET_OBJECTS:clog>
|
||||
$<TARGET_OBJECTS:cpuinfo>
|
||||
)
|
||||
endif()
|
||||
|
||||
if (AVX_VNNI_SUPPORTED)
|
||||
message(STATUS "AVX-VNNI is supported")
|
||||
set ( ADDITIONAL_FLAGS ${ADDITIONAL_FLAGS} "-DKIWI_AVX_VNNI_SUPPORTED" )
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
set ( CMAKE_C_FLAGS_DEBUG "-DDEBUG -DC_FLAGS -Zi -Od /utf-8 /bigobj" )
|
||||
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" )
|
||||
|
|
@ -152,30 +123,19 @@ if(MSVC)
|
|||
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||
set ( CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" )
|
||||
else()
|
||||
if(NOT ANDROID)
|
||||
link_libraries ( pthread )
|
||||
endif()
|
||||
link_libraries ( pthread )
|
||||
|
||||
set ( CMAKE_C_FLAGS_DEBUG "-DDEBUG -DC_FLAGS -g3 -O0" )
|
||||
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" )
|
||||
set ( CMAKE_EXE_LINKER_FLAGS_DEBUG "-DDEBUG -DLINKER_FLAGS" )
|
||||
|
||||
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
||||
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
|
||||
|
||||
set ( CMAKE_C_FLAGS_RELEASE "-DNDEBUG -DRELEASE -DC_FLAGS -O3 -DKIWI_USE_BTREE" )
|
||||
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" )
|
||||
set ( CMAKE_EXE_LINKER_FLAGS_RELEASE "-DRELEASE -DLINKER_FLAGS" )
|
||||
|
||||
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g")
|
||||
set ( CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -g3")
|
||||
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||
set ( CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELEASE}" )
|
||||
|
||||
if (APPLE)
|
||||
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wno-unqualified-std-cast-call" )
|
||||
set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-unqualified-std-cast-call" )
|
||||
set ( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -Wno-unqualified-std-cast-call" )
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (KIWI_CPU_ARCH MATCHES "x86_64")
|
||||
|
|
@ -190,36 +150,21 @@ if (KIWI_CPU_ARCH MATCHES "x86_64")
|
|||
${CORE_SRCS}
|
||||
src/archImpl/avx2.cpp
|
||||
src/archImpl/avx512bw.cpp
|
||||
src/archImpl/avx512vnni.cpp
|
||||
)
|
||||
# If AVX-VNNI is supported (MSVC, GCC 11+ or Clang 11+)
|
||||
if (AVX_VNNI_SUPPORTED)
|
||||
set( CORE_SRCS
|
||||
${CORE_SRCS}
|
||||
src/archImpl/avx_vnni.cpp
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
set_source_files_properties(src/archImpl/sse2.cpp PROPERTIES COMPILE_FLAGS "/arch:SSE2")
|
||||
set_source_files_properties(src/archImpl/sse4_1.cpp PROPERTIES COMPILE_FLAGS "/arch:SSE2")
|
||||
if (KIWI_USE_CPUINFO)
|
||||
set_source_files_properties(src/archImpl/avx2.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX2")
|
||||
set_source_files_properties(src/archImpl/avx_vnni.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX2")
|
||||
set_source_files_properties(src/archImpl/avx512bw.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX512")
|
||||
set_source_files_properties(src/archImpl/avx512vnni.cpp PROPERTIES COMPILE_FLAGS "/arch:AVX512")
|
||||
endif()
|
||||
else()
|
||||
set_source_files_properties(src/archImpl/sse2.cpp PROPERTIES COMPILE_FLAGS "-msse2")
|
||||
set_source_files_properties(src/archImpl/sse4_1.cpp PROPERTIES COMPILE_FLAGS "-msse2 -msse4.1")
|
||||
if (KIWI_USE_CPUINFO)
|
||||
set_source_files_properties(src/archImpl/avx2.cpp PROPERTIES COMPILE_FLAGS "-mavx -mavx2 -mfma")
|
||||
set_source_files_properties(src/archImpl/avx512bw.cpp PROPERTIES COMPILE_FLAGS "-mavx -mavx2 -mfma -mavx512f -mavx512vl -mavx512dq -mavx512bw")
|
||||
set_source_files_properties(src/archImpl/avx512vnni.cpp PROPERTIES COMPILE_FLAGS "-mavx -mavx2 -mfma -mavx512f -mavx512vl -mavx512dq -mavx512bw -mavx512vnni")
|
||||
if (AVX_VNNI_SUPPORTED)
|
||||
set_source_files_properties(src/archImpl/avx_vnni.cpp PROPERTIES COMPILE_FLAGS "-mavx -mavx2 -mfma -mavxvnni")
|
||||
endif()
|
||||
set_source_files_properties(src/archImpl/avx512bw.cpp PROPERTIES COMPILE_FLAGS "-mavx512f -mavx512bw")
|
||||
endif()
|
||||
endif()
|
||||
elseif (KIWI_CPU_ARCH MATCHES "arm64")
|
||||
|
|
@ -228,9 +173,7 @@ elseif (KIWI_CPU_ARCH MATCHES "arm64")
|
|||
${CORE_SRCS}
|
||||
src/archImpl/neon.cpp
|
||||
)
|
||||
set_source_files_properties(src/archImpl/neon.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a -DKIWI_ARCH_ARM64=1")
|
||||
elseif (KIWI_CPU_ARCH MATCHES "wasm")
|
||||
message("Compiling for wasm")
|
||||
set_source_files_properties(src/archImpl/neon.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a")
|
||||
else()
|
||||
message("Compiling for other")
|
||||
endif()
|
||||
|
|
@ -239,67 +182,56 @@ add_library( "${PROJECT_NAME}_static" STATIC
|
|||
${CORE_SRCS}
|
||||
src/capi/kiwi_c.cpp
|
||||
${CPUINFO_OBJECTS_STATIC}
|
||||
${STREAMVBYTE_OBJECTS}
|
||||
)
|
||||
|
||||
install(TARGETS ${PROJECT_NAME}_static PUBLIC_HEADER DESTINATION include/kiwi)
|
||||
add_library( "${PROJECT_NAME}" SHARED
|
||||
${CORE_SRCS}
|
||||
src/capi/kiwi_c.cpp
|
||||
${CPUINFO_OBJECTS_SHARED}
|
||||
)
|
||||
|
||||
# Install the kiwi library as well as header files to (`include/kiwi` directory)
|
||||
# so that a user can use it in their own projects that are not cmake projects.
|
||||
file(GLOB KIWI_INCLUDE_FILES "include/kiwi/*.h" "include/kiwi/*.hpp")
|
||||
set_target_properties("${PROJECT_NAME}" PROPERTIES
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION_MAJOR}
|
||||
PUBLIC_HEADER "${KIWI_INCLUDE_FILES}"
|
||||
)
|
||||
|
||||
if(KIWI_BUILD_DYNAMIC)
|
||||
add_library( "${PROJECT_NAME}" SHARED
|
||||
${CORE_SRCS}
|
||||
src/capi/kiwi_c.cpp
|
||||
${CPUINFO_OBJECTS_SHARED}
|
||||
${STREAMVBYTE_OBJECTS}
|
||||
)
|
||||
set_target_properties("${PROJECT_NAME}" PROPERTIES
|
||||
VERSION ${PROJECT_VERSION}
|
||||
SOVERSION ${PROJECT_VERSION_MAJOR}
|
||||
PUBLIC_HEADER "${KIWI_INCLUDE_FILES}"
|
||||
)
|
||||
|
||||
install(TARGETS ${PROJECT_NAME} PUBLIC_HEADER DESTINATION include/kiwi)
|
||||
target_compile_options("${PROJECT_NAME}" PRIVATE "${ADDITIONAL_FLAGS}")
|
||||
endif()
|
||||
install(TARGETS ${PROJECT_NAME}_static PUBLIC_HEADER DESTINATION include/kiwi)
|
||||
install(TARGETS ${PROJECT_NAME} PUBLIC_HEADER DESTINATION include/kiwi)
|
||||
|
||||
target_compile_options("${PROJECT_NAME}_static" PRIVATE "${ADDITIONAL_FLAGS}")
|
||||
target_compile_options("${PROJECT_NAME}" PRIVATE "${ADDITIONAL_FLAGS}")
|
||||
|
||||
#target_link_libraries("${PROJECT_NAME}_static" cpuinfo_internals)
|
||||
#target_link_libraries("${PROJECT_NAME}" cpuinfo)
|
||||
|
||||
if (KIWI_BUILD_CLI)
|
||||
add_executable( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
|
||||
tools/runner.cpp
|
||||
)
|
||||
add_executable( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
|
||||
tools/runner.cpp
|
||||
)
|
||||
|
||||
target_link_libraries( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
|
||||
"${PROJECT_NAME}_static"
|
||||
)
|
||||
endif()
|
||||
target_link_libraries( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
|
||||
"${PROJECT_NAME}_static"
|
||||
)
|
||||
|
||||
if (KIWI_BUILD_EVALUATOR)
|
||||
add_executable( "${PROJECT_NAME}-evaluator"
|
||||
tools/Evaluator.cpp
|
||||
tools/evaluator_main.cpp
|
||||
)
|
||||
add_executable( "${PROJECT_NAME}-evaluator"
|
||||
tools/Evaluator.cpp
|
||||
tools/evaluator_main.cpp
|
||||
)
|
||||
|
||||
target_link_libraries( "${PROJECT_NAME}-evaluator"
|
||||
"${PROJECT_NAME}_static"
|
||||
)
|
||||
endif()
|
||||
target_link_libraries( "${PROJECT_NAME}-evaluator"
|
||||
"${PROJECT_NAME}_static"
|
||||
)
|
||||
|
||||
if (KIWI_BUILD_MODEL_BUILDER)
|
||||
add_executable( "${PROJECT_NAME}-model-builder"
|
||||
tools/model_builder.cpp
|
||||
)
|
||||
add_executable( "${PROJECT_NAME}-model-builder"
|
||||
tools/model_builder.cpp
|
||||
)
|
||||
|
||||
target_link_libraries( "${PROJECT_NAME}-model-builder"
|
||||
"${PROJECT_NAME}_static"
|
||||
)
|
||||
endif()
|
||||
target_link_libraries( "${PROJECT_NAME}-model-builder"
|
||||
"${PROJECT_NAME}_static"
|
||||
)
|
||||
|
||||
if(MSVC)
|
||||
if(KIWI_STATIC_WITHOUT_MT)
|
||||
|
|
@ -318,42 +250,31 @@ if(MSVC)
|
|||
target_compile_options("${PROJECT_NAME}_static" PUBLIC
|
||||
/MT
|
||||
)
|
||||
target_compile_options("streamvbyte" PUBLIC
|
||||
/MT
|
||||
)
|
||||
endif()
|
||||
|
||||
if(KIWI_BUILD_DYNAMIC)
|
||||
target_compile_options("${PROJECT_NAME}" PUBLIC
|
||||
/MT
|
||||
)
|
||||
endif()
|
||||
target_compile_options("${PROJECT_NAME}" PUBLIC
|
||||
/MT
|
||||
)
|
||||
endif()
|
||||
|
||||
if(UNIX AND NOT APPLE AND NOT ANDROID)
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries( "${PROJECT_NAME}_static"
|
||||
rt
|
||||
)
|
||||
|
||||
if (KIWI_BUILD_CLI)
|
||||
target_link_libraries( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
|
||||
rt
|
||||
)
|
||||
endif()
|
||||
target_link_libraries( "${PROJECT_NAME}-cli-${PROJECT_VERSION}"
|
||||
rt
|
||||
)
|
||||
|
||||
if (KIWI_BUILD_EVALUATOR)
|
||||
target_link_libraries( "${PROJECT_NAME}-evaluator"
|
||||
rt
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(KIWI_BUILD_DYNAMIC)
|
||||
target_compile_definitions("${PROJECT_NAME}"
|
||||
PUBLIC DLL_EXPORT=1
|
||||
target_link_libraries( "${PROJECT_NAME}-evaluator"
|
||||
rt
|
||||
)
|
||||
endif()
|
||||
|
||||
target_compile_definitions("${PROJECT_NAME}"
|
||||
PUBLIC DLL_EXPORT=1
|
||||
)
|
||||
|
||||
if(KIWI_BUILD_TEST)
|
||||
add_subdirectory( third_party/googletest )
|
||||
add_subdirectory( test )
|
||||
|
|
@ -370,7 +291,3 @@ endif()
|
|||
if(KIWI_JAVA_BINDING)
|
||||
add_subdirectory( bindings/java )
|
||||
endif()
|
||||
|
||||
if(EMSCRIPTEN)
|
||||
add_subdirectory( bindings/wasm )
|
||||
endif()
|
||||
42
Kiwi.sln
42
Kiwi.sln
|
|
@ -25,12 +25,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "build_model", "vsproj\build
|
|||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kiwi_java", "vsproj\kiwi_java.vcxproj", "{EE01F0BB-014E-491B-A4BA-3DB952A541A0}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "build_cong", "vsproj\build_cong.vcxproj", "{C63940BA-24B0-452C-A618-E435888BB45C}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "diff_tokens", "vsproj\diff_tokens.vcxproj", "{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "self_label", "vsproj\self_label.vcxproj", "{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|ARM64 = Debug|ARM64
|
||||
|
|
@ -137,42 +131,6 @@ Global
|
|||
{EE01F0BB-014E-491B-A4BA-3DB952A541A0}.Release|x64.Build.0 = Release|x64
|
||||
{EE01F0BB-014E-491B-A4BA-3DB952A541A0}.Release|x86.ActiveCfg = Release|Win32
|
||||
{EE01F0BB-014E-491B-A4BA-3DB952A541A0}.Release|x86.Build.0 = Release|Win32
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Debug|x64.Build.0 = Debug|x64
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Debug|x86.Build.0 = Debug|Win32
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Release|x64.ActiveCfg = Release|x64
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Release|x64.Build.0 = Release|x64
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Release|x86.ActiveCfg = Release|Win32
|
||||
{C63940BA-24B0-452C-A618-E435888BB45C}.Release|x86.Build.0 = Release|Win32
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Debug|x64.Build.0 = Debug|x64
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Debug|x86.Build.0 = Debug|Win32
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Release|x64.ActiveCfg = Release|x64
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Release|x64.Build.0 = Release|x64
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Release|x86.ActiveCfg = Release|Win32
|
||||
{EBA7E78E-01A2-42A4-B335-97D3DEFF9882}.Release|x86.Build.0 = Release|Win32
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Debug|x64.Build.0 = Debug|x64
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Debug|x86.Build.0 = Debug|Win32
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Release|x64.ActiveCfg = Release|x64
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Release|x64.Build.0 = Release|x64
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Release|x86.ActiveCfg = Release|Win32
|
||||
{0CB53E9D-99A3-4BC9-9C32-E7BEE58910EC}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
|||
|
|
@ -19,62 +19,6 @@ V,XSV,XSA E
|
|||
^하 지$ 치)-0.1,)지-3
|
||||
^하 건대$ 컨)대-0.1,)건대-3
|
||||
|
||||
V,XSV,XSA E <충청>
|
||||
^하 어 햐,혀
|
||||
|
||||
V,XSV,XSA E <제주>
|
||||
^ᄒᆞ 어 헤,ᄒᆞ여
|
||||
|
||||
EC VV <경상>
|
||||
고 하$ 카+ha
|
||||
|
||||
VV+ha E <경상>
|
||||
카 어 캐
|
||||
|
||||
EC VV
|
||||
냐고 하$ 냐)(+ha-1
|
||||
라고 하$ 라)(+ha-1
|
||||
다고 하$ 다)(+ha-1
|
||||
자고 하$ 자)(+ha-1
|
||||
ᆫ고 하$ ᆫ과)(-1
|
||||
은고 하$ 은과)(-1
|
||||
|
||||
EC VX
|
||||
려고 하$ 려)(+ha-1
|
||||
ᆯ려고 하$ ᆯ라)(+ha-1
|
||||
가 보$ 갑-1
|
||||
|
||||
V+ha E
|
||||
냐 어 냬
|
||||
라 어 래
|
||||
다 어 대
|
||||
자 어 재
|
||||
려 어 려
|
||||
|
||||
EP E <제주>
|
||||
ᇝ 어 ᆷ(서)
|
||||
ᇝ 으 ᆷ(시)
|
||||
ᇝ 고 ᆷ(꼬)
|
||||
ᇝ 다 ᆷ(따)
|
||||
ᇝ 수 ᆷ(쑤)
|
||||
ᇝ 저 ᆷ(쩌)
|
||||
ᇝ 주 ᆷ(쭈)
|
||||
|
||||
EP E <제주>
|
||||
크 우 쿠
|
||||
크 어 켜,키)(여
|
||||
|
||||
P E <제주>
|
||||
ᆹ 으 \1)(이
|
||||
ᆺ 으 \1)(이,(시)
|
||||
ᆽ 으 \1)(이
|
||||
ᆾ 으 \1)(이
|
||||
|
||||
VV-R E <제주>
|
||||
^싯 으 시)(
|
||||
^싯 어 (셔)
|
||||
^싯 [ᆫᆸᆺᆯ나-니] 시)(\2
|
||||
|
||||
VX E
|
||||
ᆯ [ᆫᆸᆺᆯ나-니바-비사-시오] )\2 +IgnoreRCond
|
||||
ᆯ ᆷ$ ᆱ +IgnoreRCond
|
||||
|
|
@ -109,16 +53,10 @@ XSA-I E
|
|||
ᆸ 어 워,버-5
|
||||
ᆸ 으 우,브-5
|
||||
|
||||
PI E <충청>
|
||||
랍 어 라)(와
|
||||
|
||||
PR E <제주>
|
||||
ᇂ 으?([ᆨ-ᇂ]) )\3
|
||||
|
||||
NP J
|
||||
^나 [가래]$ 내)(\2
|
||||
^너 [가래]$ 네)(\2
|
||||
^저 [가래]$ 제)(\2
|
||||
^나 가$ 내)(가
|
||||
^너 가$ 네)(가
|
||||
^저 가$ 제)(가
|
||||
^나 의$ 내
|
||||
^너 의$ 네
|
||||
^저 의$ 제
|
||||
|
|
@ -231,6 +169,3 @@ EP E
|
|||
E E
|
||||
리 어 려
|
||||
시 어 셔
|
||||
|
||||
EC VX <함경>
|
||||
디 애 대,댸
|
||||
File diff suppressed because it is too large
Load diff
218963
ModelGenerator/morphemes.txt
218963
ModelGenerator/morphemes.txt
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
BIN
ModelGenerator/sj.knlm
(Stored with Git LFS)
Normal file
BIN
ModelGenerator/sj.knlm
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ModelGenerator/sj.morph
(Stored with Git LFS)
Normal file
BIN
ModelGenerator/sj.morph
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
ModelGenerator/skipbigram.mdl
(Stored with Git LFS)
Normal file
BIN
ModelGenerator/skipbigram.mdl
(Stored with Git LFS)
Normal file
Binary file not shown.
|
|
@ -15,4 +15,3 @@
|
|||
편찬 편찮/VA -5
|
||||
귀찬 귀찮/VA -5
|
||||
하찬 하찮/VA -5
|
||||
시끄러 시끄럽/VA-I + 어/EF -5
|
||||
134
README.md
134
README.md
|
|
@ -3,7 +3,7 @@
|
|||

|
||||
|
||||
x86_64:
|
||||
[](https://github.com/bab2min/Kiwi/actions)
|
||||
[](https://github.com/bab2min/Kiwi/actions)
|
||||
[](https://github.com/bab2min/Kiwi/actions)
|
||||
[](https://github.com/bab2min/Kiwi/actions)
|
||||
[](https://github.com/bab2min/Kiwi/actions)
|
||||
|
|
@ -11,7 +11,6 @@ x86_64:
|
|||
Other:
|
||||
[](https://github.com/bab2min/Kiwi/actions)
|
||||
[](https://github.com/bab2min/Kiwi/actions)
|
||||
[](https://github.com/bab2min/Kiwi/actions)
|
||||
|
||||
Kiwi는 빠른 속도와 범용적인 성능을 지향하는 한국어 형태소 분석기 라이브러리입니다. 한국어 처리에 관심 있는 사람이면 누구나 쉽게 사용할 수 있도록 오픈 소스로 공개 중이며, C++로 구현된 코어 라이브러리를 래핑하여 다양한 프로그래밍 언어에 사용할 수 있도록 준비 중입니다.
|
||||
|
||||
|
|
@ -23,28 +22,24 @@ Kiwi는 빠른 속도와 범용적인 성능을 지향하는 한국어 형태소
|
|||
|
||||

|
||||
|
||||
텍스트 분석 속도가 다른 한국어 형태소분석기들과 비교하여 꽤 빠른 편입니다. 자세한 벤치마크 결과는 [이 문서](https://docs.google.com/spreadsheets/d/1XmuYKDpV5d_WTGNgY73BJGHZ8_AUZKQXpEys819qH2Y/edit?gid=1956520937#gid=1956520937)에서 확인 가능합니다.
|
||||
텍스트 분석 속도가 다른 한국어 형태소분석기들과 비교하여 꽤 빠른 편입니다. (속도 측정은 [이 코드](https://github.com/bab2min/kiwipiepy/blob/main/evaluate.py)를 통해 수행 가능합니다. )
|
||||
|
||||

|
||||
|
||||
또한 자체적으로 경량 언어모델을 탑재하여 모호성이 있는 경우에도 제법 정확하게 형태소를 분석해냅니다. CoNg 모델에서부터는 모호성 해소 성능이 더욱 크게 향상되었습니다. (모호성 해소 성능 평가는 [이 페이지](https://github.com/bab2min/kiwipiepy/tree/main/benchmark/disambiguate)에서 수행가능합니다. )
|
||||
또한 자체적으로 경량 언어모델을 탑재하여 모호성이 있는 경우에도 제법 정확하게 형태소를 분석해냅니다. 특히 SBG모델을 사용 시 모호성 해소 성능이 크게 향상됩니다. (모호성 해소 성능 평가는 [이 페이지](https://github.com/bab2min/kiwipiepy/tree/main/benchmark/disambiguate)에서 수행가능합니다. )
|
||||
|
||||

|
||||

|
||||
|
||||
문장 분리 기능을 비롯한 다양한 편의기능을 제공합니다. (문장 분리 성능 평가는 [이 페이지](https://github.com/bab2min/kiwipiepy/tree/main/benchmark/sentence_split)에서 수행가능합니다. )
|
||||
|
||||
라이브러리 차원에서 멀티스레딩을 지원하기 때문에 대량의 텍스트를 분석해야할 경우 멀티코어를 활용하여 빠른 분석이 가능합니다.
|
||||
|
||||
## 웹 데모 페이지
|
||||
최신 버전의 Kiwi를 사용해볼 수 있는 [웹 데모 페이지](https://kiwi.bab2min.pe.kr/)를 제공하고 있습니다.
|
||||
간단하게 테스트를 해보실 경우 웹 데모 페이지를 사용하시고 대량의 텍스트 처리가 필요한 경우 아래 설명된 방법으로 Kiwi를 설치하셔서 로컬에서 구동하시는 걸 권장해드립니다.
|
||||
라이브러리 차원에서 멀티스레딩을 지원하기 때문에 대량의 텍스트를 분석해야할 경우 멀티코어를 활용하여 빠른 분석이 가능합니다. 또한 다양한 시스템에서 상황에 맞춰 선택할 수 있도록 소형/중형/대형 모델을 제공합니다.
|
||||
|
||||
## 설치
|
||||
|
||||
### C++
|
||||
|
||||
#### 컴파일된 바이너리 다운로드
|
||||
https://github.com/bab2min/Kiwi/releases 에서 Windows, Linux, macOS, Android 버전으로 컴파일된 Library 파일과 모델 파일을 다운로드 받을 수 있습니다.
|
||||
https://github.com/bab2min/Kiwi/releases 에서 Windows, Linux, macOS 버전으로 컴파일된 Library 파일과 모델 파일을 다운로드 받을 수 있습니다.
|
||||
|
||||
#### Windows
|
||||
Visual Studio 2019 이상을 사용하여 `Kiwi.sln` 파일을 실행하여 컴파일할 수 있습니다.
|
||||
|
|
@ -53,7 +48,7 @@ Visual Studio 2019 이상을 사용하여 `Kiwi.sln` 파일을 실행하여 컴
|
|||
이 레포지토리를 clone한 뒤 cmake>=3.12를 사용하여 컴파일합니다.
|
||||
모델 파일은 용량이 큰 관계로 [Git LFS](https://git-lfs.github.com/)를 통해 공유됩니다. 따라서 `git clone`에 앞서 Git LFS가 설치되어있는지 확인해주세요.
|
||||
|
||||
##### gcc >= 7 이상 혹은 기타 c++17 호환 컴파일러 사용가능 환경
|
||||
##### gcc >= 5.0 이상 혹은 다른 c++11 호환 컴파일러 사용가능 환경
|
||||
```console
|
||||
$ git clone https://github.com/bab2min/Kiwi
|
||||
$ cd Kiwi
|
||||
|
|
@ -67,9 +62,25 @@ $ make install
|
|||
$ ldconfig
|
||||
```
|
||||
|
||||
##### gcc >= 4.8, < 5.0
|
||||
Centos5와 같이 gcc 4.8까지만 지원하는 환경에서는 googletest의 버전을 1.8.x로 낮춰야 컴파일 가능합니다.
|
||||
```console
|
||||
$ git clone https://github.com/bab2min/Kiwi
|
||||
$ cd Kiwi
|
||||
$ git lfs pull
|
||||
$ git submodule sync
|
||||
$ git submodule update --init --recursive
|
||||
$ cd third_party/googletest && git checkout v1.8.x && cd ../../
|
||||
$ mkdir build && cd build
|
||||
$ cmake -DCMAKE_BUILD_TYPE=Release ../
|
||||
$ make
|
||||
$ make install
|
||||
$ ldconfig
|
||||
```
|
||||
|
||||
설치가 잘 됐는지 확인하기 위해서는 `kiwi-evaluator`를 실행해봅니다.
|
||||
```console
|
||||
$ ./kiwi-evaluator --model ../models/base ../eval_data/* --largest
|
||||
$ ./kiwi-evaluator --model ../ModelGenerator ../eval_data/* --sbg
|
||||
Loading Time : 981.745 ms
|
||||
ArchType : avx2
|
||||
LM Size : 34.1853 MB
|
||||
|
|
@ -99,7 +110,7 @@ Avg Score
|
|||
|
||||
0.13.0 버전부터 추가된 오타 교정 기능이 잘 작동하는지 확인하기 위해서는 다음과 같이 실행합니다.
|
||||
```console
|
||||
$ ./kiwi-evaluator --model ../models/base ../eval_data/* --largest --typo 6
|
||||
$ ./kiwi-evaluator --model ../ModelGenerator ../eval_data/* --sbg --typo 6
|
||||
Loading Time : 9414.45 ms
|
||||
ArchType : avx2
|
||||
LM Size : 34.1853 MB
|
||||
|
|
@ -131,12 +142,10 @@ Avg Score
|
|||
include/kiwi/capi.h 를 참조하세요.
|
||||
|
||||
#### 컴파일된 바이너리 다운로드
|
||||
https://github.com/bab2min/Kiwi/releases 에서 Windows, Linux, macOS, Android 버전으로 컴파일된 Library 파일과 모델 파일을 다운로드 받을 수 있습니다.
|
||||
https://github.com/bab2min/Kiwi/releases 에서 Windows, Linux, macOS 버전으로 컴파일된 Library 파일과 모델 파일을 다운로드 받을 수 있습니다.
|
||||
|
||||
### C# Wrapper
|
||||
https://github.com/bab2min/kiwi-gui 에서 공식 GUI 툴에 사용되는 C# Wrapper를 찾으실 수 있습니다.
|
||||
|
||||
또한 EX3님께서 기여해주신 wrapper인 [NetKiwi](https://github.com/EX3exp/NetKiwi)가 있습니다.
|
||||
https://github.com/bab2min/kiwi-gui
|
||||
|
||||
### Python3 Wrapper
|
||||
또한 Python3용 API인 Kiwipiepy가 제공됩니다. 이에 대해서는 https://github.com/bab2min/kiwipiepy 를 참조하시길 바랍니다.
|
||||
|
|
@ -144,39 +153,19 @@ https://github.com/bab2min/kiwi-gui 에서 공식 GUI 툴에 사용되는 C# Wra
|
|||
### Java Wrapper
|
||||
Java 1.8 이상에서 사용 가능한 KiwiJava가 Java binding으로 제공됩니다. 이에 대해서는 [bindings/java](bindings/java)를 참조하시길 바랍니다.
|
||||
|
||||
### Android Library
|
||||
Android NDK를 통해 Android 앱에서 사용할 수 있는 AAR 라이브러리가 제공됩니다. GitHub Releases에서 `kiwi-android-VERSION.aar` 파일을 다운로드하여 Android 프로젝트에 추가하면 됩니다.
|
||||
- **최소 요구사항**: Android API Level 21+, ARM64 아키텍처
|
||||
- **사용법**: [bindings/java](bindings/java)의 README 참조
|
||||
- **패키지**: AAR 형태로 제공되어 Gradle 프로젝트에 쉽게 통합 가능
|
||||
|
||||
### Swift Wrapper
|
||||
iOS 12.0 이상 및 macOS 10.14 이상에서 사용 가능한 Swift binding이 제공 예정입니다. 조금만 기다려주세요.
|
||||
- **최소 요구사항**: iOS 12.0+ / macOS 10.14+, Swift 5.7+
|
||||
- **사용법**: [bindings/swift](bindings/swift)의 README 참조
|
||||
- **설치**: Swift Package Manager 지원
|
||||
|
||||
### R Wrapper
|
||||
[mrchypark](https://github.com/mrchypark)님께서 기여해주신 R언어용 wrapper인 [elbird](https://mrchypark.github.io/elbird/)가 있습니다.
|
||||
[mrchypark](https://github.com/mrchypark)님께서 작업해주신 R언어용 wrapper인 [elbird](https://mrchypark.github.io/elbird/)가 있습니다.
|
||||
|
||||
### GO Wrapper
|
||||
[codingpot](https://discord.gg/rnNJBag42N) 커뮤니티가 작업해주신 go언어용 wrapper인 [kiwigo](https://github.com/codingpot/kiwigo)가 있습니다.
|
||||
|
||||
### Web Assembly (Javascript/Typescript)
|
||||
[RicBent](https://github.com/RicBent)님께서 기여해주신 Web Assembly binding이 있습니다. 이에 대해서는 [bindings/wasm](bindings/wasm)를 참조하시길 바랍니다.
|
||||
|
||||
### Rust Wrapper
|
||||
[JAICHANGPARK](https://github.com/JAICHANGPARK)님께서 개발하신 Rust용 wrapper인 [kiwi-rs](https://github.com/JAICHANGPARK/kiwi-rs)가 있습니다.
|
||||
|
||||
### Flutter Wrapper
|
||||
[JAICHANGPARK](https://github.com/JAICHANGPARK)님께서 개발하신 Rust용 wrapper인 [flutter_kiwi_nlp](https://github.com/JAICHANGPARK/flutter_kiwi_nlp)가 있습니다.
|
||||
|
||||
### 응용 프로그램
|
||||
Kiwi는 C# 기반의 GUI 형태로도 제공됩니다.
|
||||
형태소 분석기는 사용해야하지만 별도의 프로그래밍 지식이 없는 경우 이 프로그램을 사용하시면 됩니다.
|
||||
다음 프로그램은 Windows에서만 구동 가능합니다.
|
||||
https://github.com/bab2min/kiwi-gui 에서 다운받을 수 있습니다.
|
||||
|
||||
|
||||
## 업데이트 내역
|
||||
업데이트 내역은 [릴리즈 노트](//github.com/bab2min/Kiwi/releases)를 참고해주세요.
|
||||
|
||||
|
|
@ -194,8 +183,8 @@ https://github.com/bab2min/kiwi-gui 에서 다운받을 수 있습니다.
|
|||
<tr><th rowspan='5'>용언(V)</th><td>VV</td><td>동사</td></tr>
|
||||
<tr><td>VA</td><td>형용사</td></tr>
|
||||
<tr><td>VX</td><td>보조 용언</td></tr>
|
||||
<tr><td>VCP</td><td>긍정 지정사(이다)</td></tr>
|
||||
<tr><td>VCN</td><td>부정 지정사(아니다)</td></tr>
|
||||
<tr><td>VCP</td><td>긍정 지시사(이다)</td></tr>
|
||||
<tr><td>VCN</td><td>부정 지시사(아니다)</td></tr>
|
||||
<tr><th rowspan='1'>관형사</th><td>MM</td><td>관형사</td></tr>
|
||||
<tr><th rowspan='2'>부사(MA)</th><td>MAG</td><td>일반 부사</td></tr>
|
||||
<tr><td>MAJ</td><td>접속 부사</td></tr>
|
||||
|
|
@ -233,14 +222,12 @@ https://github.com/bab2min/kiwi-gui 에서 다운받을 수 있습니다.
|
|||
<tr><td>SN</td><td>숫자(0-9)</td></tr>
|
||||
<tr><td>SB</td><td>순서 있는 글머리(가. 나. 1. 2. 가) 나) 등)<sup>*</sup></td></tr>
|
||||
<tr><th rowspan='1'>분석 불능</th><td>UN</td><td>분석 불능<sup>*</sup></td></tr>
|
||||
<tr><th rowspan='6'>웹(W)</th><td>W_URL</td><td>URL 주소<sup>*</sup></td></tr>
|
||||
<tr><th rowspan='5'>웹(W)</th><td>W_URL</td><td>URL 주소<sup>*</sup></td></tr>
|
||||
<tr><td>W_EMAIL</td><td>이메일 주소<sup>*</sup></td></tr>
|
||||
<tr><td>W_HASHTAG</td><td>해시태그(#abcd)<sup>*</sup></td></tr>
|
||||
<tr><td>W_MENTION</td><td>멘션(@abcd)<sup>*</sup></td></tr>
|
||||
<tr><td>W_SERIAL</td><td>일련번호(전화번호, 통장번호, IP주소 등)<sup>*</sup></td></tr>
|
||||
<tr><td>W_EMOJI</td><td>이모지<sup>*</sup></td></tr>
|
||||
<tr><th rowspan='3'>기타</th><td>Z_CODA</td><td>덧붙은 받침<sup>*</sup></td></tr>
|
||||
<tr><td>Z_SIOT</td><td>사이시옷<sup>*</sup></td></tr>
|
||||
<tr><th rowspan='2'>기타</th><td>Z_CODA</td><td>덧붙은 받침<sup>*</sup></td></tr>
|
||||
<tr><td>USER0~4</td><td>사용자 정의 태그<sup>*</sup></td></tr>
|
||||
</table>
|
||||
|
||||
|
|
@ -251,6 +238,13 @@ https://github.com/bab2min/kiwi-gui 에서 다운받을 수 있습니다.
|
|||
|
||||
## 성능
|
||||
|
||||
<table>
|
||||
<tr><th>모델(파일 크기)</th> <th>웹</th> <th>정제된 웹</th> <th>신문기사</th> <th>문학작품</th> </tr>
|
||||
<tr><th>소형(15.9MB)</th> <td>86.85</td> <td>93.58</td> <td>89.73</td> <td>95.19</td></tr>
|
||||
<tr><th>중형(39.9MB)</th> <td>87.09</td> <td>94.12</td> <td>91.23</td> <td>96.73</td></tr>
|
||||
<tr><th>대형(90.4MB)</th> <td>86.99</td> <td>93.47</td> <td>92.37</td> <td>97.68</td></tr>
|
||||
</table>
|
||||
|
||||
**결과 예시**
|
||||
```text
|
||||
프랑스의 세계적인 의상 디자이너 엠마누엘 웅가로가 실내 장식용 직물 디자이너로 나섰다.
|
||||
|
|
@ -286,37 +280,19 @@ Kiwi는 LGPL v3 라이센스로 배포됩니다.
|
|||
|
||||
## 인용하기
|
||||
DOI 혹은 아래의 BibTex를 이용해 인용해주세요.
|
||||
[](https://doi.org/10.23287/KJDH.2024.1.1.6)
|
||||
```text
|
||||
@article{43508,
|
||||
title = {Kiwi: 통계적 언어 모델과 Skip-Bigram을 이용한 한국어 형태소 분석기 구현},
|
||||
journal = {디지털인문학},
|
||||
volume = {1},
|
||||
number = {1},
|
||||
page = {109-136},
|
||||
year = {2024},
|
||||
issn = {3058-311X},
|
||||
doi = {https://doi.org/10.23287/KJDH.2024.1.1.6},
|
||||
url = {https://kjdh/v.1/1/109/43508},
|
||||
author = {민철 이},
|
||||
keywords = {한국어, 자연어처리, 형태소 분석기, 모호성 해소, 언어 모델},
|
||||
abstract = {한국어 형태소 분석 시 모델이 마주하는 어려움 중 하나는 모호성이다. 이는 한국어에서 기저형이 전혀 다른 형태소 조합이 동일한 표면형을 가질 수 있기 때문에 발생하며 이를 바르게 분석하기 위해서는 문맥을 고려하는 능력이 모델에게 필수적이다. 형태소 분석기 Kiwi는 이를 해결하기 위해 근거리 맥락을 고려하는 통계적 언어 모델과 원거리 맥락을 고려하는 Skip-Bigram 모델을 조합하는 방식을 제안한다. 제안된 방식은 모호성 해소에서 평균 정확도 86.7%를 달성하여 평균 50~70%에 머무르는 기존의 오픈소스 형태소 분석기, 특히 딥러닝 기반의 분석기들보다도 앞서는 결과를 보였다. 또한 최적화된 경량 모델을 사용한 덕분에 타 분석기보다 빠른 속도를 보여 대량의 텍스트를 분석하는 데에도 유용하게 쓰일 수 있다. 오픈소스로 공개된 Kiwi는 전술한 특징들 덕분에 텍스트 마이닝, 자연어처리, 인문학 등 다양한 분야에서 널리 사용되고 있다. 본 연구는 형태소 분석의 정확도와 효율성을 모두 개선했으나, 미등록어 처리와 한국어 방언 분석 등의 과제에서 한계를 보여 이에 대한 추가 보완이 필요하다.},
|
||||
}
|
||||
```
|
||||
```text
|
||||
@article{43508,
|
||||
title = {Kiwi: Developing a Korean Morphological Analyzer Based on Statistical Language Models and Skip-Bigram},
|
||||
journal = {Korean Journal of Digital Humanities},
|
||||
volume = {1},
|
||||
number = {1},
|
||||
page = {109-136},
|
||||
year = {2024},
|
||||
issn = {3058-311X},
|
||||
doi = {https://doi.org/10.23287/KJDH.2024.1.1.6},
|
||||
url = {https://kjdh/v.1/1/109/43508},
|
||||
author = {Min-chul Lee},
|
||||
keywords = {한국어, 자연어처리, 형태소 분석기, 모호성 해소, 언어 모델},
|
||||
abstract = {One of the challenges faced by models in Korean morphological analysis is ambiguity. This arises because different combinations of morphemes with completely different base forms can share the same surface form in Korean, necessitating the model's ability to consider context for accurate analysis. The morphological analyzer Kiwi addresses this issue by proposing a combination of a statistical language model that considers local context and a Skip-Bigram model that considers global context. This proposed method achieved an average accuracy of 86.7% in resolving ambiguities, outperforming existing open-source morphological analyzers, particularly deep learning-based ones, which typically achieve between 50-70%. Additionally, thanks to the optimized lightweight model, Kiwi shows faster speeds compared to other analyzers, making it useful for analyzing large volumes of text. Kiwi, released as open source, is widely used in various fields such as text mining, natural language processing, and the humanities due to these features. Although this study improved both the accuracy and efficiency of morphological analysis, it shows limitations in handling out-of-vocabulary problem and analyzing Korean dialects, necessitating further improvements in these areas.},
|
||||
}
|
||||
```
|
||||
[](https://doi.org/10.5281/zenodo.7041425)
|
||||
|
||||
```text
|
||||
@software{minchul_lee_2022_7041425,
|
||||
author = {Minchul Lee},
|
||||
title = {Kiwi, Korean Intelligent Word Identifier},
|
||||
month = sep,
|
||||
year = 2022,
|
||||
publisher = {Zenodo},
|
||||
version = {v0.14.0},
|
||||
doi = {10.5281/zenodo.7041425},
|
||||
publisher = {GitHub},
|
||||
journal = {GitHub repository},
|
||||
howpublished = {\url{https://github.com/bab2min/Kiwi}}
|
||||
}
|
||||
```
|
||||
|
|
|
|||
31
bindings/java/.gitignore
vendored
31
bindings/java/.gitignore
vendored
|
|
@ -1,31 +0,0 @@
|
|||
# Gradle
|
||||
.gradle/
|
||||
build/
|
||||
gradle-app.setting
|
||||
!gradle-wrapper.jar
|
||||
!gradle-wrapper.properties
|
||||
|
||||
# Android
|
||||
local.properties
|
||||
*.iml
|
||||
.idea/
|
||||
captures/
|
||||
.externalNativeBuild/
|
||||
.cxx/
|
||||
*.apk
|
||||
*.ap_
|
||||
*.dex
|
||||
*.class
|
||||
|
||||
# Generated files
|
||||
bin/
|
||||
gen/
|
||||
out/
|
||||
|
||||
# Keystore files
|
||||
*.jks
|
||||
*.keystore
|
||||
|
||||
# Native
|
||||
*.o
|
||||
*.so
|
||||
|
|
@ -1,65 +1,42 @@
|
|||
if(NOT ANDROID)
|
||||
find_package (Java REQUIRED)
|
||||
find_package (JNI REQUIRED)
|
||||
include (UseJava)
|
||||
find_package (Java REQUIRED)
|
||||
find_package (JNI REQUIRED)
|
||||
include (UseJava)
|
||||
|
||||
include_directories (
|
||||
${JNI_INCLUDE_DIRS}
|
||||
)
|
||||
set(CMAKE_JAVA_COMPILE_FLAGS -source 8 -target 8 -encoding utf-8)
|
||||
endif()
|
||||
|
||||
set(pkg_name "KiwiJava")
|
||||
if(ANDROID)
|
||||
set(OBJECTS $<TARGET_OBJECTS:${PROJECT_NAME}_static> $<TARGET_OBJECTS:streamvbyte>)
|
||||
else()
|
||||
set(OBJECTS $<TARGET_OBJECTS:${PROJECT_NAME}> $<TARGET_OBJECTS:streamvbyte>)
|
||||
endif()
|
||||
|
||||
if(KIWI_USE_CPUINFO)
|
||||
list(APPEND OBJECTS $<TARGET_OBJECTS:cpuinfo>)
|
||||
endif()
|
||||
|
||||
add_library (${pkg_name} SHARED csrc/kiwi_java.cpp
|
||||
${OBJECTS}
|
||||
include_directories (
|
||||
${JNI_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
if(ANDROID)
|
||||
target_compile_features(${pkg_name} PUBLIC cxx_std_17)
|
||||
|
||||
# Add compile definitions and flags
|
||||
target_compile_definitions(${pkg_name} PRIVATE
|
||||
ANDROID=1
|
||||
set(CMAKE_JAVA_COMPILE_FLAGS -source 8 -target 8 -encoding utf-8)
|
||||
set(pkg_name "KiwiJava-${PROJECT_VERSION}")
|
||||
add_library (${pkg_name} SHARED kiwi_java.cpp
|
||||
$<TARGET_OBJECTS:${PROJECT_NAME}>
|
||||
$<TARGET_OBJECTS:clog>
|
||||
$<TARGET_OBJECTS:cpuinfo>
|
||||
)
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries( ${pkg_name}
|
||||
${JAVA_JVM_LIBRARY}
|
||||
rt
|
||||
)
|
||||
|
||||
target_compile_options(${pkg_name} PRIVATE -O3)
|
||||
else()
|
||||
if(UNIX AND NOT APPLE)
|
||||
target_link_libraries( ${pkg_name}
|
||||
${JAVA_JVM_LIBRARY}
|
||||
rt
|
||||
)
|
||||
else()
|
||||
target_link_libraries (${pkg_name} ${JAVA_JVM_LIBRARY})
|
||||
endif()
|
||||
target_compile_features(${pkg_name} PUBLIC cxx_std_17)
|
||||
if(MSVC)
|
||||
target_compile_options(${pkg_name} PUBLIC
|
||||
/MT
|
||||
)
|
||||
endif()
|
||||
add_jar (${PROJECT_NAME}-java-${PROJECT_VERSION} src/kr/pe/bab2min/Kiwi.java src/kr/pe/bab2min/KiwiBuilder.java ENTRY_POINT kr.pe.bab2min.Kiwi)
|
||||
target_link_libraries (${pkg_name} ${JAVA_JVM_LIBRARY})
|
||||
endif()
|
||||
target_compile_features(${pkg_name} PUBLIC cxx_std_17)
|
||||
if(MSVC)
|
||||
target_compile_options(${pkg_name} PUBLIC
|
||||
/MT
|
||||
)
|
||||
endif()
|
||||
add_jar (${PROJECT_NAME}-java-${PROJECT_VERSION} kr/pe/bab2min/Kiwi.java kr/pe/bab2min/KiwiBuilder.java ENTRY_POINT kr.pe.bab2min.Kiwi)
|
||||
|
||||
if(MSVC)
|
||||
add_custom_command(TARGET ${PROJECT_NAME}-java-${PROJECT_VERSION} POST_BUILD
|
||||
COMMAND mv $<TARGET_FILE:${pkg_name}> $<TARGET_FILE_NAME:${pkg_name}>
|
||||
COMMAND jar uf ${PROJECT_NAME}-java-${PROJECT_VERSION}.jar $<TARGET_FILE_NAME:${pkg_name}>
|
||||
DEPENDS ${PROJECT_NAME}-java-${PROJECT_VERSION}
|
||||
)
|
||||
else()
|
||||
add_custom_command(TARGET ${PROJECT_NAME}-java-${PROJECT_VERSION} POST_BUILD
|
||||
COMMAND jar uf ${PROJECT_NAME}-java-${PROJECT_VERSION}.jar $<TARGET_FILE_NAME:${pkg_name}>
|
||||
DEPENDS ${PROJECT_NAME}-java-${PROJECT_VERSION}
|
||||
)
|
||||
endif()
|
||||
if(MSVC)
|
||||
add_custom_command(TARGET ${PROJECT_NAME}-java-${PROJECT_VERSION} POST_BUILD
|
||||
COMMAND mv $<TARGET_FILE:${pkg_name}> $<TARGET_FILE_NAME:${pkg_name}>
|
||||
COMMAND jar uf ${PROJECT_NAME}-java-${PROJECT_VERSION}.jar $<TARGET_FILE_NAME:${pkg_name}>
|
||||
DEPENDS ${PROJECT_NAME}-java-${PROJECT_VERSION}
|
||||
)
|
||||
else()
|
||||
add_custom_command(TARGET ${PROJECT_NAME}-java-${PROJECT_VERSION} POST_BUILD
|
||||
COMMAND jar uf ${PROJECT_NAME}-java-${PROJECT_VERSION}.jar $<TARGET_FILE_NAME:${pkg_name}>
|
||||
DEPENDS ${PROJECT_NAME}-java-${PROJECT_VERSION}
|
||||
)
|
||||
endif()
|
||||
|
|
@ -6,7 +6,6 @@
|
|||
#include <vector>
|
||||
#include <optional>
|
||||
#include <iostream>
|
||||
#include <cstdint>
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
|
|
@ -67,22 +66,16 @@ namespace jni
|
|||
};
|
||||
|
||||
template<class Ty>
|
||||
class JPureObject
|
||||
class JObject
|
||||
{
|
||||
public:
|
||||
static jclass jClass;
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
class JObject : public JPureObject<Ty>
|
||||
{
|
||||
public:
|
||||
static jfieldID jInstField;
|
||||
static jmethodID jInitMethod;
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
jclass JPureObject<Ty>::jClass = nullptr;
|
||||
jclass JObject<Ty>::jClass = nullptr;
|
||||
|
||||
template<class Ty>
|
||||
jfieldID JObject<Ty>::jInstField = nullptr;
|
||||
|
|
@ -94,10 +87,11 @@ namespace jni
|
|||
class JRef
|
||||
{
|
||||
protected:
|
||||
JNIEnv* env;
|
||||
jobject inst;
|
||||
public:
|
||||
JRef(jobject _inst = nullptr)
|
||||
: inst{_inst}
|
||||
JRef(JNIEnv* _env = nullptr, jobject _inst = nullptr)
|
||||
: env{ _env }, inst{ _inst }
|
||||
{}
|
||||
|
||||
JRef(const JRef&) = default;
|
||||
|
|
@ -121,8 +115,6 @@ namespace jni
|
|||
}
|
||||
};
|
||||
|
||||
static thread_local JNIEnv* threadLocalEnv = nullptr;
|
||||
|
||||
template<class Ty>
|
||||
class JUniqueGlobalRef : public JRef<Ty>
|
||||
{
|
||||
|
|
@ -133,47 +125,30 @@ namespace jni
|
|||
JUniqueGlobalRef(JRef<Ty> ref)
|
||||
: JRef<Ty>{ ref }
|
||||
{
|
||||
this->inst = threadLocalEnv->NewGlobalRef(this->inst);
|
||||
}
|
||||
|
||||
JUniqueGlobalRef(const JUniqueGlobalRef& ref)
|
||||
: JRef<Ty>{ ref }
|
||||
{
|
||||
this->inst = threadLocalEnv->NewGlobalRef(this->inst);
|
||||
this->inst = this->env->NewGlobalRef(this->inst);
|
||||
}
|
||||
|
||||
JUniqueGlobalRef(const JUniqueGlobalRef&) = delete;
|
||||
JUniqueGlobalRef(JUniqueGlobalRef&& o)
|
||||
{
|
||||
std::swap(this->env, o.env);
|
||||
std::swap(this->inst, o.inst);
|
||||
}
|
||||
|
||||
JUniqueGlobalRef& operator=(const JUniqueGlobalRef& o)
|
||||
{
|
||||
if (this != &o)
|
||||
{
|
||||
close(threadLocalEnv);
|
||||
this->inst = threadLocalEnv->NewGlobalRef(o.inst);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
JUniqueGlobalRef& operator=(const JUniqueGlobalRef&) = delete;
|
||||
JUniqueGlobalRef& operator=(JUniqueGlobalRef&& o)
|
||||
{
|
||||
std::swap(this->env, o.env);
|
||||
std::swap(this->inst, o.inst);
|
||||
return *this;
|
||||
}
|
||||
|
||||
~JUniqueGlobalRef()
|
||||
{
|
||||
close(threadLocalEnv);
|
||||
}
|
||||
|
||||
private:
|
||||
void close(JNIEnv* env)
|
||||
{
|
||||
if (this->inst)
|
||||
if (this->env && this->inst)
|
||||
{
|
||||
env->DeleteGlobalRef(this->inst);
|
||||
this->env->DeleteGlobalRef(this->inst);
|
||||
this->env = nullptr;
|
||||
this->inst = nullptr;
|
||||
}
|
||||
}
|
||||
|
|
@ -186,8 +161,8 @@ namespace jni
|
|||
static inline jmethodID jHasNext;
|
||||
static inline jmethodID jNext;
|
||||
|
||||
JIteratorBase(jobject _inst)
|
||||
: JUniqueGlobalRef{ JRef{ _inst } }
|
||||
JIteratorBase(JNIEnv* _env, jobject _inst)
|
||||
: JUniqueGlobalRef{ JRef{ _env, _inst } }
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
@ -230,18 +205,6 @@ namespace jni
|
|||
using CppType = void;
|
||||
using JniType = void;
|
||||
static constexpr auto typeStr = "V"sv;
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
env->CallVoidMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -260,19 +223,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallByteMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -291,19 +241,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallByteMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -322,19 +259,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallShortMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -353,19 +277,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallShortMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -384,19 +295,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallIntMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -415,19 +313,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallIntMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef _JNI_INT64_TO_INT
|
||||
|
|
@ -447,19 +332,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallIntMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -478,19 +350,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallIntMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
|
@ -510,19 +369,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallIntMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -541,19 +387,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallIntMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
#else
|
||||
|
|
@ -573,19 +406,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallLongMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -604,19 +424,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallLongMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
#ifdef __APPLE__
|
||||
template<>
|
||||
|
|
@ -635,19 +442,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallLongMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -666,19 +460,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallLongMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -699,19 +480,6 @@ namespace jni
|
|||
{
|
||||
return v ? -1 : 0;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallBooleanMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return !!ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -730,19 +498,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallCharMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -761,19 +516,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallFloatMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -792,19 +534,6 @@ namespace jni
|
|||
{
|
||||
return v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = env->CallDoubleMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -834,19 +563,6 @@ namespace jni
|
|||
{
|
||||
return env->NewStringUTF(v.c_str());
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -876,19 +592,6 @@ namespace jni
|
|||
{
|
||||
return env->NewString((const jchar*)v.data(), v.size());
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -918,19 +621,6 @@ namespace jni
|
|||
if (!ret) throw std::runtime_error{ std::string{ jclassName<Ty> } + ": failed to construct object." };
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType& callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -958,19 +648,6 @@ namespace jni
|
|||
if (!ret) throw std::runtime_error{ std::string{ jclassName<Ty> } + ": failed to construct object." };
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -988,23 +665,10 @@ namespace jni
|
|||
if (!ptr) throw std::runtime_error{ "Object is already closed or not initialized." };
|
||||
return ptr;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
struct ValueBuilder<JRef<Ty>, std::enable_if_t<std::is_base_of_v<JPureObject<Ty>, Ty>>>
|
||||
struct ValueBuilder<JRef<Ty>, std::enable_if_t<std::is_base_of_v<JObject<Ty>, Ty>>>
|
||||
{
|
||||
using CppType = JRef<Ty>;
|
||||
using JniType = jobject;
|
||||
|
|
@ -1012,26 +676,13 @@ namespace jni
|
|||
|
||||
CppType fromJava(JNIEnv* env, JniType v)
|
||||
{
|
||||
return CppType{ v };
|
||||
return CppType{ env, v };
|
||||
}
|
||||
|
||||
JniType toJava(JNIEnv* env, CppType&& v)
|
||||
{
|
||||
return (jobject)v;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -1068,19 +719,6 @@ namespace jni
|
|||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -1115,19 +753,6 @@ namespace jni
|
|||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -1208,19 +833,6 @@ namespace jni
|
|||
return arr;
|
||||
}
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -1250,19 +862,6 @@ namespace jni
|
|||
std::copy(v.begin(), v.end(), ptr);
|
||||
return arr;
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -1310,19 +909,6 @@ namespace jni
|
|||
return arr;
|
||||
}
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -1336,57 +922,36 @@ namespace jni
|
|||
{
|
||||
if (!v)
|
||||
{
|
||||
return CppType{ v };
|
||||
return CppType{ env, v };
|
||||
}
|
||||
// The following line crashes clang compiler. I don't know why, but it's not necessary. So I commented it out.
|
||||
if (!env->IsInstanceOf(v, JIteratorBase::jClass)) throw std::runtime_error{ ""/*StringConcat_v<svNotInstanceOf, typeStr, svNullTerm>.data()*/};
|
||||
return CppType{ v };
|
||||
}
|
||||
|
||||
template<class ... Args>
|
||||
CppType callMethod(JNIEnv* env, jobject obj, jmethodID methodID, Args&&... args)
|
||||
{
|
||||
auto ret = (JniType)env->CallObjectMethod(obj, methodID, std::forward<Args>(args)...);
|
||||
if (env->ExceptionCheck())
|
||||
{
|
||||
env->ExceptionDescribe();
|
||||
env->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return fromJava(env, ret);
|
||||
if (!env->IsInstanceOf(v, JIteratorBase::jClass)) throw std::runtime_error{ StringConcat_v<svNotInstanceOf, typeStr, svNullTerm>.data()};
|
||||
return CppType{ env, v };
|
||||
}
|
||||
};
|
||||
|
||||
template<class Ty>
|
||||
bool JIterator<Ty>::hasNext()
|
||||
{
|
||||
return ValueBuilder<bool>{}.callMethod(threadLocalEnv, inst, jHasNext);
|
||||
return env->CallBooleanMethod(inst, jHasNext);
|
||||
}
|
||||
|
||||
template<class Ty>
|
||||
Ty JIterator<Ty>::next()
|
||||
{
|
||||
// Iterator::next() always returns Object, so we need to use CallObjectMethod
|
||||
auto ret = threadLocalEnv->CallObjectMethod(inst, jNext);
|
||||
if (threadLocalEnv->ExceptionCheck())
|
||||
{
|
||||
threadLocalEnv->ExceptionDescribe();
|
||||
threadLocalEnv->ExceptionClear();
|
||||
throw std::runtime_error{ "Java exception occurred." };
|
||||
}
|
||||
return ValueBuilder<Ty>{}.fromJava(threadLocalEnv, ret);
|
||||
auto ret = env->CallObjectMethod(inst, jNext);
|
||||
return ValueBuilder<Ty>{}.fromJava(env, ret);
|
||||
}
|
||||
|
||||
template<class Ty>
|
||||
Ty& JRef<Ty>::get()
|
||||
{
|
||||
return ValueBuilder<Ty>{}.fromJava(threadLocalEnv, inst);
|
||||
return ValueBuilder<Ty>{}.fromJava(env, inst);
|
||||
}
|
||||
|
||||
template<class Ty>
|
||||
const Ty& JRef<Ty>::get() const
|
||||
{
|
||||
return ValueBuilder<Ty>{}.fromJava(threadLocalEnv, inst);
|
||||
return ValueBuilder<Ty>{}.fromJava(env, inst);
|
||||
}
|
||||
|
||||
template<class Ty>
|
||||
|
|
@ -1469,7 +1034,6 @@ namespace jni
|
|||
{
|
||||
return handleExc(env, [&]() -> ToJniType<R>
|
||||
{
|
||||
threadLocalEnv = env;
|
||||
if constexpr (std::is_same_v<R, void>)
|
||||
{
|
||||
(*func)(ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
|
|
@ -1512,7 +1076,6 @@ namespace jni
|
|||
{
|
||||
return handleExc(env, [&]() -> ToJniType<R>
|
||||
{
|
||||
threadLocalEnv = env;
|
||||
auto ptr = (ClassType*)env->GetLongField(obj, JObject<ClassType>::jInstField);
|
||||
if (!ptr) throw std::runtime_error{ "Object is already closed or not initialized." };
|
||||
|
||||
|
|
@ -1558,7 +1121,6 @@ namespace jni
|
|||
{
|
||||
return handleExc(env, [&]() -> ToJniType<R>
|
||||
{
|
||||
threadLocalEnv = env;
|
||||
auto ptr = (ClassType*)env->GetLongField(obj, JObject<ClassType>::jInstField);
|
||||
if (!ptr) throw std::runtime_error{ "Object is already closed or not initialized." };
|
||||
|
||||
|
|
@ -1601,7 +1163,6 @@ namespace jni
|
|||
{
|
||||
return handleExc(env, [&]() -> ToJniType<R>
|
||||
{
|
||||
threadLocalEnv = env;
|
||||
if constexpr (std::is_same_v<R, void>)
|
||||
{
|
||||
(*func)(obj, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
|
|
@ -1644,17 +1205,16 @@ namespace jni
|
|||
{
|
||||
return handleExc(env, [&]() -> ToJniType<R>
|
||||
{
|
||||
threadLocalEnv = env;
|
||||
auto ptr = (ClassType*)env->GetLongField(obj, JObject<ClassType>::jInstField);
|
||||
if (!ptr) throw std::runtime_error{ "Object is already closed or not initialized." };
|
||||
|
||||
if constexpr (std::is_same_v<R, void>)
|
||||
{
|
||||
(ptr->*func)(JRef<C>{obj}, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
(ptr->*func)(JRef<C>{env, obj}, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
}
|
||||
else
|
||||
{
|
||||
auto ret = (ptr->*func)(JRef<C>{obj}, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
auto ret = (ptr->*func)(JRef<C>{env, obj}, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
return ValueBuilder<R>{}.toJava(env, std::move(ret));
|
||||
}
|
||||
});
|
||||
|
|
@ -1690,17 +1250,16 @@ namespace jni
|
|||
{
|
||||
return handleExc(env, [&]() -> ToJniType<R>
|
||||
{
|
||||
threadLocalEnv = env;
|
||||
auto ptr = (ClassType*)env->GetLongField(obj, JObject<ClassType>::jInstField);
|
||||
if (!ptr) throw std::runtime_error{ "Object is already closed or not initialized." };
|
||||
|
||||
if constexpr (std::is_same_v<R, void>)
|
||||
{
|
||||
(ptr->*func)(JRef<C>{obj}, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
(ptr->*func)(JRef<C>{env, obj}, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
}
|
||||
else
|
||||
{
|
||||
auto ret = (ptr->*func)(JRef<C>{obj}, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
auto ret = (ptr->*func)(JRef<C>{env, obj}, ValueBuilder<remove_cvref_t<Ts>>{}.fromJava(env, args)...);
|
||||
return ValueBuilder<R>{}.toJava(env, std::move(ret));
|
||||
}
|
||||
});
|
||||
|
|
@ -1778,7 +1337,6 @@ namespace jni
|
|||
{
|
||||
return handleExc(env, [&]()
|
||||
{
|
||||
threadLocalEnv = env;
|
||||
auto ptr = new Ty(ValueBuilder<Args>{}.fromJava(env, args)...);
|
||||
env->SetLongField(obj, JObject<Ty>::jInstField, (jlong)ptr);
|
||||
return;
|
||||
|
|
@ -1801,7 +1359,6 @@ namespace jni
|
|||
auto ptr = (Ty*)env->GetLongField(obj, JObject<Ty>::jInstField);
|
||||
if (ptr)
|
||||
{
|
||||
threadLocalEnv = env;
|
||||
delete ptr;
|
||||
env->SetLongField(obj, JObject<Ty>::jInstField, 0);
|
||||
}
|
||||
|
|
@ -1831,7 +1388,7 @@ namespace jni
|
|||
std::vector<const char*> methodNames;
|
||||
|
||||
using Class = Ty;
|
||||
static_assert(std::is_base_of_v<JPureObject<Class>, Class>, "Only JObject has its ClassDefinition.");
|
||||
static_assert(std::is_base_of_v<JObject<Class>, Class>, "Only JObject has its ClassDefinition.");
|
||||
|
||||
inline static std::array<JNINativeMethod, sizeof...(methods)> methodDefs{ ((JNINativeMethod)methods)... };
|
||||
|
||||
|
|
@ -2069,41 +1626,38 @@ namespace jni
|
|||
|
||||
if constexpr (IsClassDefinition<DefTy>::value)
|
||||
{
|
||||
auto cls = JPureObject<typename DefTy::Class>::jClass
|
||||
auto cls = JObject<typename DefTy::Class>::jClass
|
||||
= (jclass)env->NewGlobalRef(env->FindClass(jclassName<typename DefTy::Class>.data()));
|
||||
if (!cls) return false;
|
||||
|
||||
if constexpr (std::is_base_of_v<JObject<typename DefTy::Class>, typename DefTy::Class>)
|
||||
JObject<typename DefTy::Class>::jInstField = env->GetFieldID(cls, "_inst", "J");
|
||||
if (!JObject<typename DefTy::Class>::jInstField)
|
||||
{
|
||||
JObject<typename DefTy::Class>::jInstField = env->GetFieldID(cls, "_inst", "J");
|
||||
if (!JObject<typename DefTy::Class>::jInstField)
|
||||
{
|
||||
std::cerr << jclassName<typename DefTy::Class> << " has no `_inst` field." << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
JObject<typename DefTy::Class>::jInitMethod = env->GetMethodID(cls, "<init>", "(J)V");
|
||||
if (!JObject<typename DefTy::Class>::jInitMethod)
|
||||
{
|
||||
std::cerr << jclassName<typename DefTy::Class> << " has no constructor with a long argument" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
auto defs = (JNINativeMethod*)def.methodDefs.data();
|
||||
auto size = def.methodDefs.size();
|
||||
|
||||
size_t m = 0;
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
{
|
||||
if (!defs[i].name)
|
||||
{
|
||||
defs[i].name = (char*)def.methodNames[m++];
|
||||
}
|
||||
}
|
||||
|
||||
if (env->RegisterNatives(cls, defs, size) != JNI_OK) return false;
|
||||
std::cerr << jclassName<typename DefTy::Class> << " has no `_inst` field." << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
JObject<typename DefTy::Class>::jInitMethod = env->GetMethodID(cls, "<init>", "(J)V");
|
||||
if (!JObject<typename DefTy::Class>::jInitMethod)
|
||||
{
|
||||
std::cerr << jclassName<typename DefTy::Class> << " has no constructor with a long argument" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
auto defs = (JNINativeMethod*)def.methodDefs.data();
|
||||
auto size = def.methodDefs.size();
|
||||
|
||||
size_t m = 0;
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
{
|
||||
if (!defs[i].name)
|
||||
{
|
||||
defs[i].name = (char*)def.methodNames[m++];
|
||||
}
|
||||
}
|
||||
|
||||
if (env->RegisterNatives(cls, defs, size) != JNI_OK) return false;
|
||||
|
||||
addedClasses.emplace_back(jclassName<typename DefTy::Class>.data());
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
# KiwiJava, 한국어 형태소 분석기 Kiwi의 Java 바인딩
|
||||
Kiwi v0.16.0에서부터는 자체적으로 Kiwi의 Java 바인딩인 KiwiJava를 제공합니다. KiwiJava는 [최신 Release](https://github.com/bab2min/Kiwi/releases/)에서 `kiwi-java-*.jar`라는 이름으로 제공됩니다.
|
||||
jar 파일 내부에 OS에 종속적인 바이너리가 포함되어 있으므로 JVM이 구동되는 가상머신의 환경(win(Windows), lnx(Linux), mac(macOS))에 맞춰서 적합한 jar파일을 받아야 합니다.
|
||||
jar 파일 내부에 OS 종속적인 바이너리가 포함되어 있는 관계로 JVM이 구동되는 가상머신의 환경(win(Windows), lnx(Linux), mac(macOS))에 맞춰서 적합한 jar파일을 받아야 합니다.
|
||||
|
||||
* KiwiJava는 Java 1.8 이상과 호환됩니다.
|
||||
|
||||
|
|
@ -11,18 +11,18 @@ KiwiJava의 jar 파일은 자체적으로 실행 가능한 main함수를 가지
|
|||
# Linux x86-64 환경을 가정
|
||||
|
||||
# 모델 파일 다운로드
|
||||
$ wget https://github.com/bab2min/Kiwi/releases/download/v0.19.0/kiwi_model_v0.19.0_base.tgz
|
||||
$ tar -zxvf kiwi_model_v0.19.0_base.tgz # 압축 해제. 모델을 포함한 models/base라는 폴더가 생성됨
|
||||
$ wget https://github.com/bab2min/Kiwi/releases/download/v0.16.0/kiwi_model_v0.16.0_base.tgz
|
||||
$ tar -zxvf kiwi_model_v0.16.0_base.tgz # 압축 해제. 모델을 포함한 ModelGenerator라는 폴더가 생성됨
|
||||
|
||||
# KiwiJava 다운로드
|
||||
$ wget https://github.com/bab2min/Kiwi/releases/download/v0.19.0/kiwi-java-v0.19.0-lnx-x86-64.jar
|
||||
$ wget https://github.com/bab2min/Kiwi/releases/download/v0.16.1/kiwi-java-v0.16.1-lnx-x86-64.jar
|
||||
|
||||
# 모델 파일은 Patch가 다르더라도 Major, Minor 버전이 동일하면 호환됩니다.
|
||||
# 즉, kiwi_model_v0.19.0은 kiwi-java-v0.19.* 전부에서 사용가능합니다.
|
||||
# 즉, kiwi_model_v0.16.0은 kiwi-java-v0.16.* 전부에서 사용가능합니다.
|
||||
|
||||
# jar 구동. 구동 인자로 모델 경로를 입력해주어야 함
|
||||
$ java -jar kiwi-java-v0.19.0-lnx-x86-64.jar models/base/
|
||||
Kiwi 0.19.0 is loaded!
|
||||
$ java -jar kiwi-java-v0.16.1-lnx-x86-64.jar ModelGenerator/
|
||||
Kiwi 0.16.1 is loaded!
|
||||
>> 안녕하세요?
|
||||
[Token(form=안녕, tag=NNG, position=0, length=2),
|
||||
Token(form=하, tag=XSA, position=2, length=1),
|
||||
|
|
@ -90,94 +90,4 @@ public class KiwiExample {
|
|||
|
||||
```
|
||||
|
||||
자세한 예시는 [src/kr/pe/bab2min/](src/kr/pe/bab2min/) 내의 Kiwi.java, KiwiBuilder.java 및 [test/](test/) 내의 KiwiTest.java 파일을 참조해주세요.
|
||||
|
||||
## Android에서 사용하기
|
||||
|
||||
### 1. AAR 파일 사용
|
||||
|
||||
GitHub Releases에서 `kiwi-android-VERSION.aar` 파일을 다운로드하고 프로젝트에 추가:
|
||||
|
||||
1. 다운로드한 AAR 파일을 `app/libs/` 폴더에 복사
|
||||
2. `app/build.gradle`에 다음 추가:
|
||||
|
||||
```gradle
|
||||
android {
|
||||
...
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation files('libs/kiwi-android-VERSION.aar')
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 소스에서 빌드
|
||||
|
||||
이 디렉토리에서 직접 빌드할 수도 있습니다:
|
||||
|
||||
```bash
|
||||
cd bindings/java
|
||||
./gradlew assembleRelease
|
||||
```
|
||||
|
||||
빌드된 AAR 파일은 `build/outputs/aar/` 디렉토리에 생성됩니다.
|
||||
|
||||
## 사용 방법
|
||||
```kotlin
|
||||
package example
|
||||
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import androidx.activity.ComponentActivity
|
||||
|
||||
import kr.pe.bab2min.Kiwi
|
||||
import kr.pe.bab2min.KiwiBuilder
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
try {
|
||||
// 모델 파일을 assets 내의 kiwi_model/ 폴더에 넣었다고 가정
|
||||
val streamProvider = KiwiBuilder.StreamProvider { filename ->
|
||||
try {
|
||||
// assets 내의 kiwi_model/ 폴더 내의 파일을 연다.
|
||||
assets.open("kiwi_model/$filename")
|
||||
} catch (e: Exception) {
|
||||
null // 파일이 없으면 null 반환
|
||||
}
|
||||
}
|
||||
|
||||
val kiwi = KiwiBuilder(streamProvider).build()
|
||||
val res = kiwi.tokenize("안드로이드에서도 Kiwi를!", Kiwi.Match.allWithNormalizing)
|
||||
for (token in res) {
|
||||
Log.d("Kiwi", "${token.form} / ${Kiwi.POSTag.toString(token.tag)}")
|
||||
}
|
||||
/* 다음과 같이 출력됨
|
||||
안드로이드 / NNG
|
||||
에서 / JKB
|
||||
도 / JX
|
||||
Kiwi / SL
|
||||
를 / JKO
|
||||
! / SF
|
||||
*/
|
||||
} catch (e: Exception) {
|
||||
Log.e("Kiwi", "Error", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 요구사항
|
||||
|
||||
- Android API Level 21+ (Android 5.0)
|
||||
- ARM64-v8a 아키텍처
|
||||
- Java 8+
|
||||
|
||||
## 모델 파일
|
||||
|
||||
모델 파일은 별도로 다운로드해야 합니다:
|
||||
1. GitHub Releases에서 `kiwi_model_VERSION_base.tgz` 다운로드
|
||||
2. 압축 해제 후 Android 앱의 assets 폴더에 복사
|
||||
3. 런타임에 내부 저장소로 복사한 뒤 파일 경로로 접근하거나 KiwiBuilder.StreamProvider를 사용하여 assets에서 직접 읽도록 설정
|
||||
자세한 예시는 [kr/pe/bab2min/](kr/pe/bab2min/) 내의 Kiwi.java, KiwiBuilder.java 및 KiwiTest.java 파일을 참조해주세요.
|
||||
|
|
|
|||
|
|
@ -1,67 +0,0 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:8.1.4'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
namespace 'kr.pe.bab2min.kiwi'
|
||||
compileSdk 34
|
||||
|
||||
defaultConfig {
|
||||
minSdk 21
|
||||
targetSdk 34
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
consumerProguardFiles "consumer-rules.pro"
|
||||
|
||||
ndk {
|
||||
abiFilters 'arm64-v8a', 'x86_64'
|
||||
}
|
||||
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments '-DKIWI_BUILD_DYNAMIC=OFF', '-DKIWI_USE_MIMALLOC=OFF', '-DKIWI_USE_CPUINFO=OFF', '-DKIWI_BUILD_CLI=OFF', '-DKIWI_BUILD_EVALUATOR=OFF', '-DKIWI_BUILD_MODEL_BUILDER=OFF', '-DKIWI_BUILD_TEST=OFF', '-DKIWI_JAVA_BINDING=ON'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
path file('../../CMakeLists.txt')
|
||||
version '3.22.1'
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
java.srcDirs = ['src']
|
||||
jni.srcDirs = []
|
||||
jniLibs.srcDirs = []
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||
}
|
||||
BIN
bindings/java/gradle/wrapper/gradle-wrapper.jar
vendored
BIN
bindings/java/gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
|
|
@ -1,6 +0,0 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
244
bindings/java/gradlew
vendored
244
bindings/java/gradlew
vendored
|
|
@ -1,244 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# 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
|
||||
#
|
||||
# https://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.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# Stop when "xargs" is not available.
|
||||
if ! command -v xargs >/dev/null 2>&1
|
||||
then
|
||||
die "xargs is not available"
|
||||
fi
|
||||
|
||||
# Use "xargs" to parse quoted args.
|
||||
#
|
||||
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||
#
|
||||
# In Bash we could simply go:
|
||||
#
|
||||
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||
# set -- "${ARGS[@]}" "$@"
|
||||
#
|
||||
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||
# character that might be a shell metacharacter, then use eval to reverse
|
||||
# that process (while maintaining the separation between arguments), and wrap
|
||||
# the whole thing up as a single "set" statement.
|
||||
#
|
||||
# This will of course break if any of these variables contains a newline or
|
||||
# an unmatched quote.
|
||||
#
|
||||
|
||||
eval "set -- $(
|
||||
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||
xargs -n1 |
|
||||
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||
tr '\n' ' '
|
||||
)" '"$@"'
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
|
|
@ -1,7 +1,5 @@
|
|||
#define _JNI_INT64_TO_INT
|
||||
#include "JniUtils.hpp"
|
||||
#include <chrono>
|
||||
#include <sstream>
|
||||
|
||||
#include <kiwi/Kiwi.h>
|
||||
#include <kiwi/Joiner.h>
|
||||
|
|
@ -42,8 +40,7 @@ static auto gClsTokenInfo = jni::DataClassDefinition<kiwi::TokenInfo>()
|
|||
.template property<&kiwi::TokenInfo::typoCost>("typoCost")
|
||||
.template property<&kiwi::TokenInfo::typoFormId>("typoFormId")
|
||||
.template property<&kiwi::TokenInfo::pairedToken>("pairedToken")
|
||||
.template property<&kiwi::TokenInfo::subSentPosition>("subSentPosition")
|
||||
.template property<&kiwi::TokenInfo::dialect>("dialect");
|
||||
.template property<&kiwi::TokenInfo::subSentPosition>("subSentPosition");
|
||||
|
||||
static auto gClsTokenResult = jni::DataClassDefinition<kiwi::TokenResult>()
|
||||
.template property<&kiwi::TokenResult::first>("tokens")
|
||||
|
|
@ -98,23 +95,6 @@ namespace jni
|
|||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ValueBuilder<kiwi::ModelType> : public ValueBuilder<uint32_t>
|
||||
{
|
||||
using CppType = kiwi::ModelType;
|
||||
using JniType = jint;
|
||||
|
||||
CppType fromJava(JNIEnv* env, JniType v)
|
||||
{
|
||||
return (CppType)v;
|
||||
}
|
||||
|
||||
JniType toJava(JNIEnv* env, CppType v)
|
||||
{
|
||||
return (JniType)v;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ValueBuilder<kiwi::Match> : public ValueBuilder<uint32_t>
|
||||
{
|
||||
|
|
@ -183,23 +163,6 @@ namespace jni
|
|||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ValueBuilder<kiwi::Dialect> : public ValueBuilder<uint16_t>
|
||||
{
|
||||
using CppType = kiwi::Dialect;
|
||||
using JniType = jshort;
|
||||
|
||||
CppType fromJava(JNIEnv* env, JniType v)
|
||||
{
|
||||
return (CppType)v;
|
||||
}
|
||||
|
||||
JniType toJava(JNIEnv* env, CppType v)
|
||||
{
|
||||
return (JniType)v;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct JClassName<kiwi::TokenResult>
|
||||
{
|
||||
|
|
@ -278,17 +241,6 @@ namespace jni
|
|||
};
|
||||
}
|
||||
|
||||
class JPreparedTypoTransformer : public kiwi::PreparedTypoTransformer, jni::JObject<JPreparedTypoTransformer>
|
||||
{
|
||||
public:
|
||||
static constexpr std::string_view className = "kr/pe/bab2min/KiwiBuilder$PreparedTypoTransformer";
|
||||
|
||||
JPreparedTypoTransformer() : PreparedTypoTransformer{} {}
|
||||
JPreparedTypoTransformer(kiwi::PreparedTypoTransformer&& inst) : PreparedTypoTransformer{ std::move(inst) } {}
|
||||
JPreparedTypoTransformer(JPreparedTypoTransformer&&) = default;
|
||||
JPreparedTypoTransformer& operator=(JPreparedTypoTransformer&&) = default;
|
||||
};
|
||||
|
||||
class JKiwi;
|
||||
|
||||
class JMorphemeSet : jni::JObject<JMorphemeSet>
|
||||
|
|
@ -304,7 +256,7 @@ public:
|
|||
int add(const std::u16string& form, kiwi::POSTag tag)
|
||||
{
|
||||
if (!kiwiObj) return -1;
|
||||
auto found = kiwiObj->findMorphemes(form, tag);
|
||||
auto found = kiwiObj->findMorpheme(form, tag);
|
||||
int added = 0;
|
||||
for(auto& m : found) added += morphSet.emplace(m).second ? 1 : 0;
|
||||
return added;
|
||||
|
|
@ -322,8 +274,6 @@ public:
|
|||
size_t topN;
|
||||
kiwi::Match matchOption;
|
||||
JMorphemeSet* blocklist;
|
||||
kiwi::Dialect allowedDialects;
|
||||
float dialectCost;
|
||||
jni::JIterator<jni::JIterator<kiwi::PretokenizedSpan>> pretokenized;
|
||||
|
||||
JMultipleTokenResult(jni::JUniqueGlobalRef<JKiwi>&& _dp,
|
||||
|
|
@ -331,9 +281,8 @@ public:
|
|||
size_t _topN,
|
||||
kiwi::Match _matchOption,
|
||||
JMorphemeSet* _blocklist,
|
||||
kiwi::Dialect _allowedDialects,
|
||||
float _dialectCost,
|
||||
jni::JIterator<jni::JIterator<kiwi::PretokenizedSpan>> _pretokenized);
|
||||
jni::JIterator<jni::JIterator<kiwi::PretokenizedSpan>> _pretokenized
|
||||
);
|
||||
JMultipleTokenResult(JMultipleTokenResult&&) = default;
|
||||
JMultipleTokenResult& operator=(JMultipleTokenResult&&) = default;
|
||||
|
||||
|
|
@ -395,45 +344,30 @@ public:
|
|||
return KIWI_VERSION_STRING;
|
||||
}
|
||||
|
||||
auto analyze(const std::u16string& text, uint64_t topN,
|
||||
kiwi::Match matchOption, JMorphemeSet* blocklist, kiwi::Dialect allowedDialects, float dialectCost,
|
||||
JPreparedTypoTransformer* typoTransformer, float typoThreshold,
|
||||
jni::JIterator<kiwi::PretokenizedSpan> pretokenized) const
|
||||
auto analyze(const std::u16string& text, uint64_t topN, kiwi::Match matchOption, JMorphemeSet* blocklist, jni::JIterator<kiwi::PretokenizedSpan> pretokenized) const
|
||||
{
|
||||
std::vector<kiwi::PretokenizedSpan> pretokenizedSpans;
|
||||
if (pretokenized)
|
||||
{
|
||||
while (pretokenized.hasNext()) pretokenizedSpans.emplace_back(pretokenized.next());
|
||||
}
|
||||
kiwi::AnalyzeOption opt{ matchOption, blocklist ? &blocklist->morphSet : nullptr, false, allowedDialects, dialectCost };
|
||||
opt.typoTransformer = typoTransformer;
|
||||
opt.typoThreshold = typoThreshold;
|
||||
return Kiwi::analyze(text, topN, opt, pretokenizedSpans);
|
||||
return Kiwi::analyze(text, topN, matchOption, blocklist ? &blocklist->morphSet : nullptr, pretokenizedSpans);
|
||||
}
|
||||
|
||||
JFutureTokenResult asyncAnalyze(jni::JRef<JKiwi> _ref, const std::u16string& text, uint64_t topN,
|
||||
kiwi::Match matchOption, JMorphemeSet* blocklist, kiwi::Dialect allowedDialects, float dialectCost,
|
||||
JPreparedTypoTransformer* typoTransformer, float typoThreshold,
|
||||
jni::JIterator<kiwi::PretokenizedSpan> pretokenized) const
|
||||
JFutureTokenResult asyncAnalyze(jni::JRef<JKiwi> _ref, const std::u16string& text, uint64_t topN, kiwi::Match matchOption, JMorphemeSet* blocklist, jni::JIterator<kiwi::PretokenizedSpan> pretokenized) const
|
||||
{
|
||||
std::vector<kiwi::PretokenizedSpan> pretokenizedSpans;
|
||||
if (pretokenized)
|
||||
{
|
||||
while (pretokenized.hasNext()) pretokenizedSpans.emplace_back(pretokenized.next());
|
||||
}
|
||||
kiwi::AnalyzeOption opt{ matchOption, blocklist ? &blocklist->morphSet : nullptr, false, allowedDialects, dialectCost };
|
||||
opt.typoTransformer = typoTransformer;
|
||||
opt.typoThreshold = typoThreshold;
|
||||
return { _ref, Kiwi::asyncAnalyze(text, topN, opt, pretokenizedSpans) };
|
||||
return { _ref, Kiwi::asyncAnalyze(text, topN, matchOption, blocklist ? &blocklist->morphSet : nullptr, pretokenizedSpans) };
|
||||
}
|
||||
|
||||
JMultipleTokenResult analyze2(jni::JRef<JKiwi> _ref, jni::JIterator<std::u16string> texts, uint64_t topN,
|
||||
kiwi::Match matchOption, JMorphemeSet* blocklist, kiwi::Dialect allowedDialects, float dialectCost,
|
||||
JPreparedTypoTransformer* typoTransformer, float typoThreshold,
|
||||
jni::JIterator<jni::JIterator<kiwi::PretokenizedSpan>> pretokenized) const
|
||||
JMultipleTokenResult analyze2(jni::JRef<JKiwi> _ref, jni::JIterator<std::u16string> texts, uint64_t topN, kiwi::Match matchOption, JMorphemeSet* blocklist, jni::JIterator<jni::JIterator<kiwi::PretokenizedSpan>> pretokenized) const
|
||||
{
|
||||
if (!texts) throw std::bad_optional_access{};
|
||||
return { _ref, std::move(texts), (size_t)topN, matchOption, blocklist, allowedDialects, dialectCost, std::move(pretokenized) };
|
||||
return { _ref, std::move(texts), (size_t)topN, matchOption, blocklist, std::move(pretokenized) };
|
||||
}
|
||||
|
||||
std::vector<Sentence> splitIntoSents(const std::u16string& text, kiwi::Match matchOption, bool returnTokens) const
|
||||
|
|
@ -499,8 +433,6 @@ JMultipleTokenResult::JMultipleTokenResult(jni::JUniqueGlobalRef<JKiwi>&& _dp,
|
|||
size_t _topN,
|
||||
kiwi::Match _matchOption,
|
||||
JMorphemeSet* _blocklist,
|
||||
kiwi::Dialect _allowedDialects,
|
||||
float _dialectCost,
|
||||
jni::JIterator<jni::JIterator<kiwi::PretokenizedSpan>> _pretokenized
|
||||
)
|
||||
: dp{ std::move(_dp) },
|
||||
|
|
@ -508,8 +440,6 @@ JMultipleTokenResult::JMultipleTokenResult(jni::JUniqueGlobalRef<JKiwi>&& _dp,
|
|||
topN{ _topN },
|
||||
matchOption{ _matchOption },
|
||||
blocklist{ _blocklist },
|
||||
allowedDialects{ _allowedDialects },
|
||||
dialectCost{ _dialectCost },
|
||||
pretokenized{ std::move(_pretokenized) }
|
||||
{
|
||||
for (size_t i = 0; i < dp->getThreadPool()->size(); ++i)
|
||||
|
|
@ -537,7 +467,8 @@ bool JMultipleTokenResult::feed()
|
|||
futures.emplace_back(static_cast<kiwi::Kiwi&>(dp.get()).asyncAnalyze(
|
||||
texts.next(),
|
||||
topN,
|
||||
kiwi::AnalyzeOption{ matchOption, blocklist ? &blocklist->morphSet : nullptr, false, allowedDialects, dialectCost },
|
||||
matchOption,
|
||||
blocklist ? &blocklist->morphSet : nullptr,
|
||||
std::move(pretokenizedSpans)
|
||||
));
|
||||
return true;
|
||||
|
|
@ -562,27 +493,6 @@ public:
|
|||
static constexpr std::string_view className = "kr/pe/bab2min/KiwiBuilder$TypoTransformer";
|
||||
|
||||
using kiwi::TypoTransformer::TypoTransformer;
|
||||
|
||||
JTypoTransformer copy() const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
void update(const JTypoTransformer& o)
|
||||
{
|
||||
TypoTransformer::update(o);
|
||||
}
|
||||
|
||||
JPreparedTypoTransformer prepare() const
|
||||
{
|
||||
return TypoTransformer::prepare(true);
|
||||
}
|
||||
};
|
||||
|
||||
class JStreamProvider : jni::JPureObject<JStreamProvider>
|
||||
{
|
||||
public:
|
||||
static constexpr std::string_view className = "kr/pe/bab2min/KiwiBuilder$StreamProvider";
|
||||
};
|
||||
|
||||
class JKiwiBuilder : public kiwi::KiwiBuilder, jni::JObject<JKiwiBuilder>
|
||||
|
|
@ -592,131 +502,6 @@ public:
|
|||
|
||||
using kiwi::KiwiBuilder::KiwiBuilder;
|
||||
|
||||
// Custom constructor for StreamProvider
|
||||
JKiwiBuilder(jni::JRef<JStreamProvider> streamProvider, size_t numThreads, kiwi::BuildOption options, kiwi::ModelType modelType, kiwi::Dialect enabledDialects)
|
||||
: KiwiBuilder(createStreamProviderWrapper(streamProvider), numThreads, options, modelType, enabledDialects)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
// Custom istream implementation that reads from Java InputStream on-demand
|
||||
class JavaStreamAdapter : public std::istream {
|
||||
private:
|
||||
class JavaStreamBuf : public std::streambuf {
|
||||
private:
|
||||
JNIEnv* env = nullptr;
|
||||
jobject inputStreamGlobalRef = nullptr;
|
||||
jmethodID readMethod = nullptr;
|
||||
jmethodID closeMethod = nullptr;
|
||||
std::vector<char> buffer;
|
||||
static constexpr const size_t buffer_size = 8192;
|
||||
|
||||
public:
|
||||
JavaStreamBuf(JNIEnv* _env, jobject inputStream)
|
||||
: env(_env), buffer(buffer_size) {
|
||||
|
||||
inputStreamGlobalRef = env->NewGlobalRef(inputStream);
|
||||
|
||||
jclass inputStreamClass = env->FindClass("java/io/InputStream");
|
||||
readMethod = env->GetMethodID(inputStreamClass, "read", "([B)I");
|
||||
closeMethod = env->GetMethodID(inputStreamClass, "close", "()V");
|
||||
setg(buffer.data(), buffer.data(), buffer.data());
|
||||
}
|
||||
|
||||
~JavaStreamBuf() {
|
||||
if (inputStreamGlobalRef && closeMethod) {
|
||||
env->CallVoidMethod(inputStreamGlobalRef, closeMethod);
|
||||
env->DeleteGlobalRef(inputStreamGlobalRef);
|
||||
|
||||
inputStreamGlobalRef = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
int underflow() override {
|
||||
if (gptr() < egptr()) {
|
||||
return traits_type::to_int_type(*gptr());
|
||||
}
|
||||
|
||||
if (!inputStreamGlobalRef || !readMethod) {
|
||||
return traits_type::eof();
|
||||
}
|
||||
|
||||
try {
|
||||
jbyteArray byteArray = env->NewByteArray(buffer_size);
|
||||
jint bytesRead = env->CallIntMethod(inputStreamGlobalRef, readMethod, byteArray);
|
||||
|
||||
if (bytesRead <= 0 || env->ExceptionCheck()) {
|
||||
if (env->ExceptionCheck()) env->ExceptionClear();
|
||||
env->DeleteLocalRef(byteArray);
|
||||
return traits_type::eof();
|
||||
}
|
||||
|
||||
jbyte* bytes = env->GetByteArrayElements(byteArray, nullptr);
|
||||
std::copy(reinterpret_cast<char*>(bytes),
|
||||
reinterpret_cast<char*>(bytes + bytesRead),
|
||||
buffer.data());
|
||||
env->ReleaseByteArrayElements(byteArray, bytes, JNI_ABORT);
|
||||
env->DeleteLocalRef(byteArray);
|
||||
|
||||
setg(buffer.data(), buffer.data(), buffer.data() + bytesRead);
|
||||
return traits_type::to_int_type(*gptr());
|
||||
}
|
||||
catch (...) {
|
||||
return traits_type::eof();
|
||||
}
|
||||
}
|
||||
|
||||
// Java InputStream doesn't support random access, so seeking fails
|
||||
pos_type seekoff(off_type, std::ios_base::seekdir, std::ios_base::openmode) override {
|
||||
return pos_type(-1);
|
||||
}
|
||||
|
||||
pos_type seekpos(pos_type, std::ios_base::openmode) override {
|
||||
return pos_type(-1);
|
||||
}
|
||||
};
|
||||
|
||||
JavaStreamBuf buf;
|
||||
|
||||
public:
|
||||
JavaStreamAdapter(JNIEnv* env, jobject inputStream) : std::istream(&buf), buf(env, inputStream) {}
|
||||
};
|
||||
|
||||
kiwi::KiwiBuilder::StreamProvider createStreamProviderWrapper(jni::JRef<JStreamProvider> streamProvider)
|
||||
{
|
||||
return [this, provider = jni::JUniqueGlobalRef<JStreamProvider>(streamProvider)](const std::string& filename) -> std::unique_ptr<std::istream>
|
||||
{
|
||||
try
|
||||
{
|
||||
JNIEnv* env = jni::threadLocalEnv;
|
||||
// Get StreamProvider.provide method
|
||||
jclass streamProviderClass = JObject<JStreamProvider>::jClass;
|
||||
jmethodID provideMethod = env->GetMethodID(streamProviderClass, "provide", "(Ljava/lang/String;)Ljava/io/InputStream;");
|
||||
|
||||
// Convert filename to Java string
|
||||
jstring jFilename = env->NewStringUTF(filename.c_str());
|
||||
|
||||
// Call provide method
|
||||
jobject inputStream = env->CallObjectMethod(provider, provideMethod, jFilename);
|
||||
|
||||
if (!inputStream || env->ExceptionCheck())
|
||||
{
|
||||
if (env->ExceptionCheck()) env->ExceptionClear();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Create streaming adapter that reads on-demand
|
||||
return std::make_unique<JavaStreamAdapter>(env, inputStream);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public:
|
||||
bool addWord(const std::u16string& form, kiwi::POSTag tag, float score)
|
||||
{
|
||||
return KiwiBuilder::addWord(form, tag, score).second;
|
||||
|
|
@ -729,44 +514,43 @@ public:
|
|||
|
||||
bool addPreAnalyzedWord(const std::u16string& form, std::vector<AnalyzedMorph>&& analyzed, float score)
|
||||
{
|
||||
std::vector<std::tuple<std::u16string, kiwi::POSTag, uint8_t>> morphs;
|
||||
std::vector<std::pair<std::u16string, kiwi::POSTag>> morphs;
|
||||
std::vector<std::pair<size_t, size_t>> positions;
|
||||
for (auto& i : analyzed)
|
||||
{
|
||||
morphs.emplace_back(std::move(i.form), std::move(i.tag), kiwi::undefSenseId);
|
||||
morphs.emplace_back(std::move(i.form), std::move(i.tag));
|
||||
if (i.start >= 0 && i.end >= 0) positions.emplace_back(i.start, i.end);
|
||||
}
|
||||
if (positions.size() < morphs.size()) positions.clear();
|
||||
return KiwiBuilder::addPreAnalyzedWord(form, morphs, positions, score);
|
||||
}
|
||||
|
||||
JKiwi build() const
|
||||
JKiwi build(JTypoTransformer* typos, float typoCostThreshold) const
|
||||
{
|
||||
return KiwiBuilder::build();
|
||||
if (typos)
|
||||
{
|
||||
return KiwiBuilder::build(*typos, typoCostThreshold);
|
||||
}
|
||||
else
|
||||
{
|
||||
return KiwiBuilder::build();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
jni::Module gModule{ JNI_VERSION_1_6 };
|
||||
jni::Module gModule{ JNI_VERSION_1_8 };
|
||||
|
||||
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
|
||||
{
|
||||
return gModule.load(vm,
|
||||
|
||||
jni::define<JPreparedTypoTransformer>(),
|
||||
|
||||
jni::define<JTypoTransformer>()
|
||||
.template ctor<>()
|
||||
.template method<&JTypoTransformer::addTypo>("_addTypo")
|
||||
.template method<&JTypoTransformer::setContinualTypoCost>("_setContinualTypoCost")
|
||||
.template method<&JTypoTransformer::setLengtheningTypoCost>("_setLengtheningTypoCost")
|
||||
.template method<&JTypoTransformer::copy>("copy")
|
||||
.template method<&JTypoTransformer::update>("_update")
|
||||
.template method<&JTypoTransformer::scaleCost>("_scaleCost")
|
||||
.template method<&JTypoTransformer::prepare>("prepare"),
|
||||
.template method<&JTypoTransformer::setContinualTypoCost>("_setContinualTypoCost"),
|
||||
|
||||
jni::define<JKiwiBuilder>()
|
||||
.template ctor<std::string, size_t, kiwi::BuildOption, kiwi::ModelType, kiwi::Dialect>()
|
||||
.template ctor<jni::JRef<JStreamProvider>, size_t, kiwi::BuildOption, kiwi::ModelType, kiwi::Dialect>()
|
||||
.template ctor<std::string, size_t, kiwi::BuildOption, bool>()
|
||||
.template method<&JKiwiBuilder::addWord>("addWord")
|
||||
.template method<&JKiwiBuilder::addWord2>("addWord")
|
||||
.template method<&JKiwiBuilder::addPreAnalyzedWord>("addPreAnalyzedWord")
|
||||
|
|
@ -793,8 +577,6 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
|
|||
.template method<&JKiwi::splitIntoSents>("splitIntoSents")
|
||||
.template method<&JKiwi::join>("join"),
|
||||
|
||||
jni::define<JStreamProvider>(),
|
||||
|
||||
gClsTokenInfo,
|
||||
gClsTokenResult,
|
||||
gClsSentence,
|
||||
|
|
@ -12,6 +12,7 @@ import java.util.concurrent.TimeUnit;
|
|||
|
||||
public class Kiwi implements AutoCloseable {
|
||||
private long _inst;
|
||||
final private static String _version = "0.17.1";
|
||||
|
||||
public static class Match {
|
||||
final static public int none = 0,
|
||||
|
|
@ -21,11 +22,6 @@ public class Kiwi implements AutoCloseable {
|
|||
mention = 1 << 3,
|
||||
serial = 1 << 4,
|
||||
emoji = 1 << 5,
|
||||
oovRuleOnly = 0 << 8,
|
||||
oovChrModel = 1 << 8,
|
||||
oovChrFreqModel = 2 << 8,
|
||||
oovChrFreqBranchModel = 3 << 8,
|
||||
oovMask = 3 << 8,
|
||||
normalizeCoda = 1 << 16,
|
||||
joinNounPrefix = 1 << 17,
|
||||
joinNounSuffix = 1 << 18,
|
||||
|
|
@ -34,10 +30,6 @@ public class Kiwi implements AutoCloseable {
|
|||
joinAdvSuffix = 1 << 21,
|
||||
splitComplex = 1 << 22,
|
||||
zCoda = 1 << 23,
|
||||
compatibleJamo = 1 << 24,
|
||||
splitSaisiot = 1 << 25,
|
||||
mergeSaisiot = 1 << 26,
|
||||
joinParticleYo = 1 << 27,
|
||||
joinVSuffix = joinVerbSuffix | joinAdjSuffix,
|
||||
joinAffix = joinNounPrefix | joinNounSuffix | joinVerbSuffix | joinAdjSuffix | joinAdvSuffix,
|
||||
all = url | email | hashtag | mention | serial | zCoda,
|
||||
|
|
@ -60,10 +52,10 @@ public class Kiwi implements AutoCloseable {
|
|||
w_url = 33, w_email = 34, w_mention = 35, w_hashtag = 36, w_serial = 37, w_emoji = 38,
|
||||
jks = 39, jkc = 40, jkg = 41, jko = 42, jkb = 43, jkv = 44, jkq = 45, jx = 46, jc = 47,
|
||||
ep = 48, ef = 49, ec = 50, etn = 51, etm = 52,
|
||||
z_coda = 53, z_siot = 54,
|
||||
user0 = 55, user1 = 56, user2 = 57, user3 = 58, user4 = 59,
|
||||
p = 60,
|
||||
max = 61,
|
||||
z_coda = 53,
|
||||
user0 = 54, user1 = 55, user2 = 56, user3 = 57, user4 = 58,
|
||||
p = 59,
|
||||
max = 60,
|
||||
pv = p,
|
||||
pa = (byte)(p + 1),
|
||||
irregular = - 128,
|
||||
|
|
@ -75,7 +67,7 @@ public class Kiwi implements AutoCloseable {
|
|||
pvi = (byte)(pv | irregular),
|
||||
pai = (byte)(pa | irregular);
|
||||
|
||||
public static String toString(byte tag) {
|
||||
static String toString(byte tag) {
|
||||
switch(tag) {
|
||||
case unknown: return "UNK";
|
||||
case nng: return "NNG";
|
||||
|
|
@ -131,7 +123,6 @@ public class Kiwi implements AutoCloseable {
|
|||
case etn: return "ETN";
|
||||
case etm: return "ETM";
|
||||
case z_coda: return "Z_CODA";
|
||||
case z_siot: return "Z_SIOT";
|
||||
case user0: return "USER0";
|
||||
case user1: return "USER1";
|
||||
case user2: return "USER2";
|
||||
|
|
@ -153,55 +144,6 @@ public class Kiwi implements AutoCloseable {
|
|||
insert_space = 2;
|
||||
}
|
||||
|
||||
public static class Dialect {
|
||||
final public static short standard = 0,
|
||||
gyeonggi = 1 << 0,
|
||||
chungcheong = 1 << 1,
|
||||
gangwon = 1 << 2,
|
||||
gyeongsang = 1 << 3,
|
||||
jeolla = 1 << 4,
|
||||
jeju = 1 << 5,
|
||||
hwanghae = 1 << 6,
|
||||
hamgyeong = 1 << 7,
|
||||
pyeongan = 1 << 8,
|
||||
archaic = 1 << 9,
|
||||
all = (1 << 10) - 1;
|
||||
}
|
||||
|
||||
public static class AnalyzeOption {
|
||||
public int match;
|
||||
public MorphemeSet blocklist;
|
||||
public short allowedDialects;
|
||||
public float dialectCost;
|
||||
public KiwiBuilder.PreparedTypoTransformer typoTransformer;
|
||||
public float typoThreshold;
|
||||
|
||||
public AnalyzeOption(int match, MorphemeSet blocklist, short allowedDialects, float dialectCost, KiwiBuilder.PreparedTypoTransformer typoTransformer, float typoThreshold) {
|
||||
this.match = match;
|
||||
this.blocklist = blocklist;
|
||||
this.allowedDialects = allowedDialects;
|
||||
this.dialectCost = dialectCost;
|
||||
this.typoTransformer = typoTransformer;
|
||||
this.typoThreshold = typoThreshold;
|
||||
}
|
||||
|
||||
public AnalyzeOption(int match, MorphemeSet blocklist, short allowedDialects, float dialectCost) {
|
||||
this(match, blocklist, allowedDialects, dialectCost, null, 2.5f);
|
||||
}
|
||||
|
||||
public AnalyzeOption(int match, MorphemeSet blocklist) {
|
||||
this(match, blocklist, Dialect.standard, 0.0f);
|
||||
}
|
||||
|
||||
public AnalyzeOption(int match) {
|
||||
this(match, null, Dialect.standard, 0.0f);
|
||||
}
|
||||
|
||||
public AnalyzeOption() {
|
||||
this(Match.allWithNormalizing, null, Dialect.standard, 0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Token {
|
||||
public String form;
|
||||
public int position;
|
||||
|
|
@ -216,7 +158,6 @@ public class Kiwi implements AutoCloseable {
|
|||
public int typoFormId;
|
||||
public int pairedToken;
|
||||
public int subSentPosition;
|
||||
public short dialect;
|
||||
|
||||
public String toString() {
|
||||
return String.format("Token(form=%s, tag=%s, position=%d, length=%d)", form, POSTag.toString(tag), position, length);
|
||||
|
|
@ -400,14 +341,8 @@ public class Kiwi implements AutoCloseable {
|
|||
this._inst = _inst;
|
||||
}
|
||||
|
||||
public static Kiwi init(String modelPath, int numWorkers, int buildOptions, int modelType, short enabledDialects) throws Exception {
|
||||
try(KiwiBuilder b = new KiwiBuilder(modelPath, numWorkers, buildOptions, modelType, enabledDialects)) {
|
||||
return b.build();
|
||||
}
|
||||
}
|
||||
|
||||
public static Kiwi init(String modelPath, int numWorkers, int buildOptions, int modelType) throws Exception {
|
||||
try(KiwiBuilder b = new KiwiBuilder(modelPath, numWorkers, buildOptions, modelType)) {
|
||||
public static Kiwi init(String modelPath, int numWorkers, int buildOptions, boolean useSBG) throws Exception {
|
||||
try(KiwiBuilder b = new KiwiBuilder(modelPath, numWorkers, buildOptions, useSBG)) {
|
||||
return b.build();
|
||||
}
|
||||
}
|
||||
|
|
@ -441,44 +376,48 @@ public class Kiwi implements AutoCloseable {
|
|||
return _inst != 0;
|
||||
}
|
||||
|
||||
public native TokenResult[] analyze(String text, int topN, int matchOption, MorphemeSet blocklist, short allowedDialects, float dialectCost, KiwiBuilder.PreparedTypoTransformer typoTransformer, float typoThreshold, Iterator<PretokenizedSpan> pretokenized);
|
||||
public native FutureTokenResult asyncAnalyze(String text, int topN, int matchOption, MorphemeSet blocklist, short allowedDialects, float dialectCost, KiwiBuilder.PreparedTypoTransformer typoTransformer, float typoThreshold, Iterator<PretokenizedSpan> pretokenized);
|
||||
public native MultipleTokenResult analyze(Iterator<String> texts, int topN, int matchOption, MorphemeSet blocklist, short allowedDialects, float dialectCost, KiwiBuilder.PreparedTypoTransformer typoTransformer, float typoThreshold, Iterator<Iterator<PretokenizedSpan>> pretokenized);
|
||||
public native TokenResult[] analyze(String text, int topN, int matchOption, MorphemeSet blocklist, Iterator<PretokenizedSpan> pretokenized);
|
||||
public native FutureTokenResult asyncAnalyze(String text, int topN, int matchOption, MorphemeSet blocklist, Iterator<PretokenizedSpan> pretokenized);
|
||||
public native MultipleTokenResult analyze(Iterator<String> texts, int topN, int matchOption, MorphemeSet blocklist, Iterator<Iterator<PretokenizedSpan>> pretokenized);
|
||||
public native Sentence[] splitIntoSents(String text, int matchOption, boolean returnTokens);
|
||||
public native String join(JoinableToken[] tokens);
|
||||
|
||||
public static native String getVersion();
|
||||
|
||||
public TokenResult[] analyze(String text, int topN, AnalyzeOption option, Iterator<PretokenizedSpan> pretokenized) {
|
||||
return analyze(text, topN, option.match, option.blocklist, option.allowedDialects, option.dialectCost, option.typoTransformer, option.typoThreshold, pretokenized);
|
||||
public TokenResult[] analyze(String text, int topN, int matchOption, MorphemeSet blocklist) {
|
||||
return analyze(text, topN, matchOption, blocklist, null);
|
||||
}
|
||||
|
||||
public TokenResult[] analyze(String text, int topN, AnalyzeOption option) {
|
||||
return analyze(text, topN, option, null);
|
||||
public TokenResult[] analyze(String text, int topN, int matchOption) {
|
||||
return analyze(text, topN, matchOption, null);
|
||||
}
|
||||
|
||||
public FutureTokenResult asyncAnalyze(String text, int topN, AnalyzeOption option, Iterator<PretokenizedSpan> pretokenized) {
|
||||
return asyncAnalyze(text, topN, option.match, option.blocklist, option.allowedDialects, option.dialectCost, option.typoTransformer, option.typoThreshold, pretokenized);
|
||||
public FutureTokenResult asyncAnalyze(String text, int topN, int matchOption, MorphemeSet blocklist) {
|
||||
return asyncAnalyze(text, topN, matchOption, blocklist, null);
|
||||
}
|
||||
|
||||
public FutureTokenResult asyncAnalyze(String text, int topN, AnalyzeOption option) {
|
||||
return asyncAnalyze(text, topN, option, null);
|
||||
public FutureTokenResult asyncAnalyze(String text, int topN, int matchOption) {
|
||||
return asyncAnalyze(text, topN, matchOption, null);
|
||||
}
|
||||
|
||||
public MultipleTokenResult analyze(Iterator<String> texts, int topN, AnalyzeOption option, Iterator<Iterator<PretokenizedSpan>> pretokenized) {
|
||||
return analyze(texts, topN, option.match, option.blocklist, option.allowedDialects, option.dialectCost, option.typoTransformer, option.typoThreshold, pretokenized);
|
||||
public MultipleTokenResult analyze(Iterator<String> texts, int topN, int matchOption, MorphemeSet blocklist) {
|
||||
return analyze(texts, topN, matchOption, blocklist, null);
|
||||
}
|
||||
|
||||
public MultipleTokenResult analyze(Iterator<String> texts, int topN, AnalyzeOption option) {
|
||||
return analyze(texts, topN, option, null);
|
||||
public MultipleTokenResult analyze(Iterator<String> texts, int topN, int matchOption) {
|
||||
return analyze(texts, topN, matchOption, null);
|
||||
}
|
||||
|
||||
public Token[] tokenize(String text, AnalyzeOption option, Iterator<PretokenizedSpan> pretokenized) {
|
||||
return analyze(text, 1, option, pretokenized)[0].tokens;
|
||||
public Token[] tokenize(String text, int matchOption, MorphemeSet blocklist, Iterator<PretokenizedSpan> pretokenized) {
|
||||
return analyze(text, 1, matchOption, blocklist, pretokenized)[0].tokens;
|
||||
}
|
||||
|
||||
public Token[] tokenize(String text, AnalyzeOption option) {
|
||||
return analyze(text, 1, option)[0].tokens;
|
||||
public Token[] tokenize(String text, int matchOption, MorphemeSet blocklist) {
|
||||
return analyze(text, 1, matchOption, blocklist)[0].tokens;
|
||||
}
|
||||
|
||||
public Token[] tokenize(String text, int matchOption) {
|
||||
return analyze(text, 1, matchOption)[0].tokens;
|
||||
}
|
||||
|
||||
public Sentence[] splitIntoSents(String text, int matchOption) {
|
||||
|
|
@ -490,32 +429,19 @@ public class Kiwi implements AutoCloseable {
|
|||
}
|
||||
|
||||
public static void loadLibrary() throws SecurityException, UnsatisfiedLinkError, NullPointerException {
|
||||
boolean isAndroid;
|
||||
try {
|
||||
Class.forName("android.os.Build");
|
||||
isAndroid = true;
|
||||
} catch (ClassNotFoundException e) {
|
||||
isAndroid = false;
|
||||
}
|
||||
|
||||
if (isAndroid) {
|
||||
System.loadLibrary("KiwiJava");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
System.loadLibrary("KiwiJava");
|
||||
System.loadLibrary("KiwiJava-" + _version);
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
InputStream in = null;
|
||||
String foundName = null;
|
||||
for (String name : new String[]{"KiwiJava.dll", "libKiwiJava.so", "libKiwiJava.dylib"}) {
|
||||
for (String name : new String[]{"KiwiJava-" + _version + ".dll", "libKiwiJava-" + _version + ".so", "libKiwiJava-" + _version + ".dylib"}) {
|
||||
in = Kiwi.class.getResourceAsStream("/" + name);
|
||||
if (in != null) {
|
||||
foundName = name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (in == null) throw new UnsatisfiedLinkError("Cannot find a library named KiwiJava");
|
||||
if (in == null) throw new UnsatisfiedLinkError("Cannot find a library named KiwiJava-" + _version);
|
||||
byte[] buffer = new byte[4096];
|
||||
int read = -1;
|
||||
try {
|
||||
|
|
@ -553,7 +479,7 @@ public class Kiwi implements AutoCloseable {
|
|||
try(Scanner input = new Scanner(System.in)) {
|
||||
System.out.print(">> ");
|
||||
while (input.hasNext()) {
|
||||
Token[] tokens = kiwi.tokenize(input.nextLine(), new AnalyzeOption(Match.allWithNormalizing));
|
||||
Token[] tokens = kiwi.tokenize(input.nextLine(), Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
System.out.print(">> ");
|
||||
}
|
||||
|
|
@ -1,21 +1,8 @@
|
|||
package kr.pe.bab2min;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
public class KiwiBuilder implements AutoCloseable {
|
||||
private long _inst;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface StreamProvider {
|
||||
/**
|
||||
* Provides an InputStream for the specified model file.
|
||||
*
|
||||
* @param filename The name of the model file to read
|
||||
* @return InputStream containing the file data, or null if the file cannot be provided
|
||||
*/
|
||||
InputStream provide(String filename);
|
||||
}
|
||||
|
||||
public static class BuildOption {
|
||||
final static public int none = 0,
|
||||
integrateAllomorph = 1 << 0,
|
||||
|
|
@ -25,15 +12,6 @@ public class KiwiBuilder implements AutoCloseable {
|
|||
default_ = integrateAllomorph | loadDefaultDict | loadTypoDict | loadMultiDict;
|
||||
}
|
||||
|
||||
public static class ModelType {
|
||||
final static public int none = 0,
|
||||
largest = 1,
|
||||
knlm = 2,
|
||||
sbg = 3,
|
||||
cong = 4,
|
||||
congGlobal = 5;
|
||||
}
|
||||
|
||||
public static class AnalyzedMorph {
|
||||
public String form;
|
||||
public byte tag = Kiwi.POSTag.nng;
|
||||
|
|
@ -59,8 +37,7 @@ public class KiwiBuilder implements AutoCloseable {
|
|||
final static public byte none = 0,
|
||||
any = 1,
|
||||
vowel = 2,
|
||||
applosive = 8,
|
||||
continual = 9;
|
||||
applosive = 8;
|
||||
}
|
||||
|
||||
public static class TypoTransformer implements AutoCloseable {
|
||||
|
|
@ -86,123 +63,47 @@ public class KiwiBuilder implements AutoCloseable {
|
|||
|
||||
@Override
|
||||
public native void close() throws Exception;
|
||||
public native TypoTransformer copy();
|
||||
public native void _addTypo(String orig, String error, float cost, byte convVowel, short dialect);
|
||||
public native void _update(TypoTransformer src);
|
||||
public native void _scaleCost(float scale);
|
||||
public native void _addTypo(String orig, String error, float cost, byte convVowel);
|
||||
public native void _setContinualTypoCost(float cost);
|
||||
public native void _setLengtheningTypoCost(float cost);
|
||||
|
||||
public TypoTransformer addTypo(String orig, String error, float cost, byte convVowel, short dialect) {
|
||||
_addTypo(orig, error, cost, convVowel, dialect);
|
||||
public TypoTransformer addTypo(String orig, String error, float cost, byte convVowel) {
|
||||
_addTypo(orig, error, cost, convVowel);
|
||||
return this;
|
||||
}
|
||||
|
||||
public TypoTransformer addTypo(String orig, String error, float cost, byte convVowel) {
|
||||
return addTypo(orig, error, cost, convVowel, (short)0);
|
||||
}
|
||||
|
||||
public TypoTransformer addTypo(String[] orig, String[] error, float cost, byte convVowel, short dialect) {
|
||||
public TypoTransformer addTypo(String[] orig, String[] error, float cost, byte convVowel) {
|
||||
for (int i = 0; i < orig.length; ++i) {
|
||||
for (int j = 0; j < error.length; ++j) {
|
||||
_addTypo(orig[i], error[j], cost, convVowel, dialect);
|
||||
_addTypo(orig[i], error[j], cost, convVowel);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public TypoTransformer addTypo(String[] orig, String[] error, float cost, byte convVowel) {
|
||||
return addTypo(orig, error, cost, convVowel, (short)0);
|
||||
}
|
||||
|
||||
// Set continual typo cost (inplace)
|
||||
public TypoTransformer setContinualTypoCost(float cost) {
|
||||
_setContinualTypoCost(cost);
|
||||
return this;
|
||||
}
|
||||
|
||||
// Set lengthening typo cost (inplace)
|
||||
public TypoTransformer setLengtheningTypoCost(float cost) {
|
||||
_setLengtheningTypoCost(cost);
|
||||
return this;
|
||||
}
|
||||
|
||||
// Inplace update
|
||||
public TypoTransformer update(TypoTransformer src) {
|
||||
_update(src);
|
||||
return this;
|
||||
}
|
||||
|
||||
// Inplace scaling
|
||||
public TypoTransformer scaleCost(float scale) {
|
||||
_scaleCost(scale);
|
||||
return this;
|
||||
}
|
||||
|
||||
public native PreparedTypoTransformer prepare();
|
||||
}
|
||||
|
||||
public static class PreparedTypoTransformer implements AutoCloseable {
|
||||
private long _inst;
|
||||
|
||||
public PreparedTypoTransformer(long _inst) {
|
||||
this._inst = _inst;
|
||||
}
|
||||
|
||||
protected void finalize() throws Exception {
|
||||
close();
|
||||
}
|
||||
|
||||
public boolean isAlive() {
|
||||
return _inst != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public native void close() throws Exception;
|
||||
}
|
||||
|
||||
public KiwiBuilder(long _inst) {
|
||||
this._inst = _inst;
|
||||
}
|
||||
|
||||
public KiwiBuilder(String modelPath, int numWorkers, int buildOptions, int modelType, short enabledDialects) {
|
||||
ctor(modelPath, numWorkers, buildOptions, modelType, enabledDialects);
|
||||
}
|
||||
|
||||
public KiwiBuilder(StreamProvider streamProvider, int numWorkers, int buildOptions, int modelType, short enabledDialects) {
|
||||
ctor(streamProvider, numWorkers, buildOptions, modelType, enabledDialects);
|
||||
}
|
||||
|
||||
public KiwiBuilder(String modelPath, int numWorkers, int buildOptions, int modelType) {
|
||||
ctor(modelPath, numWorkers, buildOptions, modelType, Kiwi.Dialect.standard);
|
||||
}
|
||||
|
||||
public KiwiBuilder(StreamProvider streamProvider, int numWorkers, int buildOptions, int modelType) {
|
||||
ctor(streamProvider, numWorkers, buildOptions, modelType, Kiwi.Dialect.standard);
|
||||
public KiwiBuilder(String modelPath, int numWorkers, int buildOptions, boolean useSBG) {
|
||||
ctor(modelPath, numWorkers, buildOptions, useSBG);
|
||||
}
|
||||
|
||||
public KiwiBuilder(String modelPath, int numWorkers, int buildOptions) {
|
||||
ctor(modelPath, numWorkers, buildOptions, ModelType.none, Kiwi.Dialect.standard);
|
||||
}
|
||||
|
||||
public KiwiBuilder(StreamProvider streamProvider, int numWorkers, int buildOptions) {
|
||||
ctor(streamProvider, numWorkers, buildOptions, ModelType.none, Kiwi.Dialect.standard);
|
||||
ctor(modelPath, numWorkers, buildOptions, false);
|
||||
}
|
||||
|
||||
public KiwiBuilder(String modelPath, int numWorkers) {
|
||||
ctor(modelPath, numWorkers, BuildOption.default_, ModelType.none, Kiwi.Dialect.standard);
|
||||
}
|
||||
|
||||
public KiwiBuilder(StreamProvider streamProvider, int numWorkers) {
|
||||
ctor(streamProvider, numWorkers, BuildOption.default_, ModelType.none, Kiwi.Dialect.standard);
|
||||
ctor(modelPath, numWorkers, BuildOption.default_, false);
|
||||
}
|
||||
|
||||
public KiwiBuilder(String modelPath) {
|
||||
ctor(modelPath, 1, BuildOption.default_, ModelType.none, Kiwi.Dialect.standard);
|
||||
}
|
||||
|
||||
public KiwiBuilder(StreamProvider streamProvider) {
|
||||
ctor(streamProvider, 1, BuildOption.default_, ModelType.none, Kiwi.Dialect.standard);
|
||||
ctor(modelPath, 1, BuildOption.default_, false);
|
||||
}
|
||||
|
||||
protected void finalize() throws Exception {
|
||||
|
|
@ -213,18 +114,25 @@ public class KiwiBuilder implements AutoCloseable {
|
|||
return _inst != 0;
|
||||
}
|
||||
|
||||
private native void ctor(String modelPath, int numWorkers, int buildOptions, int modelType, short enabledDialects);
|
||||
private native void ctor(StreamProvider streamProvider, int numWorkers, int buildOptions, int modelType, short enabledDialects);
|
||||
|
||||
private native void ctor(String modelPath, int numWorkers, int buildOptions, boolean useSBG);
|
||||
|
||||
@Override
|
||||
public native void close() throws Exception;
|
||||
|
||||
public native Kiwi build();
|
||||
public native Kiwi build(TypoTransformer typos, float typoCostThreshold);
|
||||
public native boolean addWord(String form, byte tag, float score);
|
||||
public native boolean addWord(String form, byte tag, float score, String origForm);
|
||||
public native boolean addPreAnalyzedWord(String form, AnalyzedMorph[] analyzed, float score);
|
||||
public native int loadDictionary(String path);
|
||||
|
||||
public Kiwi build() {
|
||||
return build(null, 0);
|
||||
}
|
||||
|
||||
public Kiwi build(TypoTransformer typos) {
|
||||
return build(typos, 2.5f);
|
||||
}
|
||||
|
||||
static {
|
||||
Kiwi.loadLibrary();
|
||||
}
|
||||
|
|
@ -331,49 +239,108 @@ public class KiwiBuilder implements AutoCloseable {
|
|||
.addTypo(new String[]{"ᆴ"}, new String[]{"ᆯᇀ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆵ"}, new String[]{"ᆯᇁ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆶ"}, new String[]{"ᆯᇂ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆹ"}, new String[]{"ᆸᆺ", "ᆸᆻ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆹ"}, new String[]{"ᆸᆺ", "ᆸᆻ"}, 1e-12f, CondVowel.none);
|
||||
|
||||
.addTypo(new String[]{"ᆨᄋ"}, new String[]{"ᄀ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆩᄋ", "ᆨᄀ"}, new String[]{"ᄁ", "ᆨᄀ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆪᄋ", "ᆪᄒ"}, new String[]{"ᆨᄉ", "ᆨᄊ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆫᄋ", "ᆫᄒ"}, new String[]{"ᄂ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆬᄋ", "ᆫᄌ"}, new String[]{"ᆬᄋ", "ᆫᄌ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆭᄋ"}, new String[]{"ᆫᄒ", "ᄂ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆭᄀ"}, new String[]{"ᆫᄏ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆭᄃ"}, new String[]{"ᆫᄐ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆭᄇ"}, new String[]{"ᆫᄑ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆭᄉ"}, new String[]{"ᆫᄉ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆭᄌ"}, new String[]{"ᆫᄎ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆮᄋ"}, new String[]{"ᄃ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆯᄋ", "ᆯᄒ"}, new String[]{"ᄅ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆰᄋ"}, new String[]{"ᆯᄀ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆰᄀ"}, new String[]{"ᆯᄁ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆰᄒ"}, new String[]{"ᆯᄏ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆱᄋ", "ᆱᄒ"}, new String[]{"ᆯᄆ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆲᄋ"}, new String[]{"ᆯᄇ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆲᄇ"}, new String[]{"ᆯᄈ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆲᄒ"}, new String[]{"ᆯᄑ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆳᄋ"}, new String[]{"ᆯᄉ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆳᄉ"}, new String[]{"ᆯᄊ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆴᄋ", "ᆴᄐ", "ᆴᄒ"}, new String[]{"ᆯᄐ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆵᄋ", "ᆵᄑ", "ᆵᄒ"}, new String[]{"ᆯᄑ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆶᄉ"}, new String[]{"ᆯᄉ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆶᄋ", "ᆶᄒ"}, new String[]{"ᆯᄒ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆷᄋ", "ᆷᄒ"}, new String[]{"ᄆ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆸᄋ"}, new String[]{"ᄇ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆸᄇ"}, new String[]{"ᄈ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆹᄋ", "ᆹᄒ"}, new String[]{"ᆸᄉ", "ᆸᄊ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆺᄋ"}, new String[]{"ᄉ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆻᄋ", "ᆺᄉ"}, new String[]{"ᄊ", "ᆺᄉ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆽᄋ"}, new String[]{"ᄌ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆽᄌ"}, new String[]{"ᄍ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆾᄋ", "ᆾᄒ", "ᆽᄒ", "ᇂᄌ", "ᇂᄎ"}, new String[]{"ᄎ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᆿᄋ", "ᆿᄒ", "ᆨᄒ", "ᇂᄀ", "ᇂᄏ"}, new String[]{"ᄏ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᇀᄋ", "ᇀᄒ", "ᆮᄒ", "ᇂᄃ", "ᇂᄐ"}, new String[]{"ᄐ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᇁᄋ", "ᇁᄒ", "ᆸᄒ", "ᇂᄇ", "ᇂᄑ"}, new String[]{"ᄑ"}, 1.f, CondVowel.continual)
|
||||
.addTypo(new String[]{"ᇂᄋ"}, new String[]{"ᄒ"}, 1.f, CondVowel.continual);
|
||||
final public static TypoTransformer basicTypoSetWithContinual = new TypoTransformer()
|
||||
.addTypo(new String[]{"ㅐ", "ㅔ"}, new String[]{"ㅐ", "ㅔ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ㅐ", "ㅔ"}, new String[]{"ㅒ", "ㅖ"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"ㅒ", "ㅖ"}, new String[]{"ㅐ", "ㅔ"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"ㅒ", "ㅖ"}, new String[]{"ㅒ", "ㅖ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ㅚ", "ㅙ", "ㅞ"}, new String[]{"ㅚ", "ㅙ", "ㅞ", "ㅐ", "ㅔ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ㅝ"}, new String[]{"ㅗ", "ㅓ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ㅟ", "ㅢ"}, new String[]{"ㅣ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"위", "의"}, new String[]{"이"}, Float.POSITIVE_INFINITY, CondVowel.none)
|
||||
.addTypo(new String[]{"위", "의"}, new String[]{"이"}, 1.f, CondVowel.any)
|
||||
.addTypo(new String[]{"자", "쟈"}, new String[]{"자", "쟈"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"재", "쟤"}, new String[]{"재", "쟤"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"저", "져"}, new String[]{"저", "져"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"제", "졔"}, new String[]{"제", "졔"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"조", "죠", "줘"}, new String[]{"조", "죠", "줘"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"주", "쥬"}, new String[]{"주", "쥬"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"차", "챠"}, new String[]{"차", "챠"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"채", "챼"}, new String[]{"채", "챼"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"처", "쳐"}, new String[]{"처", "쳐"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"체", "쳬"}, new String[]{"체", "쳬"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"초", "쵸", "춰"}, new String[]{"초", "쵸", "춰"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"추", "츄"}, new String[]{"추", "츄"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"유", "류"}, new String[]{"유", "류"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"므", "무"}, new String[]{"므", "무"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"브", "부"}, new String[]{"브", "부"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"프", "푸"}, new String[]{"프", "푸"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"르", "루"}, new String[]{"르", "루"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"러", "뤄"}, new String[]{"러", "뤄"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆩ", "ᆪ"}, new String[]{"ᆨ", "ᆩ", "ᆪ"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆬ", "ᆭ"}, new String[]{"ᆫ", "ᆬ", "ᆭ"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆰ", "ᆱ", "ᆲ", "ᆳ", "ᆴ", "ᆵ", "ᆶ"}, new String[]{"ᆯ", "ᆰ", "ᆱ", "ᆲ", "ᆳ", "ᆴ", "ᆵ", "ᆶ"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆺ", "ᆻ"}, new String[]{"ᆺ", "ᆻ"}, 1.f, CondVowel.none)
|
||||
|
||||
final public static TypoTransformer basicTypoSetWithContinual = basicTypoSet.copy().update(continualTypoSet);
|
||||
.addTypo(new String[]{"안"}, new String[]{"않"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"맞추", "맞히"}, new String[]{"맞추", "맞히"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"맞춰", "맞혀"}, new String[]{"맞춰", "맞혀"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"받치", "바치", "받히"}, new String[]{"받치", "바치", "받히"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"받쳐", "바쳐", "받혀"}, new String[]{"받쳐", "바쳐", "받혀"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"던", "든"}, new String[]{"던", "든"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"때", "데"}, new String[]{"때", "데"}, 1.5f, CondVowel.none)
|
||||
.addTypo(new String[]{"빛", "빚"}, new String[]{"빛", "빚"}, 1.f, CondVowel.none)
|
||||
|
||||
.addTypo(new String[]{"ᆮ이", "지"}, new String[]{"ᆮ이", "지"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆮ여", "져"}, new String[]{"ᆮ여", "져"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᇀ이", "치"}, new String[]{"ᇀ이", "치"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᇀ여", "쳐"}, new String[]{"ᇀ여", "쳐"}, 1.f, CondVowel.none)
|
||||
|
||||
.addTypo(new String[]{"ᄀ", "ᄁ"}, new String[]{"ᄀ", "ᄁ"}, 1.f, CondVowel.applosive)
|
||||
.addTypo(new String[]{"ᄃ", "ᄄ"}, new String[]{"ᄃ", "ᄄ"}, 1.f, CondVowel.applosive)
|
||||
.addTypo(new String[]{"ᄇ", "ᄈ"}, new String[]{"ᄇ", "ᄈ"}, 1.f, CondVowel.applosive)
|
||||
.addTypo(new String[]{"ᄉ", "ᄊ"}, new String[]{"ᄉ", "ᄊ"}, 1.f, CondVowel.applosive)
|
||||
.addTypo(new String[]{"ᄌ", "ᄍ"}, new String[]{"ᄌ", "ᄍ"}, 1.f, CondVowel.applosive)
|
||||
|
||||
.addTypo(new String[]{"ᇂᄒ", "ᆨᄒ", "ᇂᄀ"}, new String[]{"ᇂᄒ", "ᆨᄒ", "ᇂᄀ"}, 1.f, CondVowel.none)
|
||||
|
||||
.addTypo(new String[]{"ᆨᄂ", "ᆩᄂ", "ᆪᄂ", "ᆿᄂ", "ᆼᄂ"}, new String[]{"ᆨᄂ", "ᆩᄂ", "ᆪᄂ", "ᆿᄂ", "ᆼᄂ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆨᄆ", "ᆩᄆ", "ᆪᄆ", "ᆿᄆ", "ᆼᄆ"}, new String[]{"ᆨᄆ", "ᆩᄆ", "ᆪᄆ", "ᆿᄆ", "ᆼᄆ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆨᄅ", "ᆩᄅ", "ᆪᄅ", "ᆿᄅ", "ᆼᄅ", "ᆼᄂ",}, new String[]{"ᆨᄅ", "ᆩᄅ", "ᆪᄅ", "ᆿᄅ", "ᆼᄅ", "ᆼᄂ",}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆮᄂ", "ᆺᄂ", "ᆻᄂ", "ᆽᄂ", "ᆾᄂ", "ᇀᄂ", "ᆫᄂ"}, new String[]{"ᆮᄂ", "ᆺᄂ", "ᆻᄂ", "ᆽᄂ", "ᆾᄂ", "ᇀᄂ", "ᆫᄂ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆮᄆ", "ᆺᄆ", "ᆻᄆ", "ᆽᄆ", "ᆾᄆ", "ᇀᄆ", "ᆫᄆ"}, new String[]{"ᆮᄆ", "ᆺᄆ", "ᆻᄆ", "ᆽᄆ", "ᆾᄆ", "ᇀᄆ", "ᆫᄆ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆮᄅ", "ᆺᄅ", "ᆻᄅ", "ᆽᄅ", "ᆾᄅ", "ᇀᄅ", "ᆫᄅ", "ᆫᄂ",}, new String[]{"ᆮᄅ", "ᆺᄅ", "ᆻᄅ", "ᆽᄅ", "ᆾᄅ", "ᇀᄅ", "ᆫᄅ", "ᆫᄂ",}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆸᄂ", "ᆹᄂ", "ᇁᄂ", "ᆷᄂ"}, new String[]{"ᆸᄂ", "ᆹᄂ", "ᇁᄂ", "ᆷᄂ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆸᄆ", "ᆹᄆ", "ᇁᄆ", "ᆷᄆ"}, new String[]{"ᆸᄆ", "ᆹᄆ", "ᇁᄆ", "ᆷᄆ"}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆸᄅ", "ᆹᄅ", "ᇁᄅ", "ᆷᄅ", "ᆷᄂ",}, new String[]{"ᆸᄅ", "ᆹᄅ", "ᇁᄅ", "ᆷᄅ", "ᆷᄂ",}, 1.f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆫᄅ", "ᆫᄂ", "ᆯᄅ", "ᆯᄂ"}, new String[]{"ᆫᄅ", "ᆫᄂ", "ᆯᄅ", "ᆯᄂ"}, 1.f, CondVowel.none)
|
||||
|
||||
.addTypo(new String[]{"ᆨᄋ", "ᄀ"}, new String[]{"ᆨᄋ", "ᄀ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆩᄋ", "ᄁ"}, new String[]{"ᆩᄋ", "ᄁ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆫᄋ", "ᆫᄒ", "ᄂ"}, new String[]{"ᆫᄋ", "ᆫᄒ", "ᄂ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆬᄋ", "ᆫᄌ"}, new String[]{"ᆬᄋ", "ᆫᄌ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆭᄋ", "ᄂ"}, new String[]{"ᆭᄋ", "ᄂ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆮᄋ", "ᄃ"}, new String[]{"ᆮᄋ", "ᄃ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆯᄋ", "ᆯᄒ", "ᄅ"}, new String[]{"ᆯᄋ", "ᆯᄒ", "ᄅ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆰᄋ", "ᆯᄀ"}, new String[]{"ᆰᄋ", "ᆯᄀ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆰᄒ", "ᆯᄏ"}, new String[]{"ᆰᄒ", "ᆯᄏ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆷᄋ", "ᄆ"}, new String[]{"ᆷᄋ", "ᄆ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆸᄋ", "ᄇ"}, new String[]{"ᆸᄋ", "ᄇ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆺᄋ", "ᄉ"}, new String[]{"ᆺᄋ", "ᄉ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆻᄋ", "ᆺᄉ", "ᄊ"}, new String[]{"ᆻᄋ", "ᆺᄉ", "ᄊ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆽᄋ", "ᄌ"}, new String[]{"ᆽᄋ", "ᄌ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆾᄋ", "ᆾᄒ", "ᆽᄒ", "ᄎ"}, new String[]{"ᆾᄋ", "ᆾᄒ", "ᆽᄒ", "ᄎ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᆿᄋ", "ᆿᄒ", "ᆨᄒ", "ᄏ"}, new String[]{"ᆿᄋ", "ᆿᄒ", "ᆨᄒ", "ᄏ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᇀᄋ", "ᇀᄒ", "ᆮᄒ", "ᄐ"}, new String[]{"ᇀᄋ", "ᇀᄒ", "ᆮᄒ", "ᄐ"}, 1.f, CondVowel.vowel)
|
||||
.addTypo(new String[]{"ᇁᄋ", "ᇁᄒ", "ᆸᄒ", "ᄑ"}, new String[]{"ᇁᄋ", "ᇁᄒ", "ᆸᄒ", "ᄑ"}, 1.f, CondVowel.vowel)
|
||||
|
||||
.addTypo(new String[]{"은", "는"}, new String[]{"은", "는"}, 2.f, CondVowel.none)
|
||||
.addTypo(new String[]{"을", "를"}, new String[]{"을", "를"}, 2.f, CondVowel.none)
|
||||
|
||||
.addTypo(new String[]{"ㅣ워", "ㅣ어", "ㅕ"}, new String[]{"ㅣ워", "ㅣ어", "ㅕ"}, 1.5f, CondVowel.none)
|
||||
.setContinualTypoCost(1.f)
|
||||
.addTypo(new String[]{"ᆪ"}, new String[]{"ᆨᆺ", "ᆨᆻ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆬ"}, new String[]{"ᆫᆽ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆭ"}, new String[]{"ᆫᇂ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆰ"}, new String[]{"ᆯᆨ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆱ"}, new String[]{"ᆯᆷ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆲ"}, new String[]{"ᆯᆸ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆳ"}, new String[]{"ᆯᆺ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆴ"}, new String[]{"ᆯᇀ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆵ"}, new String[]{"ᆯᇁ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆶ"}, new String[]{"ᆯᇂ"}, 1e-12f, CondVowel.none)
|
||||
.addTypo(new String[]{"ᆹ"}, new String[]{"ᆸᆺ", "ᆸᆻ"}, 1e-12f, CondVowel.none);
|
||||
|
||||
final public static TypoTransformer lengtheningTypoSet = new TypoTransformer().setLengtheningTypoCost(0.25f);
|
||||
}
|
||||
|
|
@ -1,22 +1,14 @@
|
|||
package test;
|
||||
package kr.pe.bab2min;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import kr.pe.bab2min.KiwiBuilder.TypoTransformer;
|
||||
import kr.pe.bab2min.KiwiBuilder.PreparedTypoTransformer;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import kr.pe.bab2min.Kiwi;
|
||||
import kr.pe.bab2min.Kiwi.AnalyzeOption;
|
||||
import kr.pe.bab2min.KiwiBuilder;
|
||||
|
||||
public class KiwiTest {
|
||||
|
||||
private static String modelPath = "../../models/cong/base";
|
||||
private static String modelPath = "../../ModelGenerator";
|
||||
private static Kiwi reusableInst = null;
|
||||
|
||||
Kiwi getReusableKiwi() throws Exception {
|
||||
|
|
@ -36,7 +28,7 @@ public class KiwiTest {
|
|||
public void testInit() throws Exception {
|
||||
System.gc();
|
||||
Kiwi kiwi = Kiwi.init(modelPath);
|
||||
System.out.println(Arrays.deepToString(kiwi.tokenize("자바에서도 Kiwi를!", new AnalyzeOption(Kiwi.Match.allWithNormalizing))));
|
||||
System.out.println(Arrays.deepToString(kiwi.tokenize("자바에서도 Kiwi를!", Kiwi.Match.allWithNormalizing)));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -78,14 +70,14 @@ public class KiwiTest {
|
|||
Kiwi.FutureTokenResult[] futures = new Kiwi.FutureTokenResult[texts.length];
|
||||
|
||||
for(int i = 0; i < texts.length; ++i) {
|
||||
futures[i] = kiwi.asyncAnalyze(texts[i], 1, new AnalyzeOption(Kiwi.Match.allWithNormalizing));
|
||||
futures[i] = kiwi.asyncAnalyze(texts[i], 1, Kiwi.Match.allWithNormalizing);
|
||||
}
|
||||
|
||||
for(Kiwi.FutureTokenResult future : futures) {
|
||||
System.out.println(Arrays.deepToString(future.get()[0].tokens));
|
||||
}
|
||||
|
||||
Kiwi.MultipleTokenResult results = kiwi.analyze(Arrays.stream(texts).iterator(), 1, new AnalyzeOption(Kiwi.Match.allWithNormalizing));
|
||||
Kiwi.MultipleTokenResult results = kiwi.analyze(Arrays.stream(texts).iterator(), 1, Kiwi.Match.allWithNormalizing);
|
||||
while(results.hasNext()) {
|
||||
Kiwi.TokenResult[] result = results.next();
|
||||
System.out.println(Arrays.deepToString(result[0].tokens));
|
||||
|
|
@ -99,7 +91,7 @@ public class KiwiTest {
|
|||
assertEquals(builder.addWord("키위자바", Kiwi.POSTag.nnp, 0.f), true);
|
||||
assertEquals(builder.addWord("좌봐", Kiwi.POSTag.nnp, 0.f, "자바"), true);
|
||||
Kiwi kiwi = builder.build();
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("좌봐에서도 키위자바를!", new AnalyzeOption(Kiwi.Match.allWithNormalizing));
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("좌봐에서도 키위자바를!", Kiwi.Match.allWithNormalizing);
|
||||
assertEquals(tokens[0].form, "좌봐");
|
||||
assertEquals(tokens[3].form, "키위자바");
|
||||
}
|
||||
|
|
@ -115,7 +107,7 @@ public class KiwiTest {
|
|||
};
|
||||
assertEquals(builder.addPreAnalyzedWord("넘해", morphs, 0.f), true);
|
||||
Kiwi kiwi = builder.build();
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("그건좀넘해", new AnalyzeOption(Kiwi.Match.allWithNormalizing));
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("그건좀넘해", Kiwi.Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
}
|
||||
|
||||
|
|
@ -123,10 +115,8 @@ public class KiwiTest {
|
|||
public void testTypos() throws Exception {
|
||||
System.gc();
|
||||
KiwiBuilder builder = new KiwiBuilder(modelPath);
|
||||
Kiwi kiwi = builder.build();
|
||||
PreparedTypoTransformer preparedTypo = KiwiBuilder.basicTypoSet.prepare();
|
||||
AnalyzeOption option = new AnalyzeOption(Kiwi.Match.allWithNormalizing, null, Kiwi.Dialect.standard, 0.0f, preparedTypo, 2.5f);
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("나 죰 도와죠.", option);
|
||||
Kiwi kiwi = builder.build(KiwiBuilder.basicTypoSet);
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("나 죰 도와죠.", Kiwi.Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[1].form, "좀");
|
||||
assertEquals(tokens[4].form, "주");
|
||||
|
|
@ -137,73 +127,45 @@ public class KiwiTest {
|
|||
public void testContinualTypos() throws Exception {
|
||||
System.gc();
|
||||
KiwiBuilder builder = new KiwiBuilder(modelPath);
|
||||
Kiwi kiwi = builder.build();
|
||||
PreparedTypoTransformer preparedTypo = KiwiBuilder.continualTypoSet.prepare();
|
||||
AnalyzeOption option = new AnalyzeOption(Kiwi.Match.allWithNormalizing, null, Kiwi.Dialect.standard, 0.0f, preparedTypo, 2.5f);
|
||||
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("프로그래미", option);
|
||||
Kiwi kiwi = builder.build(KiwiBuilder.continualTypoSet);
|
||||
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("프로그래미", Kiwi.Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[0].form, "프로그램");
|
||||
assertEquals(tokens[1].form, "이");
|
||||
|
||||
tokens = kiwi.tokenize("프로그래믈", option);
|
||||
tokens = kiwi.tokenize("프로그래믈", Kiwi.Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[0].form, "프로그램");
|
||||
assertEquals(tokens[1].form, "을");
|
||||
|
||||
tokens = kiwi.tokenize("오늘사무시레서", option);
|
||||
tokens = kiwi.tokenize("오늘사무시레서", Kiwi.Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[1].form, "사무실");
|
||||
assertEquals(tokens[2].form, "에서");
|
||||
|
||||
tokens = kiwi.tokenize("법원이 기가캤다.", option);
|
||||
tokens = kiwi.tokenize("법원이 기가캤다.", Kiwi.Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[2].form, "기각");
|
||||
assertEquals(tokens[3].form, "하");
|
||||
|
||||
tokens = kiwi.tokenize("하나도 업써.", option);
|
||||
tokens = kiwi.tokenize("하나도 업써.", Kiwi.Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[2].form, "없");
|
||||
assertEquals(tokens[3].form, "어");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCustomTypos() throws Exception {
|
||||
System.gc();
|
||||
KiwiBuilder builder = new KiwiBuilder(modelPath);
|
||||
TypoTransformer typoSet = KiwiBuilder.basicTypoSet.copy()
|
||||
.update(KiwiBuilder.continualTypoSet)
|
||||
.update(KiwiBuilder.lengtheningTypoSet);
|
||||
Kiwi kiwi = builder.build();
|
||||
PreparedTypoTransformer preparedTypo = typoSet.prepare();
|
||||
AnalyzeOption option = new AnalyzeOption(Kiwi.Match.allWithNormalizing, null, Kiwi.Dialect.standard, 0.0f, preparedTypo, 2.5f);
|
||||
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("프로그래미", option);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[0].form, "프로그램");
|
||||
assertEquals(tokens[1].form, "이");
|
||||
|
||||
tokens = kiwi.tokenize("지인짜?", option);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[0].form, "진짜");
|
||||
assertEquals(tokens[1].form, "?");
|
||||
|
||||
tokens = kiwi.tokenize("맗은 물", option);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[0].form, "맑");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBlocklist() throws Exception {
|
||||
System.gc();
|
||||
Kiwi kiwi = getReusableKiwi();
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("좋아하다.", new AnalyzeOption(Kiwi.Match.allWithNormalizing));
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("좋아하다.", Kiwi.Match.allWithNormalizing);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[0].form, "좋아하");
|
||||
|
||||
Kiwi.MorphemeSet morphSet = kiwi.newMorphemeSet();
|
||||
assertTrue(morphSet.add("좋아하") > 0);
|
||||
tokens = kiwi.tokenize("좋아하다.", new AnalyzeOption(Kiwi.Match.allWithNormalizing, morphSet));
|
||||
tokens = kiwi.tokenize("좋아하다.", Kiwi.Match.allWithNormalizing, morphSet);
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[0].form, "좋");
|
||||
}
|
||||
|
|
@ -218,7 +180,7 @@ public class KiwiTest {
|
|||
new Kiwi.PretokenizedSpan(11, 16),
|
||||
new Kiwi.PretokenizedSpan(34, 39),
|
||||
};
|
||||
Kiwi.Token[] tokens = kiwi.tokenize(str, new AnalyzeOption(Kiwi.Match.allWithNormalizing), Arrays.stream(pretokenized).iterator());
|
||||
Kiwi.Token[] tokens = kiwi.tokenize(str, Kiwi.Match.allWithNormalizing, null, Arrays.stream(pretokenized).iterator());
|
||||
assertEquals(tokens[1].form, "패트와 매트");
|
||||
assertEquals(tokens[3].form, "2017년");
|
||||
assertEquals(tokens[13].form, "2016년");
|
||||
|
|
@ -228,7 +190,7 @@ public class KiwiTest {
|
|||
new Kiwi.PretokenizedSpan(30, 32),
|
||||
new Kiwi.PretokenizedSpan(21, 24, new Kiwi.BasicToken[]{ new Kiwi.BasicToken("개봉하", 0, 3, Kiwi.POSTag.vv), new Kiwi.BasicToken("었", 2, 3, Kiwi.POSTag.ep) }),
|
||||
};
|
||||
tokens = kiwi.tokenize(str, new AnalyzeOption(Kiwi.Match.allWithNormalizing), Arrays.stream(pretokenized).iterator());
|
||||
tokens = kiwi.tokenize(str, Kiwi.Match.allWithNormalizing, null, Arrays.stream(pretokenized).iterator());
|
||||
|
||||
assertEquals(tokens[7].form, "개봉하");
|
||||
assertEquals(tokens[7].tag, Kiwi.POSTag.vv);
|
||||
|
|
@ -271,7 +233,7 @@ public class KiwiTest {
|
|||
public void testJoin() throws Exception {
|
||||
System.gc();
|
||||
String text = "맞혔습니까";
|
||||
Kiwi.Token[] tokens = getReusableKiwi().tokenize(text, new AnalyzeOption(Kiwi.Match.allWithNormalizing));
|
||||
Kiwi.Token[] tokens = getReusableKiwi().tokenize(text, Kiwi.Match.allWithNormalizing);
|
||||
Kiwi.JoinableToken[] jtokens = new Kiwi.JoinableToken[tokens.length];
|
||||
for(int i = 0; i < tokens.length; ++i) {
|
||||
jtokens[i] = new Kiwi.JoinableToken(tokens[i]);
|
||||
|
|
@ -279,16 +241,4 @@ public class KiwiTest {
|
|||
String restored = getReusableKiwi().join(jtokens);
|
||||
assertEquals(text, restored);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDialect() throws Exception {
|
||||
System.gc();
|
||||
Kiwi kiwi = Kiwi.init(modelPath, 1, KiwiBuilder.BuildOption.default_, KiwiBuilder.ModelType.none, Kiwi.Dialect.chungcheong);
|
||||
Kiwi.Token[] tokens = kiwi.tokenize("남자 손금은 오약손으루 보는 겨.", new AnalyzeOption(Kiwi.Match.allWithNormalizing, null, Kiwi.Dialect.chungcheong, 6.f));
|
||||
System.out.println(Arrays.deepToString(tokens));
|
||||
assertEquals(tokens[3].form, "오약손");
|
||||
assertTrue((tokens[3].dialect & Kiwi.Dialect.chungcheong) != 0);
|
||||
assertEquals(tokens[7].form, "기");
|
||||
assertTrue((tokens[7].dialect & Kiwi.Dialect.chungcheong) != 0);
|
||||
}
|
||||
}
|
||||
29
bindings/java/proguard-rules.pro
vendored
29
bindings/java/proguard-rules.pro
vendored
|
|
@ -1,29 +0,0 @@
|
|||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
|
||||
# Keep native JNI methods
|
||||
-keepclasseswithmembernames class * {
|
||||
native <methods>;
|
||||
}
|
||||
|
||||
# Keep Kiwi classes
|
||||
-keep class kr.pe.bab2min.** { *; }
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
pluginManagement {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
dependencyResolutionManagement {
|
||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = "android"
|
||||
12
bindings/swift/.gitignore
vendored
12
bindings/swift/.gitignore
vendored
|
|
@ -1,12 +0,0 @@
|
|||
.DS_Store
|
||||
/.build
|
||||
/Packages
|
||||
/*.xcodeproj
|
||||
xcuserdata/
|
||||
DerivedData/
|
||||
.swiftpm/config/registries.json
|
||||
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
|
||||
.netrc
|
||||
*.xcframework
|
||||
build/
|
||||
xcframework/
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
# CMakeLists.txt for iOS/macOS Swift bindings
|
||||
cmake_minimum_required(VERSION 3.19)
|
||||
|
||||
# This file is used to build Kiwi as a static library for iOS/macOS
|
||||
# to be bundled into an XCFramework for Swift Package Manager
|
||||
|
||||
project(kiwi_swift LANGUAGES CXX)
|
||||
|
||||
# Set C++ standard
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# Disable options that are not needed for Swift bindings
|
||||
set(KIWI_BUILD_DYNAMIC OFF CACHE BOOL "Build dynamic library" FORCE)
|
||||
set(KIWI_BUILD_CLI OFF CACHE BOOL "Build CLI tool" FORCE)
|
||||
set(KIWI_BUILD_EVALUATOR OFF CACHE BOOL "Build Evaluator" FORCE)
|
||||
set(KIWI_BUILD_MODEL_BUILDER OFF CACHE BOOL "Build Model Builder" FORCE)
|
||||
set(KIWI_BUILD_TEST OFF CACHE BOOL "Build Test sets" FORCE)
|
||||
set(KIWI_JAVA_BINDING OFF CACHE BOOL "Build Java binding" FORCE)
|
||||
|
||||
# Include the main Kiwi project
|
||||
include(../../CMakeLists.txt)
|
||||
|
||||
# The main CMakeLists.txt should create the kiwi_static target
|
||||
# which we'll use for the XCFramework
|
||||
|
|
@ -1,220 +0,0 @@
|
|||
# Swift Bindings Development Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides technical details for developers working on the Kiwi Swift bindings.
|
||||
|
||||
## Architecture
|
||||
|
||||
The Swift bindings use a direct C interoperability approach:
|
||||
|
||||
```
|
||||
┌─────────────────────┐
|
||||
│ Swift API Layer │ User-friendly Swift interface
|
||||
│ (Kiwi.swift, etc) │
|
||||
└──────────┬──────────┘
|
||||
│
|
||||
┌──────────┴──────────┐
|
||||
│ CKiwi Module │ C API bridging via module.modulemap
|
||||
└──────────┬──────────┘
|
||||
│
|
||||
┌──────────┴──────────┐
|
||||
│ libkiwi_static.a │ Static C++ library
|
||||
└─────────────────────┘
|
||||
```
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
bindings/swift/
|
||||
├── Package.swift # Swift Package Manager manifest
|
||||
├── README.md # User documentation
|
||||
├── CMakeLists.txt # Build configuration
|
||||
├── .gitignore # Git ignore rules
|
||||
├── Sources/
|
||||
│ ├── CKiwi/ # C module for bridging
|
||||
│ │ ├── module.modulemap # C module definition
|
||||
│ │ └── include/ # Symbolic links to C headers
|
||||
│ │ ├── capi.h -> ../../../../../include/kiwi/capi.h
|
||||
│ │ └── Macro.h -> ../../../../../include/kiwi/Macro.h
|
||||
│ └── Kiwi/ # Swift wrapper layer
|
||||
│ ├── Kiwi.swift # Main analyzer class
|
||||
│ ├── KiwiBuilder.swift # Builder pattern
|
||||
│ ├── Token.swift # Token structures
|
||||
│ ├── POSTag.swift # POS tag enum
|
||||
│ ├── MatchOptions.swift # Analysis options
|
||||
│ ├── Dialect.swift # Dialect flags
|
||||
│ ├── Joiner.swift # Morpheme joiner
|
||||
│ ├── MorphemeSet.swift # Morpheme blacklist
|
||||
│ ├── TypoTransformer.swift # Typo correction
|
||||
│ ├── Errors.swift # Error types
|
||||
│ └── Internal/
|
||||
│ └── HandleWrapper.swift # RAII wrapper for C handles
|
||||
├── Tests/
|
||||
│ └── KiwiTests/
|
||||
│ └── KiwiTests.swift # Unit tests
|
||||
└── scripts/
|
||||
└── build-xcframework.sh # XCFramework build script
|
||||
```
|
||||
|
||||
## Key Design Patterns
|
||||
|
||||
### 1. RAII via HandleWrapper
|
||||
|
||||
C handles are wrapped in a Swift class that automatically releases resources:
|
||||
|
||||
```swift
|
||||
internal final class HandleWrapper<H> {
|
||||
let handle: H
|
||||
private let cleanup: (H) -> Void
|
||||
|
||||
init(_ handle: H, cleanup: @escaping (H) -> Void) {
|
||||
self.handle = handle
|
||||
self.cleanup = cleanup
|
||||
}
|
||||
|
||||
deinit {
|
||||
cleanup(handle)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Swift-Friendly Types
|
||||
|
||||
C types are mapped to Swift types:
|
||||
- C `kiwi_h` → Swift `Kiwi` class
|
||||
- C `kiwi_token_info_t` → Swift `Token` struct
|
||||
- C flags → Swift `OptionSet` (MatchOptions, Dialect)
|
||||
- C enums → Swift `enum` (POSTag)
|
||||
|
||||
### 3. Error Handling
|
||||
|
||||
C error codes are converted to Swift errors:
|
||||
|
||||
```swift
|
||||
if result != 0 {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Building
|
||||
|
||||
### For Development (macOS)
|
||||
|
||||
```bash
|
||||
cd bindings/swift
|
||||
swift build
|
||||
swift test
|
||||
```
|
||||
|
||||
### For Production (XCFramework)
|
||||
|
||||
```bash
|
||||
cd bindings/swift
|
||||
./scripts/build-xcframework.sh
|
||||
```
|
||||
|
||||
This creates `xcframework/Kiwi.xcframework` containing:
|
||||
- iOS Device (arm64)
|
||||
- iOS Simulator (arm64 + x86_64)
|
||||
- macOS (arm64 + x86_64)
|
||||
|
||||
## Testing
|
||||
|
||||
### Unit Tests
|
||||
|
||||
Run basic unit tests:
|
||||
```bash
|
||||
cd bindings/swift
|
||||
swift test
|
||||
```
|
||||
|
||||
### Integration Tests
|
||||
|
||||
Integration tests require actual Kiwi model files. These are not included in unit tests to keep them lightweight.
|
||||
|
||||
## CI/CD
|
||||
|
||||
GitHub Actions workflow (`.github/workflows/swift.yml`) runs:
|
||||
1. Swift package build and test
|
||||
2. XCFramework build (on main branch)
|
||||
3. Linux compatibility check
|
||||
|
||||
## Memory Management
|
||||
|
||||
All C handles are automatically released via Swift's ARC system:
|
||||
|
||||
- `Kiwi` → calls `kiwi_close()`
|
||||
- `KiwiBuilder` → calls `kiwi_builder_close()`
|
||||
- `Joiner` → calls `kiwi_joiner_close()`
|
||||
- `MorphemeSet` → calls `kiwi_morphset_close()`
|
||||
- `TypoTransformer` → calls `kiwi_typo_close()` (if owned)
|
||||
|
||||
## Thread Safety
|
||||
|
||||
The Swift bindings maintain the same thread safety guarantees as the underlying C API:
|
||||
- Multiple `Kiwi` instances can be used concurrently
|
||||
- Individual `Kiwi` instances should not be shared across threads without synchronization
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
Potential areas for improvement:
|
||||
|
||||
1. **Binary Distribution**:
|
||||
- Publish pre-built XCFramework via GitHub Releases
|
||||
- Update Package.swift to reference binary framework
|
||||
|
||||
2. **Additional Features**:
|
||||
- Word extraction APIs
|
||||
- Substring extractor
|
||||
- Pattern matching
|
||||
|
||||
3. **Async/Await**:
|
||||
- Swift async/await wrapper for long-running operations
|
||||
- Currently only sync APIs are provided
|
||||
|
||||
4. **Documentation**:
|
||||
- DocC documentation comments
|
||||
- Swift DocC build for hosted documentation
|
||||
|
||||
## Contributing
|
||||
|
||||
When adding new features:
|
||||
|
||||
1. Add C API function calls in appropriate Swift wrapper
|
||||
2. Convert C types to Swift types appropriately
|
||||
3. Add error handling
|
||||
4. Update tests
|
||||
5. Update README with examples
|
||||
6. Update this guide if architecture changes
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Symbol Not Found
|
||||
|
||||
If you get "symbol not found" errors, ensure:
|
||||
- Symbolic links in `Sources/CKiwi/include/` are valid
|
||||
- Headers are properly exposed in module.modulemap
|
||||
- Library is correctly linked
|
||||
|
||||
### Build Failures
|
||||
|
||||
Common issues:
|
||||
- Missing Git LFS files (model files)
|
||||
- Incorrect symbolic link paths
|
||||
- Platform-specific build settings
|
||||
|
||||
### Runtime Errors
|
||||
|
||||
Check:
|
||||
- Model files are accessible
|
||||
- Correct path to model directory
|
||||
- Sufficient memory available
|
||||
|
||||
## License
|
||||
|
||||
Swift bindings are licensed under the same license as Kiwi.
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
// swift-tools-version: 5.7
|
||||
// The swift-tools-version declares the minimum version of Swift required to build this package.
|
||||
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "Kiwi",
|
||||
platforms: [
|
||||
.iOS(.v12),
|
||||
.macOS(.v10_14)
|
||||
],
|
||||
products: [
|
||||
.library(
|
||||
name: "Kiwi",
|
||||
targets: ["Kiwi"]),
|
||||
],
|
||||
dependencies: [],
|
||||
targets: [
|
||||
.target(
|
||||
name: "CKiwi",
|
||||
dependencies: [],
|
||||
path: "Sources/CKiwi",
|
||||
linkerSettings: [
|
||||
.linkedLibrary("c++"),
|
||||
.linkedLibrary("z"),
|
||||
]
|
||||
),
|
||||
.target(
|
||||
name: "Kiwi",
|
||||
dependencies: ["CKiwi"],
|
||||
path: "Sources/Kiwi"
|
||||
),
|
||||
.testTarget(
|
||||
name: "KiwiTests",
|
||||
dependencies: ["Kiwi"],
|
||||
path: "Tests/KiwiTests"
|
||||
),
|
||||
]
|
||||
)
|
||||
|
|
@ -1,383 +0,0 @@
|
|||
# Kiwi Swift 바인딩
|
||||
|
||||
한국어 형태소 분석기 Kiwi의 Swift 바인딩입니다. iOS 및 macOS 앱에서 한국어 자연어 처리를 수행할 수 있습니다.
|
||||
|
||||
## 목차
|
||||
|
||||
- [요구 사항](#요구-사항)
|
||||
- [설치](#설치)
|
||||
- [모델 파일 설정](#모델-파일-설정)
|
||||
- [기본 사용법](#기본-사용법)
|
||||
- [고급 기능](#고급-기능)
|
||||
- [API 레퍼런스](#api-레퍼런스)
|
||||
- [품사 태그](#품사-태그)
|
||||
|
||||
## 요구 사항
|
||||
|
||||
- iOS 12.0+ / macOS 10.14+
|
||||
- Swift 5.7+
|
||||
- Xcode 14.0+
|
||||
|
||||
## 설치
|
||||
|
||||
### Swift Package Manager (권장)
|
||||
|
||||
#### 방법 1: Xcode에서 추가
|
||||
|
||||
1. Xcode에서 **File → Add Package Dependencies...** 선택
|
||||
2. 저장소 URL 입력: `https://github.com/bab2min/Kiwi.git`
|
||||
3. 버전 선택 후 **Add Package** 클릭
|
||||
|
||||
#### 방법 2: Package.swift에 직접 추가
|
||||
|
||||
```swift
|
||||
// Package.swift
|
||||
dependencies: [
|
||||
.package(url: "https://github.com/bab2min/Kiwi.git", from: "0.22.0")
|
||||
],
|
||||
targets: [
|
||||
.target(
|
||||
name: "YourApp",
|
||||
dependencies: ["Kiwi"]
|
||||
)
|
||||
]
|
||||
```
|
||||
|
||||
## 모델 파일 설정
|
||||
|
||||
Kiwi를 사용하려면 모델 파일이 필요합니다. 모델 파일은 [Kiwi 릴리즈 페이지](https://github.com/bab2min/Kiwi/releases)에서 다운로드할 수 있습니다.
|
||||
|
||||
### iOS/macOS 앱에서 모델 번들링
|
||||
|
||||
1. 모델 폴더를 Xcode 프로젝트에 드래그하여 추가
|
||||
2. **Copy items if needed** 체크
|
||||
3. **Create folder references** 선택 (중요!)
|
||||
4. 타겟에 추가되었는지 확인
|
||||
|
||||
```
|
||||
YourApp/
|
||||
├── Resources/
|
||||
│ └── KiwiModels/ ← 모델 폴더
|
||||
│ ├── combiningRule.txt
|
||||
│ ├── default.dict
|
||||
│ ├── extract.mdl
|
||||
│ └── ...
|
||||
```
|
||||
|
||||
## 기본 사용법
|
||||
|
||||
### 형태소 분석
|
||||
|
||||
```swift
|
||||
import Kiwi
|
||||
|
||||
do {
|
||||
// 1. KiwiBuilder 생성 (번들에서 모델 로드)
|
||||
let builder = try KiwiBuilder(
|
||||
bundle: .main,
|
||||
modelDirectory: "KiwiModels"
|
||||
)
|
||||
|
||||
// 2. Kiwi 인스턴스 빌드
|
||||
let kiwi = try builder.build()
|
||||
|
||||
// 3. 형태소 분석
|
||||
let tokens = try kiwi.tokenize("안녕하세요, 키위 형태소 분석기입니다!")
|
||||
|
||||
for token in tokens {
|
||||
print("\(token.form)/\(token.tag.description)")
|
||||
}
|
||||
// 출력:
|
||||
// 안녕/NNG
|
||||
// 하/XSA
|
||||
// 시/EP
|
||||
// 어요/EF
|
||||
// ,/SP
|
||||
// 키위/NNG
|
||||
// 형태소/NNG
|
||||
// 분석기/NNG
|
||||
// 이/VCP
|
||||
// ㅂ니다/EF
|
||||
// !/SF
|
||||
|
||||
} catch {
|
||||
print("오류: \(error)")
|
||||
}
|
||||
```
|
||||
|
||||
### 경로로 모델 로드
|
||||
|
||||
```swift
|
||||
// 직접 경로 지정
|
||||
let builder = try KiwiBuilder(
|
||||
modelPath: "/path/to/models",
|
||||
numThreads: 4 // 스레드 수 지정 (-1: 자동)
|
||||
)
|
||||
```
|
||||
|
||||
### 다중 분석 결과 얻기
|
||||
|
||||
```swift
|
||||
// topN 개의 분석 후보 반환
|
||||
let results = try kiwi.analyze("감기는 감기다", topN: 3)
|
||||
|
||||
for (index, result) in results.enumerated() {
|
||||
print("후보 \(index + 1) (점수: \(result.score)):")
|
||||
for token in result.tokens {
|
||||
print(" \(token.form)/\(token.tag.description)")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 문장 분리
|
||||
|
||||
```swift
|
||||
let text = "안녕하세요. 키위입니다. 형태소 분석을 합니다."
|
||||
let sentences = try kiwi.splitIntoSentences(text)
|
||||
|
||||
for sentence in sentences {
|
||||
print("문장: \(sentence.text)")
|
||||
print(" 시작: \(sentence.start), 길이: \(sentence.length)")
|
||||
}
|
||||
// 출력:
|
||||
// 문장: 안녕하세요.
|
||||
// 시작: 0, 길이: 18
|
||||
// 문장: 키위입니다.
|
||||
// 시작: 19, 길이: 16
|
||||
// 문장: 형태소 분석을 합니다.
|
||||
// 시작: 36, 길이: 28
|
||||
```
|
||||
|
||||
## 고급 기능
|
||||
|
||||
### 사용자 사전 추가
|
||||
|
||||
```swift
|
||||
let builder = try KiwiBuilder(bundle: .main, modelDirectory: "KiwiModels")
|
||||
|
||||
// 단어 직접 추가
|
||||
try builder.addWord("키위피", tag: .nnp, score: 0.0) // 고유명사로 추가
|
||||
try builder.addWord("딥러닝", tag: .nng, score: 0.0) // 일반명사로 추가
|
||||
|
||||
// 사전 파일 로드 (탭으로 구분된 형식: 단어\t품사\t점수)
|
||||
try builder.loadDict("/path/to/user_dict.txt")
|
||||
|
||||
let kiwi = try builder.build()
|
||||
```
|
||||
|
||||
### 분석 옵션 설정
|
||||
|
||||
```swift
|
||||
// 기본 옵션으로 분석
|
||||
let tokens1 = try kiwi.tokenize("www.example.com", options: .all)
|
||||
|
||||
// URL, 이메일 등 패턴 매칭 + 정규화
|
||||
let tokens2 = try kiwi.tokenize("www.example.com", options: .allWithNormalizing)
|
||||
|
||||
// 개별 옵션 조합
|
||||
let customOptions: MatchOptions = [.url, .email, .normalizeCoda]
|
||||
let tokens3 = try kiwi.tokenize("test@test.com", options: customOptions)
|
||||
```
|
||||
|
||||
**MatchOptions 목록:**
|
||||
|
||||
| 옵션 | 설명 |
|
||||
|------|------|
|
||||
| `.url` | URL 패턴 인식 |
|
||||
| `.email` | 이메일 패턴 인식 |
|
||||
| `.hashtag` | 해시태그 인식 |
|
||||
| `.mention` | 멘션(@) 인식 |
|
||||
| `.serial` | 일련번호 인식 |
|
||||
| `.normalizeCoda` | 받침 정규화 (잇다 → 있다) |
|
||||
| `.joinNounPrefix` | 체언 접두사 결합 |
|
||||
| `.joinNounSuffix` | 체언 접미사 결합 |
|
||||
| `.joinVerbSuffix` | 동사 접미사 결합 |
|
||||
| `.joinAdjSuffix` | 형용사 접미사 결합 |
|
||||
| `.splitComplex` | 복합 형태소 분리 |
|
||||
| `.all` | 기본 전체 옵션 |
|
||||
| `.allWithNormalizing` | 전체 + 정규화 |
|
||||
|
||||
### 방언 지원
|
||||
|
||||
```swift
|
||||
let builder = try KiwiBuilder(
|
||||
bundle: .main,
|
||||
modelDirectory: "KiwiModels",
|
||||
enabledDialects: [.standard, .gyeongsang, .jeolla]
|
||||
)
|
||||
|
||||
let kiwi = try builder.build()
|
||||
```
|
||||
|
||||
**Dialect 목록:**
|
||||
|
||||
| 옵션 | 설명 |
|
||||
|------|------|
|
||||
| `.standard` | 표준어 (기본) |
|
||||
| `.gyeonggi` | 경기 방언 |
|
||||
| `.chungcheong` | 충청 방언 |
|
||||
| `.gangwon` | 강원 방언 |
|
||||
| `.gyeongsang` | 경상 방언 |
|
||||
| `.jeolla` | 전라 방언 |
|
||||
| `.jeju` | 제주 방언 |
|
||||
| `.hwanghae` | 황해 방언 |
|
||||
| `.hamgyeong` | 함경 방언 |
|
||||
| `.pyeongan` | 평안 방언 |
|
||||
| `.archaic` | 고어 |
|
||||
|
||||
### 오타 교정
|
||||
|
||||
```swift
|
||||
// 기본 오타 교정기 사용
|
||||
let typoTransformer = try TypoTransformer.basic()
|
||||
|
||||
let kiwi = try builder.build(
|
||||
typoTransformer: typoTransformer,
|
||||
typoCostThreshold: 2.5
|
||||
)
|
||||
|
||||
let tokens = try kiwi.tokenize("장례희망이 뭐야?") // 오타 자동 교정
|
||||
```
|
||||
|
||||
**TypoTransformer 유형:**
|
||||
|
||||
```swift
|
||||
// 빈 트랜스포머
|
||||
let empty = try TypoTransformer()
|
||||
|
||||
// 기본 오타 세트
|
||||
let basic = try TypoTransformer.basic()
|
||||
|
||||
// 다양한 오타 세트
|
||||
let continual = try TypoTransformer.default(.continualTypoSet)
|
||||
let withLengthening = try TypoTransformer.default(.basicTypoSetWithContinualAndLengthening)
|
||||
```
|
||||
|
||||
### 형태소 결합 (Joiner)
|
||||
|
||||
형태소를 결합하여 자연스러운 문장을 생성합니다.
|
||||
|
||||
```swift
|
||||
let joiner = try kiwi.createJoiner()
|
||||
|
||||
try joiner.add(form: "먹", tag: .vv) // 동사 어간
|
||||
try joiner.add(form: "었", tag: .ep) // 선어말 어미
|
||||
try joiner.add(form: "다", tag: .ef) // 종결 어미
|
||||
|
||||
let text = try joiner.join()
|
||||
print(text) // "먹었다"
|
||||
```
|
||||
|
||||
```swift
|
||||
// 불규칙 활용 자동 처리
|
||||
let joiner = try kiwi.createJoiner()
|
||||
|
||||
try joiner.add(form: "듣", tag: .vvi) // ㄷ불규칙 동사
|
||||
try joiner.add(form: "어", tag: .ec)
|
||||
|
||||
let text = try joiner.join()
|
||||
print(text) // "들어" (ㄷ → ㄹ 불규칙 적용)
|
||||
```
|
||||
|
||||
### 형태소 블랙리스트
|
||||
|
||||
특정 형태소를 분석에서 제외합니다.
|
||||
|
||||
```swift
|
||||
let morphset = try kiwi.createMorphemeSet()
|
||||
try morphset.add(form: "가", tag: .jks) // 주격조사 '가' 제외
|
||||
|
||||
// analyze 시 blocklist로 사용 (향후 지원 예정)
|
||||
```
|
||||
|
||||
### Token 정보 활용
|
||||
|
||||
```swift
|
||||
let tokens = try kiwi.tokenize("서울에서 부산까지")
|
||||
|
||||
for token in tokens {
|
||||
print("""
|
||||
형태: \(token.form)
|
||||
품사: \(token.tag.description)
|
||||
위치: \(token.position) (길이: \(token.length))
|
||||
어절 번호: \(token.wordPosition)
|
||||
문장 번호: \(token.sentencePosition)
|
||||
점수: \(token.score)
|
||||
오타 비용: \(token.typoCost)
|
||||
""")
|
||||
}
|
||||
```
|
||||
|
||||
### JSON 직렬화
|
||||
|
||||
`Token`, `TokenResult`, `Sentence`는 모두 `Codable`을 준수합니다.
|
||||
|
||||
```swift
|
||||
let tokens = try kiwi.tokenize("안녕하세요")
|
||||
|
||||
let encoder = JSONEncoder()
|
||||
encoder.outputFormatting = .prettyPrinted
|
||||
|
||||
let jsonData = try encoder.encode(tokens)
|
||||
let jsonString = String(data: jsonData, encoding: .utf8)!
|
||||
print(jsonString)
|
||||
```
|
||||
|
||||
## API 레퍼런스
|
||||
|
||||
### KiwiBuilder
|
||||
|
||||
| 메서드 | 설명 |
|
||||
|--------|------|
|
||||
| `init(modelPath:numThreads:options:enabledDialects:)` | 경로로 초기화 |
|
||||
| `init(bundle:modelDirectory:numThreads:options:enabledDialects:)` | 번들로 초기화 |
|
||||
| `addWord(_:tag:score:)` | 사용자 단어 추가 |
|
||||
| `loadDict(_:)` | 사전 파일 로드 |
|
||||
| `build(typoTransformer:typoCostThreshold:)` | Kiwi 인스턴스 생성 |
|
||||
|
||||
### Kiwi
|
||||
|
||||
| 메서드/프로퍼티 | 설명 |
|
||||
|----------------|------|
|
||||
| `version` (static) | Kiwi 버전 문자열 |
|
||||
| `analyze(_:topN:options:)` | 형태소 분석 (다중 결과) |
|
||||
| `tokenize(_:options:)` | 형태소 분석 (최상위 결과만) |
|
||||
| `splitIntoSentences(_:options:)` | 문장 분리 |
|
||||
| `createJoiner(useLMSearch:)` | Joiner 생성 |
|
||||
| `createMorphemeSet()` | MorphemeSet 생성 |
|
||||
|
||||
### Token
|
||||
|
||||
| 프로퍼티 | 타입 | 설명 |
|
||||
|----------|------|------|
|
||||
| `form` | `String` | 형태소 문자열 |
|
||||
| `tag` | `POSTag` | 품사 태그 |
|
||||
| `position` | `Int` | 원문에서의 위치 (UTF-16) |
|
||||
| `length` | `Int` | 길이 (UTF-16) |
|
||||
| `score` | `Float` | 언어 모델 점수 |
|
||||
| `wordPosition` | `Int` | 어절 번호 |
|
||||
| `sentencePosition` | `Int` | 문장 번호 |
|
||||
| `typoCost` | `Float` | 오타 교정 비용 (0이면 교정 안 됨) |
|
||||
|
||||
### Joiner
|
||||
|
||||
| 메서드 | 설명 |
|
||||
|--------|------|
|
||||
| `add(form:tag:autoDetectIrregular:)` | 형태소 추가 |
|
||||
| `join()` | 결합된 텍스트 반환 |
|
||||
|
||||
## 에러 처리
|
||||
|
||||
```swift
|
||||
do {
|
||||
let builder = try KiwiBuilder(modelPath: "/invalid/path")
|
||||
} catch KiwiError.modelNotFound(let path) {
|
||||
print("모델을 찾을 수 없습니다: \(path)")
|
||||
} catch KiwiError.operationFailed(let message) {
|
||||
print("작업 실패: \(message)")
|
||||
} catch KiwiError.invalidHandle {
|
||||
print("잘못된 핸들")
|
||||
} catch {
|
||||
print("알 수 없는 오류: \(error)")
|
||||
}
|
||||
```
|
||||
|
|
@ -1 +0,0 @@
|
|||
../../../../../include/kiwi/Macro.h
|
||||
|
|
@ -1 +0,0 @@
|
|||
../../../../../include/kiwi/capi.h
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
module CKiwi {
|
||||
header "include/capi.h"
|
||||
header "include/Macro.h"
|
||||
export *
|
||||
}
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// Korean dialect flags
|
||||
public struct Dialect: OptionSet, Codable {
|
||||
public let rawValue: Int32
|
||||
|
||||
public init(rawValue: Int32) {
|
||||
self.rawValue = rawValue
|
||||
}
|
||||
|
||||
/// Standard Korean (표준어)
|
||||
public static let standard = Dialect(rawValue: 0)
|
||||
|
||||
/// Gyeonggi dialect (경기 방언)
|
||||
public static let gyeonggi = Dialect(rawValue: 1 << 0)
|
||||
|
||||
/// Chungcheong dialect (충청 방언)
|
||||
public static let chungcheong = Dialect(rawValue: 1 << 1)
|
||||
|
||||
/// Gangwon dialect (강원 방언)
|
||||
public static let gangwon = Dialect(rawValue: 1 << 2)
|
||||
|
||||
/// Gyeongsang dialect (경상 방언)
|
||||
public static let gyeongsang = Dialect(rawValue: 1 << 3)
|
||||
|
||||
/// Jeolla dialect (전라 방언)
|
||||
public static let jeolla = Dialect(rawValue: 1 << 4)
|
||||
|
||||
/// Jeju dialect (제주 방언)
|
||||
public static let jeju = Dialect(rawValue: 1 << 5)
|
||||
|
||||
/// Hwanghae dialect (황해 방언)
|
||||
public static let hwanghae = Dialect(rawValue: 1 << 6)
|
||||
|
||||
/// Hamgyeong dialect (함경 방언)
|
||||
public static let hamgyeong = Dialect(rawValue: 1 << 7)
|
||||
|
||||
/// Pyeongan dialect (평안 방언)
|
||||
public static let pyeongan = Dialect(rawValue: 1 << 8)
|
||||
|
||||
/// Archaic Korean (고어)
|
||||
public static let archaic = Dialect(rawValue: 1 << 9)
|
||||
|
||||
/// All dialects
|
||||
public static let all = Dialect(rawValue: (1 << 10) - 1)
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// Errors that can be thrown by Kiwi operations
|
||||
public enum KiwiError: Error, LocalizedError {
|
||||
/// Invalid handle passed to function
|
||||
case invalidHandle
|
||||
|
||||
/// Invalid index or parameter
|
||||
case invalidIndex
|
||||
|
||||
/// Operation failed with error message
|
||||
case operationFailed(String)
|
||||
|
||||
/// General failure
|
||||
case failure(String)
|
||||
|
||||
/// Model file not found
|
||||
case modelNotFound(String)
|
||||
|
||||
/// Invalid UTF-8 string
|
||||
case invalidString
|
||||
|
||||
public var errorDescription: String? {
|
||||
switch self {
|
||||
case .invalidHandle:
|
||||
return "Invalid handle"
|
||||
case .invalidIndex:
|
||||
return "Invalid index"
|
||||
case .operationFailed(let message):
|
||||
return "Operation failed: \(message)"
|
||||
case .failure(let message):
|
||||
return message
|
||||
case .modelNotFound(let path):
|
||||
return "Model not found at path: \(path)"
|
||||
case .invalidString:
|
||||
return "Invalid UTF-8 string"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// Internal wrapper for C handles that provides RAII-style cleanup
|
||||
internal final class HandleWrapper<H> {
|
||||
let handle: H
|
||||
private let cleanup: (H) -> Void
|
||||
|
||||
init(_ handle: H, cleanup: @escaping (H) -> Void) {
|
||||
self.handle = handle
|
||||
self.cleanup = cleanup
|
||||
}
|
||||
|
||||
deinit {
|
||||
cleanup(handle)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
import Foundation
|
||||
import CKiwi
|
||||
|
||||
/// Joiner for combining morphemes into text
|
||||
public final class Joiner {
|
||||
private var wrapper: HandleWrapper<kiwi_joiner_h>?
|
||||
|
||||
internal init(handle: kiwi_joiner_h) {
|
||||
self.wrapper = HandleWrapper(handle) { kiwi_joiner_close($0) }
|
||||
}
|
||||
|
||||
/// Add a morpheme to the joiner
|
||||
/// - Parameters:
|
||||
/// - form: Form of the morpheme
|
||||
/// - tag: Part-of-speech tag
|
||||
/// - autoDetectIrregular: Automatically detect irregular conjugation (default: true)
|
||||
/// - Throws: KiwiError if operation fails
|
||||
public func add(form: String, tag: POSTag, autoDetectIrregular: Bool = true) throws {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
let result = kiwi_joiner_add(handle, form, tag.description, autoDetectIrregular ? 1 : 0)
|
||||
|
||||
if result != 0 {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to add morpheme to joiner")
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the joined text from all added morphemes
|
||||
/// - Returns: Combined text
|
||||
/// - Throws: KiwiError if operation fails
|
||||
public func join() throws -> String {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
guard let resultPtr = kiwi_joiner_get(handle) else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to get joined text")
|
||||
}
|
||||
|
||||
return String(cString: resultPtr)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,206 +0,0 @@
|
|||
import Foundation
|
||||
import CKiwi
|
||||
|
||||
/// Main Kiwi morphological analyzer class
|
||||
public final class Kiwi {
|
||||
private var wrapper: HandleWrapper<kiwi_h>?
|
||||
|
||||
internal init(handle: kiwi_h) {
|
||||
self.wrapper = HandleWrapper(handle) { kiwi_close($0) }
|
||||
}
|
||||
|
||||
/// Get Kiwi version string
|
||||
public static var version: String {
|
||||
if let versionPtr = kiwi_version() {
|
||||
return String(cString: versionPtr)
|
||||
}
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
/// Analyze text and return morphological analysis results
|
||||
/// - Parameters:
|
||||
/// - text: Text to analyze
|
||||
/// - topN: Number of top results to return (default: 1)
|
||||
/// - options: Match options (default: .allWithNormalizing)
|
||||
/// - typoTransformer: Optional prepared typo transformer for typo correction
|
||||
/// - typoThreshold: Typo cost threshold (default: 2.5)
|
||||
/// - Returns: Array of token result candidates
|
||||
/// - Throws: KiwiError if analysis fails
|
||||
public func analyze(
|
||||
_ text: String,
|
||||
topN: Int = 1,
|
||||
options: MatchOptions = .allWithNormalizing,
|
||||
typoTransformer: PreparedTypoTransformer? = nil,
|
||||
typoThreshold: Float = 2.5
|
||||
) throws -> [TokenResult] {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
var analyzeOption = kiwi_analyze_option_t()
|
||||
analyzeOption.match_options = options.rawValue
|
||||
analyzeOption.blocklist = nil
|
||||
analyzeOption.open_ending = 0
|
||||
analyzeOption.allowed_dialects = 0
|
||||
analyzeOption.dialect_cost = 3.0
|
||||
analyzeOption.typo_transformer = typoTransformer?.handle
|
||||
analyzeOption.typo_threshold = typoThreshold
|
||||
|
||||
guard let result = kiwi_analyze(handle, text, Int32(topN), analyzeOption, nil) else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Analysis failed")
|
||||
}
|
||||
|
||||
defer { kiwi_res_close(result) }
|
||||
|
||||
let resultSize = kiwi_res_size(result)
|
||||
guard resultSize >= 0 else {
|
||||
throw KiwiError.operationFailed("Invalid result size")
|
||||
}
|
||||
|
||||
var results: [TokenResult] = []
|
||||
results.reserveCapacity(Int(resultSize))
|
||||
|
||||
for i in 0..<resultSize {
|
||||
let prob = kiwi_res_prob(result, i)
|
||||
let wordNum = kiwi_res_word_num(result, i)
|
||||
guard wordNum >= 0 else {
|
||||
continue
|
||||
}
|
||||
|
||||
var tokens: [Token] = []
|
||||
tokens.reserveCapacity(Int(wordNum))
|
||||
|
||||
for j in 0..<wordNum {
|
||||
if let formPtr = kiwi_res_form(result, i, j),
|
||||
let tokenInfo = kiwi_res_token_info(result, i, j) {
|
||||
let form = String(cString: formPtr)
|
||||
let token = Token(form: form, tokenInfo: tokenInfo.pointee)
|
||||
tokens.append(token)
|
||||
}
|
||||
}
|
||||
|
||||
results.append(TokenResult(score: prob, tokens: tokens))
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
/// Tokenize text and return simple token array (uses best analysis result)
|
||||
/// - Parameters:
|
||||
/// - text: Text to tokenize
|
||||
/// - options: Match options (default: .allWithNormalizing)
|
||||
/// - typoTransformer: Optional prepared typo transformer for typo correction
|
||||
/// - typoThreshold: Typo cost threshold (default: 2.5)
|
||||
/// - Returns: Array of tokens
|
||||
/// - Throws: KiwiError if tokenization fails
|
||||
public func tokenize(
|
||||
_ text: String,
|
||||
options: MatchOptions = .allWithNormalizing,
|
||||
typoTransformer: PreparedTypoTransformer? = nil,
|
||||
typoThreshold: Float = 2.5
|
||||
) throws -> [Token] {
|
||||
let results = try analyze(text, topN: 1, options: options, typoTransformer: typoTransformer, typoThreshold: typoThreshold)
|
||||
return results.first?.tokens ?? []
|
||||
}
|
||||
|
||||
/// Split text into sentences
|
||||
/// - Parameters:
|
||||
/// - text: Text to split
|
||||
/// - options: Match options (default: .all)
|
||||
/// - Returns: Array of sentences
|
||||
/// - Throws: KiwiError if splitting fails
|
||||
public func splitIntoSentences(
|
||||
_ text: String,
|
||||
options: MatchOptions = .all
|
||||
) throws -> [Sentence] {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
guard let result = kiwi_split_into_sents(handle, text, options.rawValue, nil) else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Sentence splitting failed")
|
||||
}
|
||||
|
||||
defer { kiwi_ss_close(result) }
|
||||
|
||||
let sentenceCount = kiwi_ss_size(result)
|
||||
guard sentenceCount >= 0 else {
|
||||
throw KiwiError.operationFailed("Invalid sentence count")
|
||||
}
|
||||
|
||||
var sentences: [Sentence] = []
|
||||
sentences.reserveCapacity(Int(sentenceCount))
|
||||
|
||||
let textUtf8Count = text.utf8.count
|
||||
for i in 0..<sentenceCount {
|
||||
let start = kiwi_ss_begin_position(result, i)
|
||||
let end = kiwi_ss_end_position(result, i)
|
||||
|
||||
// Validate bounds before indexing
|
||||
if start >= 0 && end >= start && Int(end) <= textUtf8Count {
|
||||
let startIdx = text.utf8.index(text.utf8.startIndex, offsetBy: Int(start))
|
||||
let endIdx = text.utf8.index(text.utf8.startIndex, offsetBy: Int(end))
|
||||
if let sentenceText = String(text.utf8[startIdx..<endIdx]) {
|
||||
sentences.append(Sentence(
|
||||
text: sentenceText,
|
||||
start: Int(start),
|
||||
length: Int(end - start)
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sentences
|
||||
}
|
||||
|
||||
/// Create a new Joiner for combining morphemes into text
|
||||
/// - Parameter useLMSearch: Use language model search for optimal POS selection (default: true)
|
||||
/// - Returns: A new Joiner instance
|
||||
/// - Throws: KiwiError if creation fails
|
||||
public func createJoiner(useLMSearch: Bool = true) throws -> Joiner {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
guard let joinerHandle = kiwi_new_joiner(handle, useLMSearch ? 1 : 0) else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to create joiner")
|
||||
}
|
||||
|
||||
return Joiner(handle: joinerHandle)
|
||||
}
|
||||
|
||||
/// Create a new MorphemeSet (for use as blacklist in analysis)
|
||||
/// - Returns: A new MorphemeSet instance
|
||||
/// - Throws: KiwiError if creation fails
|
||||
public func createMorphemeSet() throws -> MorphemeSet {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
guard let morphsetHandle = kiwi_new_morphset(handle) else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to create morpheme set")
|
||||
}
|
||||
|
||||
return MorphemeSet(handle: morphsetHandle)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,169 +0,0 @@
|
|||
import Foundation
|
||||
import CKiwi
|
||||
|
||||
/// Build options for KiwiBuilder
|
||||
public struct BuildOptions: OptionSet {
|
||||
public let rawValue: Int32
|
||||
|
||||
public init(rawValue: Int32) {
|
||||
self.rawValue = rawValue
|
||||
}
|
||||
|
||||
/// Integrate allomorphs
|
||||
public static let integrateAllomorph = BuildOptions(rawValue: 1)
|
||||
|
||||
/// Load default dictionary
|
||||
public static let loadDefaultDict = BuildOptions(rawValue: 2)
|
||||
|
||||
/// Load typo dictionary
|
||||
public static let loadTypoDict = BuildOptions(rawValue: 4)
|
||||
|
||||
/// Load multi-dict
|
||||
public static let loadMultiDict = BuildOptions(rawValue: 8)
|
||||
|
||||
/// Default build options
|
||||
public static let `default`: BuildOptions = [
|
||||
.integrateAllomorph,
|
||||
.loadDefaultDict,
|
||||
.loadTypoDict,
|
||||
.loadMultiDict
|
||||
]
|
||||
}
|
||||
|
||||
/// Builder class for creating Kiwi instances
|
||||
public final class KiwiBuilder {
|
||||
private var wrapper: HandleWrapper<kiwi_builder_h>?
|
||||
|
||||
/// Initialize KiwiBuilder with model path
|
||||
/// - Parameters:
|
||||
/// - modelPath: Path to the model directory
|
||||
/// - numThreads: Number of threads to use (-1 for automatic)
|
||||
/// - options: Build options
|
||||
/// - enabledDialects: Enabled dialects
|
||||
/// - Throws: KiwiError if initialization fails
|
||||
public init(
|
||||
modelPath: String,
|
||||
numThreads: Int = -1,
|
||||
options: BuildOptions = .default,
|
||||
enabledDialects: Dialect = .standard
|
||||
) throws {
|
||||
let handle = kiwi_builder_init(
|
||||
modelPath,
|
||||
Int32(numThreads),
|
||||
Int32(options.rawValue),
|
||||
Int32(enabledDialects.rawValue)
|
||||
)
|
||||
|
||||
guard let handle = handle else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to initialize KiwiBuilder")
|
||||
}
|
||||
|
||||
self.wrapper = HandleWrapper(handle) { kiwi_builder_close($0) }
|
||||
}
|
||||
|
||||
/// Initialize KiwiBuilder from a Bundle
|
||||
/// - Parameters:
|
||||
/// - bundle: Bundle containing the model files
|
||||
/// - modelDirectory: Name of the model directory in the bundle (default: "KiwiModels")
|
||||
/// - numThreads: Number of threads to use (-1 for automatic)
|
||||
/// - options: Build options
|
||||
/// - enabledDialects: Enabled dialects
|
||||
/// - Throws: KiwiError if initialization fails or model not found
|
||||
public convenience init(
|
||||
bundle: Bundle,
|
||||
modelDirectory: String = "KiwiModels",
|
||||
numThreads: Int = -1,
|
||||
options: BuildOptions = .default,
|
||||
enabledDialects: Dialect = .standard
|
||||
) throws {
|
||||
guard let modelPath = bundle.resourcePath?
|
||||
.appending("/\(modelDirectory)") else {
|
||||
throw KiwiError.modelNotFound("Model directory not found in bundle")
|
||||
}
|
||||
|
||||
try self.init(
|
||||
modelPath: modelPath,
|
||||
numThreads: numThreads,
|
||||
options: options,
|
||||
enabledDialects: enabledDialects
|
||||
)
|
||||
}
|
||||
|
||||
/// Add a user word to the dictionary
|
||||
/// - Parameters:
|
||||
/// - word: Word to add
|
||||
/// - tag: Part-of-speech tag
|
||||
/// - score: Score for the word (default: 0)
|
||||
/// - Returns: true if successful
|
||||
/// - Throws: KiwiError if operation fails
|
||||
@discardableResult
|
||||
public func addWord(_ word: String, tag: POSTag, score: Float = 0) throws -> Bool {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
let result = kiwi_builder_add_word(handle, word, tag.description, score)
|
||||
|
||||
if result != 0 {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
/// Load user dictionary from file
|
||||
/// - Parameter dictPath: Path to the dictionary file
|
||||
/// - Returns: Number of words added
|
||||
/// - Throws: KiwiError if operation fails
|
||||
@discardableResult
|
||||
public func loadDict(_ dictPath: String) throws -> Int {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
let result = kiwi_builder_load_dict(handle, dictPath)
|
||||
|
||||
if result < 0 {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to load dictionary")
|
||||
}
|
||||
|
||||
return Int(result)
|
||||
}
|
||||
|
||||
/// Build a Kiwi instance
|
||||
/// - Returns: A new Kiwi instance
|
||||
/// - Throws: KiwiError if build fails
|
||||
public func build() throws -> Kiwi {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
let kiwiHandle = kiwi_builder_build(handle, nil, 0)
|
||||
|
||||
guard let kiwiHandle = kiwiHandle else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to build Kiwi")
|
||||
}
|
||||
|
||||
return Kiwi(handle: kiwiHandle)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// Options for matching patterns in text analysis
|
||||
public struct MatchOptions: OptionSet, Codable {
|
||||
public let rawValue: Int32
|
||||
|
||||
public init(rawValue: Int32) {
|
||||
self.rawValue = rawValue
|
||||
}
|
||||
|
||||
/// Match URL patterns
|
||||
public static let url = MatchOptions(rawValue: 1 << 0)
|
||||
|
||||
/// Match email addresses
|
||||
public static let email = MatchOptions(rawValue: 1 << 1)
|
||||
|
||||
/// Match hashtags
|
||||
public static let hashtag = MatchOptions(rawValue: 1 << 2)
|
||||
|
||||
/// Match mentions (@username)
|
||||
public static let mention = MatchOptions(rawValue: 1 << 3)
|
||||
|
||||
/// Match serial numbers
|
||||
public static let serial = MatchOptions(rawValue: 1 << 4)
|
||||
|
||||
/// Match emoji
|
||||
public static let emoji = MatchOptions(rawValue: 1 << 5)
|
||||
|
||||
/// OOV: use rule-based matching only
|
||||
public static let oovRuleOnly = MatchOptions(rawValue: 0 << 8)
|
||||
|
||||
/// OOV: use character model
|
||||
public static let oovChrModel = MatchOptions(rawValue: 1 << 8)
|
||||
|
||||
/// OOV: use character frequency model
|
||||
public static let oovChrFreqModel = MatchOptions(rawValue: 2 << 8)
|
||||
|
||||
/// OOV: use character frequency and branch model
|
||||
public static let oovChrFreqBranchModel = MatchOptions(rawValue: 3 << 8)
|
||||
|
||||
/// OOV option mask
|
||||
public static let oovMask = MatchOptions(rawValue: 3 << 8)
|
||||
|
||||
/// Normalize coda
|
||||
public static let normalizeCoda = MatchOptions(rawValue: 1 << 16)
|
||||
|
||||
/// Join noun prefix
|
||||
public static let joinNounPrefix = MatchOptions(rawValue: 1 << 17)
|
||||
|
||||
/// Join noun suffix
|
||||
public static let joinNounSuffix = MatchOptions(rawValue: 1 << 18)
|
||||
|
||||
/// Join verb suffix
|
||||
public static let joinVerbSuffix = MatchOptions(rawValue: 1 << 19)
|
||||
|
||||
/// Join adjective suffix
|
||||
public static let joinAdjSuffix = MatchOptions(rawValue: 1 << 20)
|
||||
|
||||
/// Join adverb suffix
|
||||
public static let joinAdvSuffix = MatchOptions(rawValue: 1 << 21)
|
||||
|
||||
/// Join verb and adjective suffixes
|
||||
public static let joinVSuffix: MatchOptions = [.joinVerbSuffix, .joinAdjSuffix]
|
||||
|
||||
/// Join all affixes
|
||||
public static let joinAffix: MatchOptions = [.joinNounPrefix, .joinNounSuffix, .joinVerbSuffix, .joinAdjSuffix, .joinAdvSuffix]
|
||||
|
||||
/// Split complex morphemes
|
||||
public static let splitComplex = MatchOptions(rawValue: 1 << 22)
|
||||
|
||||
/// Match Z coda
|
||||
public static let zCoda = MatchOptions(rawValue: 1 << 23)
|
||||
|
||||
/// Match compatible jamo
|
||||
public static let compatibleJamo = MatchOptions(rawValue: 1 << 24)
|
||||
|
||||
/// Split saisiot
|
||||
public static let splitSaisiot = MatchOptions(rawValue: 1 << 25)
|
||||
|
||||
/// Merge saisiot
|
||||
public static let mergeSaisiot = MatchOptions(rawValue: 1 << 26)
|
||||
|
||||
/// Join particle yo
|
||||
public static let joinParticleYo = MatchOptions(rawValue: 1 << 27)
|
||||
|
||||
/// All basic matching options
|
||||
public static let all: MatchOptions = [.url, .email, .hashtag, .mention, .serial, .emoji, .zCoda]
|
||||
|
||||
/// All matching options with normalization
|
||||
public static let allWithNormalizing: MatchOptions = [.all, .normalizeCoda]
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
import Foundation
|
||||
import CKiwi
|
||||
|
||||
/// Set of morphemes (used as blacklist in analysis)
|
||||
public final class MorphemeSet {
|
||||
private var wrapper: HandleWrapper<kiwi_morphset_h>?
|
||||
|
||||
internal init(handle: kiwi_morphset_h) {
|
||||
self.wrapper = HandleWrapper(handle) { kiwi_morphset_close($0) }
|
||||
}
|
||||
|
||||
internal var handle: kiwi_morphset_h? {
|
||||
return wrapper?.handle
|
||||
}
|
||||
|
||||
/// Add a morpheme to the set
|
||||
/// - Parameters:
|
||||
/// - form: Form of the morpheme
|
||||
/// - tag: Part-of-speech tag (nil to match all tags)
|
||||
/// - Returns: Number of morphemes added
|
||||
/// - Throws: KiwiError if operation fails
|
||||
@discardableResult
|
||||
public func add(form: String, tag: POSTag? = nil) throws -> Int {
|
||||
guard let handle = wrapper?.handle else {
|
||||
throw KiwiError.invalidHandle
|
||||
}
|
||||
|
||||
let tagStr = tag?.description
|
||||
let result = kiwi_morphset_add(handle, form, tagStr)
|
||||
|
||||
if result < 0 {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to add morpheme to set")
|
||||
}
|
||||
|
||||
return Int(result)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,268 +0,0 @@
|
|||
import Foundation
|
||||
|
||||
/// Part-of-Speech tag enumeration
|
||||
public enum POSTag: UInt8, CaseIterable, Codable {
|
||||
case unknown = 0
|
||||
|
||||
// Nouns
|
||||
case nng = 1
|
||||
case nnp = 2
|
||||
case nnb = 3
|
||||
|
||||
// Verbs
|
||||
case vv = 4
|
||||
case va = 5
|
||||
|
||||
// Adverbs
|
||||
case mag = 6
|
||||
|
||||
// Numerals
|
||||
case nr = 7
|
||||
case np = 8
|
||||
|
||||
// Auxiliary
|
||||
case vx = 9
|
||||
|
||||
// Determiners
|
||||
case mm = 10
|
||||
case maj = 11
|
||||
|
||||
// Interjections
|
||||
case ic = 12
|
||||
|
||||
// Prefixes/Suffixes
|
||||
case xpn = 13
|
||||
case xsn = 14
|
||||
case xsv = 15
|
||||
case xsa = 16
|
||||
case xsm = 17
|
||||
case xr = 18
|
||||
|
||||
// Copulas
|
||||
case vcp = 19
|
||||
case vcn = 20
|
||||
|
||||
// Symbols
|
||||
case sf = 21
|
||||
case sp = 22
|
||||
case ss = 23
|
||||
case sso = 24
|
||||
case ssc = 25
|
||||
case se = 26
|
||||
case so = 27
|
||||
case sw = 28
|
||||
case sb = 29
|
||||
case sl = 30
|
||||
case sh = 31
|
||||
case sn = 32
|
||||
|
||||
// Web entities
|
||||
case w_url = 33
|
||||
case w_email = 34
|
||||
case w_mention = 35
|
||||
case w_hashtag = 36
|
||||
case w_serial = 37
|
||||
case w_emoji = 38
|
||||
|
||||
// Particles
|
||||
case jks = 39
|
||||
case jkc = 40
|
||||
case jkg = 41
|
||||
case jko = 42
|
||||
case jkb = 43
|
||||
case jkv = 44
|
||||
case jkq = 45
|
||||
case jx = 46
|
||||
case jc = 47
|
||||
|
||||
// Endings
|
||||
case ep = 48
|
||||
case ef = 49
|
||||
case ec = 50
|
||||
case etn = 51
|
||||
case etm = 52
|
||||
|
||||
// Special
|
||||
case z_coda = 53
|
||||
case z_siot = 54
|
||||
|
||||
// User defined
|
||||
case user0 = 55
|
||||
case user1 = 56
|
||||
case user2 = 57
|
||||
case user3 = 58
|
||||
case user4 = 59
|
||||
|
||||
// Irregular conjugation tags (base tag | 0x80)
|
||||
case vvi = 132
|
||||
case vai = 133
|
||||
case vxi = 137
|
||||
case xsai = 144
|
||||
|
||||
/// String representation of the POS tag
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .unknown: return "UNK"
|
||||
case .nng: return "NNG"
|
||||
case .nnp: return "NNP"
|
||||
case .nnb: return "NNB"
|
||||
case .vv: return "VV"
|
||||
case .va: return "VA"
|
||||
case .mag: return "MAG"
|
||||
case .nr: return "NR"
|
||||
case .np: return "NP"
|
||||
case .vx: return "VX"
|
||||
case .mm: return "MM"
|
||||
case .maj: return "MAJ"
|
||||
case .ic: return "IC"
|
||||
case .xpn: return "XPN"
|
||||
case .xsn: return "XSN"
|
||||
case .xsv: return "XSV"
|
||||
case .xsa: return "XSA"
|
||||
case .xsm: return "XSM"
|
||||
case .xr: return "XR"
|
||||
case .vcp: return "VCP"
|
||||
case .vcn: return "VCN"
|
||||
case .sf: return "SF"
|
||||
case .sp: return "SP"
|
||||
case .ss: return "SS"
|
||||
case .sso: return "SSO"
|
||||
case .ssc: return "SSC"
|
||||
case .se: return "SE"
|
||||
case .so: return "SO"
|
||||
case .sw: return "SW"
|
||||
case .sb: return "SB"
|
||||
case .sl: return "SL"
|
||||
case .sh: return "SH"
|
||||
case .sn: return "SN"
|
||||
case .w_url: return "W_URL"
|
||||
case .w_email: return "W_EMAIL"
|
||||
case .w_mention: return "W_MENTION"
|
||||
case .w_hashtag: return "W_HASHTAG"
|
||||
case .w_serial: return "W_SERIAL"
|
||||
case .w_emoji: return "W_EMOJI"
|
||||
case .jks: return "JKS"
|
||||
case .jkc: return "JKC"
|
||||
case .jkg: return "JKG"
|
||||
case .jko: return "JKO"
|
||||
case .jkb: return "JKB"
|
||||
case .jkv: return "JKV"
|
||||
case .jkq: return "JKQ"
|
||||
case .jx: return "JX"
|
||||
case .jc: return "JC"
|
||||
case .ep: return "EP"
|
||||
case .ef: return "EF"
|
||||
case .ec: return "EC"
|
||||
case .etn: return "ETN"
|
||||
case .etm: return "ETM"
|
||||
case .z_coda: return "Z_CODA"
|
||||
case .z_siot: return "Z_SIOT"
|
||||
case .user0: return "USER0"
|
||||
case .user1: return "USER1"
|
||||
case .user2: return "USER2"
|
||||
case .user3: return "USER3"
|
||||
case .user4: return "USER4"
|
||||
case .vvi: return "VV-I"
|
||||
case .vai: return "VA-I"
|
||||
case .vxi: return "VX-I"
|
||||
case .xsai: return "XSA-I"
|
||||
}
|
||||
}
|
||||
|
||||
/// Initialize from string tag name
|
||||
public init?(string: String) {
|
||||
switch string.uppercased() {
|
||||
case "UNK", "UNKNOWN": self = .unknown
|
||||
case "NNG": self = .nng
|
||||
case "NNP": self = .nnp
|
||||
case "NNB": self = .nnb
|
||||
case "VV", "VV-R": self = .vv
|
||||
case "VA", "VA-R": self = .va
|
||||
case "MAG": self = .mag
|
||||
case "NR": self = .nr
|
||||
case "NP": self = .np
|
||||
case "VX", "VX-R": self = .vx
|
||||
case "MM": self = .mm
|
||||
case "MAJ": self = .maj
|
||||
case "IC": self = .ic
|
||||
case "XPN": self = .xpn
|
||||
case "XSN": self = .xsn
|
||||
case "XSV", "XSV-R": self = .xsv
|
||||
case "XSA", "XSA-R": self = .xsa
|
||||
case "XSM": self = .xsm
|
||||
case "XR": self = .xr
|
||||
case "VCP": self = .vcp
|
||||
case "VCN": self = .vcn
|
||||
case "SF": self = .sf
|
||||
case "SP": self = .sp
|
||||
case "SS": self = .ss
|
||||
case "SSO": self = .sso
|
||||
case "SSC": self = .ssc
|
||||
case "SE": self = .se
|
||||
case "SO": self = .so
|
||||
case "SW": self = .sw
|
||||
case "SB": self = .sb
|
||||
case "SL": self = .sl
|
||||
case "SH": self = .sh
|
||||
case "SN": self = .sn
|
||||
case "W_URL": self = .w_url
|
||||
case "W_EMAIL": self = .w_email
|
||||
case "W_MENTION": self = .w_mention
|
||||
case "W_HASHTAG": self = .w_hashtag
|
||||
case "W_SERIAL": self = .w_serial
|
||||
case "W_EMOJI": self = .w_emoji
|
||||
case "JKS": self = .jks
|
||||
case "JKC": self = .jkc
|
||||
case "JKG": self = .jkg
|
||||
case "JKO": self = .jko
|
||||
case "JKB": self = .jkb
|
||||
case "JKV": self = .jkv
|
||||
case "JKQ": self = .jkq
|
||||
case "JX": self = .jx
|
||||
case "JC": self = .jc
|
||||
case "EP": self = .ep
|
||||
case "EF": self = .ef
|
||||
case "EC": self = .ec
|
||||
case "ETN": self = .etn
|
||||
case "ETM": self = .etm
|
||||
case "Z_CODA": self = .z_coda
|
||||
case "Z_SIOT": self = .z_siot
|
||||
case "USER0": self = .user0
|
||||
case "USER1": self = .user1
|
||||
case "USER2": self = .user2
|
||||
case "USER3": self = .user3
|
||||
case "USER4": self = .user4
|
||||
case "VV-I", "VVI": self = .vvi
|
||||
case "VA-I", "VAI": self = .vai
|
||||
case "VX-I", "VXI": self = .vxi
|
||||
case "XSA-I", "XSAI": self = .xsai
|
||||
default: return nil
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether this tag represents an irregular conjugation
|
||||
public var isIrregular: Bool {
|
||||
return rawValue & 0x80 != 0
|
||||
}
|
||||
|
||||
/// Returns the base tag without the irregular flag
|
||||
public var baseTag: POSTag {
|
||||
if isIrregular {
|
||||
return POSTag(rawValue: rawValue & 0x7F) ?? self
|
||||
}
|
||||
return self
|
||||
}
|
||||
|
||||
/// Returns the irregular version of this tag (for VV, VA, VX, XSA, P, PA)
|
||||
public var irregularTag: POSTag? {
|
||||
switch self {
|
||||
case .vv: return .vvi
|
||||
case .va: return .vai
|
||||
case .vx: return .vxi
|
||||
case .xsa: return .xsai
|
||||
default: return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension POSTag: CustomStringConvertible {}
|
||||
|
|
@ -1,128 +0,0 @@
|
|||
import Foundation
|
||||
import CKiwi
|
||||
|
||||
/// Represents a morphological token in the analyzed text
|
||||
public struct Token: Codable {
|
||||
/// The surface form of the token
|
||||
public let form: String
|
||||
|
||||
/// Part-of-speech tag
|
||||
public let tag: POSTag
|
||||
|
||||
/// Character position in the original text (UTF-16 based)
|
||||
public let position: Int
|
||||
|
||||
/// Length of the token (UTF-16 based)
|
||||
public let length: Int
|
||||
|
||||
/// Language model score for this token
|
||||
public let score: Float
|
||||
|
||||
/// Word position (space-delimited)
|
||||
public let wordPosition: Int
|
||||
|
||||
/// Sentence position
|
||||
public let sentencePosition: Int
|
||||
|
||||
/// Line number
|
||||
public let lineNumber: Int
|
||||
|
||||
/// Sense ID
|
||||
public let senseId: Int
|
||||
|
||||
/// Typo cost (0 if not corrected)
|
||||
public let typoCost: Float
|
||||
|
||||
/// Paired token index for SSO/SSC tags (-1 if none)
|
||||
public let pairedToken: Int
|
||||
|
||||
/// Sub-sentence position (0 if not in sub-sentence)
|
||||
public let subSentencePosition: Int
|
||||
|
||||
/// Dialect information
|
||||
public let dialect: Dialect
|
||||
|
||||
internal init(form: String, tokenInfo: kiwi_token_info_t) {
|
||||
self.form = form
|
||||
self.tag = POSTag(rawValue: tokenInfo.tag) ?? .unknown
|
||||
self.position = Int(tokenInfo.chr_position)
|
||||
self.length = Int(tokenInfo.length)
|
||||
self.score = tokenInfo.score
|
||||
self.wordPosition = Int(tokenInfo.word_position)
|
||||
self.sentencePosition = Int(tokenInfo.sent_position)
|
||||
self.lineNumber = Int(tokenInfo.line_number)
|
||||
self.senseId = Int(tokenInfo.sense_id)
|
||||
self.typoCost = tokenInfo.typo_cost
|
||||
self.pairedToken = Int(tokenInfo.paired_token)
|
||||
self.subSentencePosition = Int(tokenInfo.sub_sent_position)
|
||||
self.dialect = Dialect(rawValue: Int32(tokenInfo.dialect))
|
||||
}
|
||||
|
||||
public init(
|
||||
form: String,
|
||||
tag: POSTag,
|
||||
position: Int = 0,
|
||||
length: Int = 0,
|
||||
score: Float = 0.0,
|
||||
wordPosition: Int = 0,
|
||||
sentencePosition: Int = 0,
|
||||
lineNumber: Int = 0,
|
||||
senseId: Int = 0,
|
||||
typoCost: Float = 0.0,
|
||||
pairedToken: Int = -1,
|
||||
subSentencePosition: Int = 0,
|
||||
dialect: Dialect = .standard
|
||||
) {
|
||||
self.form = form
|
||||
self.tag = tag
|
||||
self.position = position
|
||||
self.length = length
|
||||
self.score = score
|
||||
self.wordPosition = wordPosition
|
||||
self.sentencePosition = sentencePosition
|
||||
self.lineNumber = lineNumber
|
||||
self.senseId = senseId
|
||||
self.typoCost = typoCost
|
||||
self.pairedToken = pairedToken
|
||||
self.subSentencePosition = subSentencePosition
|
||||
self.dialect = dialect
|
||||
}
|
||||
}
|
||||
|
||||
extension Token: CustomStringConvertible {
|
||||
public var description: String {
|
||||
return "\(form)/\(tag.description)"
|
||||
}
|
||||
}
|
||||
|
||||
/// Result from analysis containing multiple token candidates
|
||||
public struct TokenResult: Codable {
|
||||
/// Probability score for this analysis result
|
||||
public let score: Float
|
||||
|
||||
/// Array of tokens in this analysis
|
||||
public let tokens: [Token]
|
||||
|
||||
public init(score: Float, tokens: [Token]) {
|
||||
self.score = score
|
||||
self.tokens = tokens
|
||||
}
|
||||
}
|
||||
|
||||
/// Represents a sentence in the split result
|
||||
public struct Sentence: Codable {
|
||||
/// The sentence text
|
||||
public let text: String
|
||||
|
||||
/// Starting position in original text
|
||||
public let start: Int
|
||||
|
||||
/// Length of the sentence
|
||||
public let length: Int
|
||||
|
||||
public init(text: String, start: Int, length: Int) {
|
||||
self.text = text
|
||||
self.start = start
|
||||
self.length = length
|
||||
}
|
||||
}
|
||||
|
|
@ -1,123 +0,0 @@
|
|||
import Foundation
|
||||
import CKiwi
|
||||
|
||||
/// Typo transformer for automatic typo correction
|
||||
public final class TypoTransformer {
|
||||
internal let handle: kiwi_typo_h
|
||||
private let shouldClose: Bool
|
||||
|
||||
internal init(handle: kiwi_typo_h, shouldClose: Bool = true) {
|
||||
self.handle = handle
|
||||
self.shouldClose = shouldClose
|
||||
}
|
||||
|
||||
/// Create a new empty typo transformer
|
||||
/// - Throws: KiwiError if creation fails
|
||||
public init() throws {
|
||||
guard let handle = kiwi_typo_init() else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to create typo transformer")
|
||||
}
|
||||
|
||||
self.handle = handle
|
||||
self.shouldClose = true
|
||||
}
|
||||
|
||||
/// Get the default basic typo transformer
|
||||
/// - Returns: A typo transformer with basic typo set
|
||||
/// - Throws: KiwiError if creation fails
|
||||
public static func basic() throws -> TypoTransformer {
|
||||
guard let handle = kiwi_typo_get_basic() else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to get basic typo transformer")
|
||||
}
|
||||
|
||||
return TypoTransformer(handle: handle, shouldClose: false)
|
||||
}
|
||||
|
||||
/// Typo set types
|
||||
public enum TypoSet: Int32 {
|
||||
case withoutTypo = 0
|
||||
case basicTypoSet = 1
|
||||
case continualTypoSet = 2
|
||||
case basicTypoSetWithContinual = 3
|
||||
case lengtheningTypoSet = 4
|
||||
case basicTypoSetWithContinualAndLengthening = 5
|
||||
}
|
||||
|
||||
/// Get default typo transformer with specified typo set
|
||||
/// - Parameter typoSet: The typo set to use
|
||||
/// - Returns: A typo transformer
|
||||
/// - Throws: KiwiError if creation fails
|
||||
public static func `default`(_ typoSet: TypoSet = .basicTypoSet) throws -> TypoTransformer {
|
||||
guard let handle = kiwi_typo_get_default(typoSet.rawValue) else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to get default typo transformer")
|
||||
}
|
||||
|
||||
return TypoTransformer(handle: handle, shouldClose: false)
|
||||
}
|
||||
|
||||
/// Copy this typo transformer
|
||||
/// - Returns: A new typo transformer with the same configuration
|
||||
/// - Throws: KiwiError if copy fails
|
||||
public func copy() throws -> TypoTransformer {
|
||||
guard let newHandle = kiwi_typo_copy(handle) else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to copy typo transformer")
|
||||
}
|
||||
|
||||
return TypoTransformer(handle: newHandle, shouldClose: true)
|
||||
}
|
||||
|
||||
/// Prepare the typo transformer for use in analysis
|
||||
/// - Returns: A PreparedTypoTransformer ready for use
|
||||
/// - Throws: KiwiError if preparation fails
|
||||
public func prepare() throws -> PreparedTypoTransformer {
|
||||
guard let preparedHandle = kiwi_typo_prepare(handle) else {
|
||||
if let errorMsg = kiwi_error() {
|
||||
let error = String(cString: errorMsg)
|
||||
kiwi_clear_error()
|
||||
throw KiwiError.operationFailed(error)
|
||||
}
|
||||
throw KiwiError.operationFailed("Failed to prepare typo transformer")
|
||||
}
|
||||
|
||||
return PreparedTypoTransformer(handle: preparedHandle)
|
||||
}
|
||||
|
||||
deinit {
|
||||
if shouldClose {
|
||||
kiwi_typo_close(handle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Prepared typo transformer for use in analysis
|
||||
public final class PreparedTypoTransformer {
|
||||
internal let handle: kiwi_prepared_typo_h
|
||||
|
||||
internal init(handle: kiwi_prepared_typo_h) {
|
||||
self.handle = handle
|
||||
}
|
||||
|
||||
deinit {
|
||||
kiwi_prepared_typo_close(handle)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,263 +0,0 @@
|
|||
import XCTest
|
||||
@testable import Kiwi
|
||||
|
||||
final class KiwiTests: XCTestCase {
|
||||
|
||||
func testPOSTagDescription() {
|
||||
XCTAssertEqual(POSTag.nng.description, "NNG")
|
||||
XCTAssertEqual(POSTag.nnp.description, "NNP")
|
||||
XCTAssertEqual(POSTag.vv.description, "VV")
|
||||
XCTAssertEqual(POSTag.jks.description, "JKS")
|
||||
}
|
||||
|
||||
func testPOSTagFromString() {
|
||||
XCTAssertEqual(POSTag(string: "NNG"), .nng)
|
||||
XCTAssertEqual(POSTag(string: "VV"), .vv)
|
||||
XCTAssertEqual(POSTag(string: "nng"), .nng)
|
||||
XCTAssertNil(POSTag(string: "INVALID"))
|
||||
}
|
||||
|
||||
func testMatchOptionsBasic() {
|
||||
let options: MatchOptions = [.url, .email]
|
||||
XCTAssertTrue(options.contains(.url))
|
||||
XCTAssertTrue(options.contains(.email))
|
||||
XCTAssertFalse(options.contains(.hashtag))
|
||||
}
|
||||
|
||||
func testMatchOptionsAll() {
|
||||
let options = MatchOptions.all
|
||||
XCTAssertTrue(options.contains(.url))
|
||||
XCTAssertTrue(options.contains(.email))
|
||||
XCTAssertTrue(options.contains(.hashtag))
|
||||
XCTAssertTrue(options.contains(.mention))
|
||||
}
|
||||
|
||||
func testDialectOptions() {
|
||||
let dialects: Dialect = [.gyeonggi, .jeju]
|
||||
XCTAssertTrue(dialects.contains(.gyeonggi))
|
||||
XCTAssertTrue(dialects.contains(.jeju))
|
||||
XCTAssertFalse(dialects.contains(.gangwon))
|
||||
}
|
||||
|
||||
func testTokenInitialization() {
|
||||
let token = Token(
|
||||
form: "테스트",
|
||||
tag: .nng,
|
||||
position: 0,
|
||||
length: 3,
|
||||
score: 1.0
|
||||
)
|
||||
|
||||
XCTAssertEqual(token.form, "테스트")
|
||||
XCTAssertEqual(token.tag, .nng)
|
||||
XCTAssertEqual(token.position, 0)
|
||||
XCTAssertEqual(token.length, 3)
|
||||
XCTAssertEqual(token.score, 1.0)
|
||||
}
|
||||
|
||||
func testTokenDescription() {
|
||||
let token = Token(form: "테스트", tag: .nng)
|
||||
XCTAssertEqual(token.description, "테스트/NNG")
|
||||
}
|
||||
|
||||
func testVersion() {
|
||||
let version = Kiwi.version
|
||||
XCTAssertFalse(version.isEmpty)
|
||||
XCTAssertNotEqual(version, "unknown")
|
||||
}
|
||||
|
||||
// MARK: - Integration Tests
|
||||
|
||||
func testKiwiBuilderAndTokenize() throws {
|
||||
// Try to find model path - in CI it should be at ../../models/cong/base
|
||||
let modelPath = "../../models/cong/base"
|
||||
|
||||
// Skip test if model not available (for local development without models)
|
||||
let fileManager = FileManager.default
|
||||
guard fileManager.fileExists(atPath: modelPath) else {
|
||||
print("Model not found at \(modelPath), skipping integration test")
|
||||
return
|
||||
}
|
||||
|
||||
// Create builder and build Kiwi instance
|
||||
let builder = try KiwiBuilder(modelPath: modelPath, numThreads: 1)
|
||||
let kiwi = try builder.build()
|
||||
|
||||
// Test basic tokenization
|
||||
let text = "안녕하세요"
|
||||
let tokens = try kiwi.tokenize(text)
|
||||
|
||||
// Verify we got some tokens
|
||||
XCTAssertFalse(tokens.isEmpty, "Tokenization should return tokens")
|
||||
|
||||
// Verify token structure
|
||||
for token in tokens {
|
||||
XCTAssertFalse(token.form.isEmpty, "Token form should not be empty")
|
||||
XCTAssertGreaterThanOrEqual(token.position, 0, "Token position should be non-negative")
|
||||
XCTAssertGreaterThan(token.length, 0, "Token length should be positive")
|
||||
}
|
||||
}
|
||||
|
||||
func testKiwiAnalyze() throws {
|
||||
let modelPath = "../../models/cong/base"
|
||||
|
||||
guard FileManager.default.fileExists(atPath: modelPath) else {
|
||||
print("Model not found, skipping test")
|
||||
return
|
||||
}
|
||||
|
||||
let builder = try KiwiBuilder(modelPath: modelPath, numThreads: 1)
|
||||
let kiwi = try builder.build()
|
||||
|
||||
// Test analyze with multiple results
|
||||
let text = "형태소 분석"
|
||||
let results = try kiwi.analyze(text, topN: 2)
|
||||
|
||||
// Should have at least one result
|
||||
XCTAssertFalse(results.isEmpty, "Analysis should return results")
|
||||
|
||||
// First result should have tokens
|
||||
if let firstResult = results.first {
|
||||
XCTAssertFalse(firstResult.tokens.isEmpty, "Result should have tokens")
|
||||
// Score is log probability, so it can be negative
|
||||
XCTAssertFalse(firstResult.score.isNaN, "Result score should not be NaN")
|
||||
}
|
||||
}
|
||||
|
||||
func testSplitIntoSentences() throws {
|
||||
let modelPath = "../../models/cong/base"
|
||||
|
||||
guard FileManager.default.fileExists(atPath: modelPath) else {
|
||||
print("Model not found, skipping test")
|
||||
return
|
||||
}
|
||||
|
||||
let builder = try KiwiBuilder(modelPath: modelPath, numThreads: 1)
|
||||
let kiwi = try builder.build()
|
||||
|
||||
// Test sentence splitting
|
||||
let text = "안녕하세요. 키위입니다. 형태소 분석을 합니다."
|
||||
let sentences = try kiwi.splitIntoSentences(text)
|
||||
|
||||
// Should have 3 sentences
|
||||
XCTAssertEqual(sentences.count, 3, "Should split into 3 sentences")
|
||||
|
||||
// Verify sentence structure
|
||||
for sentence in sentences {
|
||||
XCTAssertFalse(sentence.text.isEmpty, "Sentence text should not be empty")
|
||||
XCTAssertGreaterThanOrEqual(sentence.start, 0, "Sentence start should be non-negative")
|
||||
XCTAssertGreaterThan(sentence.length, 0, "Sentence length should be positive")
|
||||
}
|
||||
}
|
||||
|
||||
func testJoiner() throws {
|
||||
let modelPath = "../../models/cong/base"
|
||||
|
||||
guard FileManager.default.fileExists(atPath: modelPath) else {
|
||||
print("Model not found, skipping test")
|
||||
return
|
||||
}
|
||||
|
||||
let builder = try KiwiBuilder(modelPath: modelPath, numThreads: 1)
|
||||
let kiwi = try builder.build()
|
||||
|
||||
// Test joiner
|
||||
let joiner = try kiwi.createJoiner()
|
||||
try joiner.add(form: "형태소", tag: .nng)
|
||||
try joiner.add(form: "분석", tag: .nng)
|
||||
|
||||
let joined = try joiner.join()
|
||||
XCTAssertFalse(joined.isEmpty, "Joined text should not be empty")
|
||||
}
|
||||
|
||||
// MARK: - Typo Correction Tests
|
||||
|
||||
func testBasicTypoCorrection() throws {
|
||||
let modelPath = "../../models/cong/base"
|
||||
|
||||
guard FileManager.default.fileExists(atPath: modelPath) else {
|
||||
print("Model not found, skipping test")
|
||||
return
|
||||
}
|
||||
|
||||
let builder = try KiwiBuilder(modelPath: modelPath, numThreads: 1)
|
||||
let kiwi = try builder.build()
|
||||
|
||||
// Prepare basic typo transformer
|
||||
let typoTransformer = try TypoTransformer.default(.basicTypoSet)
|
||||
let preparedTypo = try typoTransformer.prepare()
|
||||
|
||||
// Without typo correction: '죰' remains as-is
|
||||
let tokensNoTypo = try kiwi.tokenize("나 죰 도와죠.")
|
||||
let formsNoTypo = tokensNoTypo.map { $0.form }
|
||||
XCTAssertTrue(formsNoTypo.contains("죰"), "Without typo correction, '죰' should remain")
|
||||
|
||||
// With typo correction: '죰' → '좀'
|
||||
let tokensWithTypo = try kiwi.tokenize("나 죰 도와죠.", typoTransformer: preparedTypo)
|
||||
let formsWithTypo = tokensWithTypo.map { $0.form }
|
||||
XCTAssertTrue(formsWithTypo.contains("좀"), "With typo correction, '죰' should become '좀'")
|
||||
}
|
||||
|
||||
func testContinualTypoCorrection() throws {
|
||||
let modelPath = "../../models/cong/base"
|
||||
|
||||
guard FileManager.default.fileExists(atPath: modelPath) else {
|
||||
print("Model not found, skipping test")
|
||||
return
|
||||
}
|
||||
|
||||
let builder = try KiwiBuilder(modelPath: modelPath, numThreads: 1)
|
||||
let kiwi = try builder.build()
|
||||
|
||||
let typoTransformer = try TypoTransformer.default(.continualTypoSet)
|
||||
let preparedTypo = try typoTransformer.prepare()
|
||||
|
||||
let tokens = try kiwi.tokenize("프로그래미", typoTransformer: preparedTypo)
|
||||
XCTAssertEqual(tokens[0].form, "프로그램")
|
||||
XCTAssertEqual(tokens[1].form, "이")
|
||||
}
|
||||
|
||||
func testTypoCorrectionViaAnalyze() throws {
|
||||
let modelPath = "../../models/cong/base"
|
||||
|
||||
guard FileManager.default.fileExists(atPath: modelPath) else {
|
||||
print("Model not found, skipping test")
|
||||
return
|
||||
}
|
||||
|
||||
let builder = try KiwiBuilder(modelPath: modelPath, numThreads: 1)
|
||||
let kiwi = try builder.build()
|
||||
|
||||
let typoTransformer = try TypoTransformer.default(.basicTypoSet)
|
||||
let preparedTypo = try typoTransformer.prepare()
|
||||
|
||||
let results = try kiwi.analyze("나 죰 도와죠.", topN: 1, typoTransformer: preparedTypo)
|
||||
XCTAssertFalse(results.isEmpty)
|
||||
let forms = results[0].tokens.map { $0.form }
|
||||
XCTAssertTrue(forms.contains("좀"))
|
||||
}
|
||||
|
||||
func testBasicWithContinualTypoCorrection() throws {
|
||||
let modelPath = "../../models/cong/base"
|
||||
|
||||
guard FileManager.default.fileExists(atPath: modelPath) else {
|
||||
print("Model not found, skipping test")
|
||||
return
|
||||
}
|
||||
|
||||
let builder = try KiwiBuilder(modelPath: modelPath, numThreads: 1)
|
||||
let kiwi = try builder.build()
|
||||
|
||||
let typoTransformer = try TypoTransformer.default(.basicTypoSetWithContinual)
|
||||
let preparedTypo = try typoTransformer.prepare()
|
||||
|
||||
// continual typo: '프로그래미' → '프로그램' + '이'
|
||||
let tokens1 = try kiwi.tokenize("프로그래미", typoTransformer: preparedTypo)
|
||||
XCTAssertEqual(tokens1[0].form, "프로그램")
|
||||
|
||||
// basic typo: '죰' → '좀'
|
||||
let tokens2 = try kiwi.tokenize("나 죰 도와죠.", typoTransformer: preparedTypo)
|
||||
let forms = tokens2.map { $0.form }
|
||||
XCTAssertTrue(forms.contains("좀"))
|
||||
}
|
||||
}
|
||||
|
|
@ -1,124 +0,0 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Build script for creating XCFramework for iOS and macOS
|
||||
# This script builds the Kiwi library for multiple platforms and architectures
|
||||
# and combines them into a single XCFramework
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
||||
SWIFT_DIR="$PROJECT_ROOT/bindings/swift"
|
||||
BUILD_DIR="$SWIFT_DIR/build"
|
||||
XCFRAMEWORK_DIR="$SWIFT_DIR/xcframework"
|
||||
|
||||
# Clean previous builds
|
||||
echo "Cleaning previous builds..."
|
||||
rm -rf "$BUILD_DIR"
|
||||
rm -rf "$XCFRAMEWORK_DIR"
|
||||
|
||||
mkdir -p "$BUILD_DIR"
|
||||
mkdir -p "$XCFRAMEWORK_DIR"
|
||||
|
||||
# Function to build for a specific platform
|
||||
build_platform() {
|
||||
local PLATFORM=$1
|
||||
local SDK=$2
|
||||
local ARCHS=$3
|
||||
local DEPLOYMENT_TARGET=$4
|
||||
local BUILD_SUBDIR=$5
|
||||
|
||||
echo "Building for $PLATFORM ($ARCHS)..."
|
||||
|
||||
local PLATFORM_BUILD_DIR="$BUILD_DIR/$BUILD_SUBDIR"
|
||||
mkdir -p "$PLATFORM_BUILD_DIR"
|
||||
|
||||
cd "$PLATFORM_BUILD_DIR"
|
||||
|
||||
cmake "$PROJECT_ROOT" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_SYSTEM_NAME=$PLATFORM \
|
||||
-DCMAKE_OSX_SYSROOT=$SDK \
|
||||
-DCMAKE_OSX_ARCHITECTURES="$ARCHS" \
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET=$DEPLOYMENT_TARGET \
|
||||
-DKIWI_BUILD_DYNAMIC=OFF \
|
||||
-DKIWI_BUILD_CLI=OFF \
|
||||
-DKIWI_BUILD_EVALUATOR=OFF \
|
||||
-DKIWI_BUILD_MODEL_BUILDER=OFF \
|
||||
-DKIWI_BUILD_TEST=OFF \
|
||||
-DKIWI_JAVA_BINDING=OFF \
|
||||
-DKIWI_USE_MIMALLOC=ON \
|
||||
-DKIWI_USE_CPUINFO=OFF \
|
||||
-GXcode
|
||||
|
||||
cmake --build . --config Release
|
||||
|
||||
# Create framework structure
|
||||
local FRAMEWORK_DIR="$PLATFORM_BUILD_DIR/Kiwi.framework"
|
||||
mkdir -p "$FRAMEWORK_DIR/Headers"
|
||||
|
||||
# Copy library
|
||||
# Use find to locate the library because Xcode puts it in different places
|
||||
# depending on the platform (e.g., Release-iphoneos, Release-iphonesimulator, Release)
|
||||
local LIB_FILE=$(find . -name "libkiwi_static.a" | grep "Release" | head -n 1)
|
||||
if [ -z "$LIB_FILE" ]; then
|
||||
echo "Error: libkiwi_static.a not found in $PLATFORM_BUILD_DIR"
|
||||
exit 1
|
||||
fi
|
||||
cp "$LIB_FILE" "$FRAMEWORK_DIR/Kiwi"
|
||||
|
||||
# Copy headers
|
||||
cp "$PROJECT_ROOT/include/kiwi/capi.h" "$FRAMEWORK_DIR/Headers/"
|
||||
cp "$PROJECT_ROOT/include/kiwi/Macro.h" "$FRAMEWORK_DIR/Headers/"
|
||||
|
||||
# Create module map
|
||||
mkdir -p "$FRAMEWORK_DIR/Modules"
|
||||
cat > "$FRAMEWORK_DIR/Modules/module.modulemap" << EOF
|
||||
framework module Kiwi {
|
||||
umbrella header "capi.h"
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "✓ Built $PLATFORM"
|
||||
}
|
||||
|
||||
# Build for iOS Device (arm64)
|
||||
build_platform "iOS" "iphoneos" "arm64" "12.0" "ios-arm64"
|
||||
|
||||
# Build for iOS Simulator (arm64 + x86_64)
|
||||
build_platform "iOS" "iphonesimulator" "arm64;x86_64" "12.0" "ios-simulator"
|
||||
|
||||
# Build for macOS (arm64 + x86_64 universal)
|
||||
build_platform "Darwin" "macosx" "arm64;x86_64" "10.14" "macos"
|
||||
|
||||
# Create XCFramework
|
||||
echo "Creating XCFramework..."
|
||||
xcodebuild -create-xcframework \
|
||||
-framework "$BUILD_DIR/ios-arm64/Kiwi.framework" \
|
||||
-framework "$BUILD_DIR/ios-simulator/Kiwi.framework" \
|
||||
-framework "$BUILD_DIR/macos/Kiwi.framework" \
|
||||
-output "$XCFRAMEWORK_DIR/Kiwi.xcframework"
|
||||
|
||||
echo "✓ XCFramework created at $XCFRAMEWORK_DIR/Kiwi.xcframework"
|
||||
|
||||
# Create zip file for distribution
|
||||
echo "Creating zip archive..."
|
||||
cd "$XCFRAMEWORK_DIR"
|
||||
zip -r -y Kiwi.xcframework.zip Kiwi.xcframework
|
||||
|
||||
# Calculate checksum for Swift Package Manager
|
||||
CHECKSUM=$(swift package compute-checksum Kiwi.xcframework.zip 2>/dev/null || echo "N/A")
|
||||
echo "Checksum: $CHECKSUM"
|
||||
|
||||
echo ""
|
||||
echo "Build complete!"
|
||||
echo "XCFramework location: $XCFRAMEWORK_DIR/Kiwi.xcframework"
|
||||
echo "Zip archive: $XCFRAMEWORK_DIR/Kiwi.xcframework.zip"
|
||||
echo ""
|
||||
echo "To use with Swift Package Manager binaryTarget:"
|
||||
echo " .binaryTarget("
|
||||
echo " name: \"CKiwi\","
|
||||
echo " url: \"<RELEASE_URL>/Kiwi.xcframework.zip\","
|
||||
echo " checksum: \"$CHECKSUM\""
|
||||
echo " )"
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
add_executable( "${PROJECT_NAME}-wasm"
|
||||
kiwi_wasm.cpp
|
||||
)
|
||||
|
||||
target_link_libraries( "${PROJECT_NAME}-wasm"
|
||||
"${PROJECT_NAME}_static"
|
||||
)
|
||||
|
||||
set_target_properties("${PROJECT_NAME}-wasm" PROPERTIES
|
||||
LINK_FLAGS "--bind -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s EXPORT_ES6=1 -s MODULARIZE=1 -s EXPORT_NAME=kiwi -s 'EXPORTED_RUNTIME_METHODS=[\"FS\"]'"
|
||||
)
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
# kiwi-nlp, 한국어 형태소 분석기 Kiwi의 TypeScript/JavaScript 바인딩
|
||||
|
||||
## Building
|
||||
|
||||
Additionally to the requirements of the main project, you need to install [Emscripten](https://emscripten.org/docs/getting_started/downloads.html) and [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm).
|
||||
|
||||
To build the package, simply run `./build.sh`.
|
||||
|
||||
This is currently only supported on Linux and macOS. You can run the build script on Windows by using [WSL](https://learn.microsoft.com/en-us/windows/wsl/install).
|
||||
|
||||
You can pass the `--demo` flag to build the demo in `package-demo` as well.
|
||||
If you pass `--demo-dev`, a development server for the demo will be started.
|
||||
|
||||
Running the above command also automatically upgrades to package version if it doesn't match the version in the main project.
|
||||
|
||||
You can also find the recent pre-built package at npm: https://www.npmjs.com/package/kiwi-nlp.
|
||||
|
||||
## Testing
|
||||
|
||||
To run unit tests for the WASM package, first build the package using `./build.sh`, then run:
|
||||
|
||||
```bash
|
||||
cd package
|
||||
npm test
|
||||
```
|
||||
|
||||
Tests are powered by [Vitest](https://vitest.dev/) and run in a Node.js environment.
|
||||
|
||||
## Documentation
|
||||
|
||||
The documentation for the package can be generated by running `npm run doc` inside the `package` directory.
|
||||
|
||||
The main entry point for the API is `KiwiBuilder`, which is used to create instances `Kiwi`.
|
||||
|
||||
You can see the documentation of the recent version at https://bab2min.github.io/Kiwi/kiwi-nlp/.
|
||||
|
||||
## Example Usage
|
||||
|
||||
```javascript
|
||||
import { KiwiBuilder, Match } from 'kiwi-nlp';
|
||||
|
||||
async function example() {
|
||||
const builder = await KiwiBuilder.create('path to kiwi-wasm.wasm');
|
||||
|
||||
const kiwi = await builder.build({
|
||||
modelFiles: {
|
||||
'combiningRule.txt': '/path/to/model/combiningRule.txt',
|
||||
'default.dict': '/path/to/model/default.dict',
|
||||
'extract.mdl': '/path/to/model/extract.mdl',
|
||||
'multi.dict': '/path/to/model/multi.dict',
|
||||
'sj.knlm': '/path/to/model/sj.knlm',
|
||||
'sj.morph': '/path/to/model/sj.morph',
|
||||
'skipbigram.mdl': '/path/to/model/skipbigram.mdl',
|
||||
'typo.dict': '/path/to/model/typo.dict',
|
||||
}
|
||||
});
|
||||
|
||||
const tokens = kiwi.analyze('다음은 예시 텍스트입니다.', Match.allWithNormalizing);
|
||||
/* Output: {
|
||||
"score": -39.772212982177734,
|
||||
"tokens": [
|
||||
{
|
||||
"length": 2,
|
||||
"lineNumber": 0,
|
||||
"pairedToken": 4294967295,
|
||||
"position": 0,
|
||||
"score": -6.5904083251953125,
|
||||
"sentPosition": 0,
|
||||
"str": "다음",
|
||||
"subSentPosition": 0,
|
||||
"tag": "NNG",
|
||||
"typoCost": 0,
|
||||
"typoFormId": 0,
|
||||
"wordPosition": 0
|
||||
},
|
||||
{
|
||||
"length": 1,
|
||||
"lineNumber": 0,
|
||||
"pairedToken": 4294967295,
|
||||
"position": 2,
|
||||
"score": -1.844599723815918,
|
||||
"sentPosition": 0,
|
||||
"str": "은",
|
||||
"subSentPosition": 0,
|
||||
"tag": "JX",
|
||||
"typoCost": 0,
|
||||
"typoFormId": 0,
|
||||
"wordPosition": 0
|
||||
},
|
||||
...
|
||||
]
|
||||
} */
|
||||
}
|
||||
```
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# Change to the script directory
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# Get root directory
|
||||
REPO_ROOT_DIR=$(git rev-parse --show-toplevel)
|
||||
|
||||
# Check if emscripten is installed
|
||||
if ! command -v emcmake &> /dev/null; then
|
||||
echo "Emscripten is not installed. Please install it and make sure it is in your PATH."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Generate the package structure
|
||||
mkdir -p package/src/build
|
||||
mkdir -p package/dist
|
||||
|
||||
# Find core count for make. Prefer nproc, then sysctl, then default to 1
|
||||
if command -v nproc &> /dev/null; then
|
||||
CORE_COUNT=$(nproc)
|
||||
elif command -v sysctl &> /dev/null; then
|
||||
CORE_COUNT=$(sysctl -n hw.logicalcpu)
|
||||
else
|
||||
CORE_COUNT=1
|
||||
fi
|
||||
|
||||
# Build the wasm module and read the project version
|
||||
mkdir -p build
|
||||
cd build
|
||||
emcmake cmake \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DKIWI_USE_CPUINFO=OFF \
|
||||
-DKIWI_USE_MIMALLOC=OFF \
|
||||
-DKIWI_BUILD_TEST=OFF \
|
||||
-DKIWI_BUILD_CLI=OFF \
|
||||
-DKIWI_BUILD_EVALUATOR=OFF \
|
||||
-DKIWI_BUILD_MODEL_BUILDER=OFF \
|
||||
$REPO_ROOT_DIR
|
||||
make -j $CORE_COUNT
|
||||
PROJECT_VERSION=$(grep -m 1 CMAKE_PROJECT_VERSION:STATIC CMakeCache.txt | cut -d'=' -f2)
|
||||
if [ -z "$PROJECT_VERSION" ]; then
|
||||
echo "Failed to read project version from CMakeCache.txt"
|
||||
exit 1
|
||||
fi
|
||||
cd ..
|
||||
|
||||
# Copy the generated files to the package
|
||||
cp build/bindings/wasm/kiwi-wasm.js package/src/build/kiwi-wasm.js
|
||||
cp build/bindings/wasm/kiwi-wasm.wasm package/dist/kiwi-wasm.wasm
|
||||
|
||||
# Build typescript wrapper package and update the version
|
||||
cd package
|
||||
npm install
|
||||
npm run build
|
||||
npm version --no-git-tag-version --allow-same-version $PROJECT_VERSION
|
||||
cd ..
|
||||
|
||||
# Build the demo package if --demo or --demo-dev is passed
|
||||
# --demo with create a static build
|
||||
# --demo-dev will start a development server
|
||||
if [ "$1" == "--demo" ] || [ "$1" == "--demo-dev" ]; then
|
||||
cd package-demo
|
||||
npm install
|
||||
if [ "$1" == "--demo-dev" ]; then
|
||||
npm run dev
|
||||
else
|
||||
npm run build
|
||||
fi
|
||||
cd ..
|
||||
fi
|
||||
|
|
@ -1,671 +0,0 @@
|
|||
#include <kiwi/Kiwi.h>
|
||||
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
#include <emscripten.h>
|
||||
#include <emscripten/val.h>
|
||||
#include <emscripten/bind.h>
|
||||
|
||||
using namespace kiwi;
|
||||
using namespace nlohmann;
|
||||
|
||||
|
||||
static std::map<int, Kiwi> instances;
|
||||
|
||||
int nextInstanceId() {
|
||||
static int id = 0;
|
||||
return id++;
|
||||
}
|
||||
|
||||
|
||||
static std::map<int, std::unordered_set<const Morpheme*>> morphemeSets;
|
||||
|
||||
static std::map<std::string, PreparedTypoTransformer> preparedTypoCache;
|
||||
|
||||
int nextMorphemeSetId() {
|
||||
static int id = 0;
|
||||
return id++;
|
||||
}
|
||||
|
||||
|
||||
template<typename T>
|
||||
inline T getAtOrDefault(const json& args, size_t index, const T& defaultValue) {
|
||||
return args.size() > index ? args.at(index).get<T>() : defaultValue;
|
||||
}
|
||||
|
||||
|
||||
inline std::unordered_set<const Morpheme*> parseMorphemeSet(const Kiwi& kiwi, const json& morphs) {
|
||||
std::unordered_set<const Morpheme*> set;
|
||||
|
||||
for (const auto& morph : morphs) {
|
||||
const std::string form8 = morph["form"];
|
||||
const std::u16string form = utf8To16(form8);
|
||||
|
||||
POSTag tag = POSTag::unknown;
|
||||
if (morph.contains("tag")) {
|
||||
const std::string tagStr8 = morph["tag"];
|
||||
const std::u16string tagStr = utf8To16(tagStr8);
|
||||
tag = toPOSTag(tagStr);
|
||||
}
|
||||
|
||||
uint8_t senseId = undefSenseId;
|
||||
if (morph.contains("senseId")) {
|
||||
senseId = morph["senseId"];
|
||||
}
|
||||
|
||||
auto matches = kiwi.findMorphemes(form, tag, senseId);
|
||||
set.insert(matches.begin(), matches.end());
|
||||
}
|
||||
|
||||
return set;
|
||||
}
|
||||
|
||||
|
||||
class BlockListArg {
|
||||
std::unordered_set<const Morpheme*> tempSet;
|
||||
int blockListId;
|
||||
|
||||
public:
|
||||
BlockListArg(const Kiwi& kiwi, const json& args, size_t index) : blockListId(-1) {
|
||||
if (args.size() <= index) {
|
||||
return;
|
||||
}
|
||||
const auto& arg = args.at(index);
|
||||
if (arg.is_number_integer()) {
|
||||
blockListId = arg.get<int>();
|
||||
} else if (arg.is_array()) {
|
||||
tempSet = parseMorphemeSet(kiwi, arg);
|
||||
}
|
||||
}
|
||||
|
||||
const std::unordered_set<const Morpheme*>* setPtr() const {
|
||||
if (blockListId >= 0) {
|
||||
return &morphemeSets[blockListId];
|
||||
}
|
||||
if (!tempSet.empty()) {
|
||||
return &tempSet;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
std::vector<PretokenizedSpan> parsePretokenizedArg(const json& args, size_t index) {
|
||||
std::vector<PretokenizedSpan> spans;
|
||||
|
||||
if (args.size() <= index) {
|
||||
return spans;
|
||||
}
|
||||
|
||||
const json& arg = args.at(index);
|
||||
|
||||
if (!arg.is_array()) {
|
||||
return spans;
|
||||
}
|
||||
|
||||
for (const auto& span : arg) {
|
||||
const uint32_t start = span["start"];
|
||||
const uint32_t end = span["end"];
|
||||
|
||||
std::vector<BasicToken> tokenization;
|
||||
|
||||
for (const auto& token : span["tokenization"]) {
|
||||
const std::string form8 = token["form"];
|
||||
const std::u16string form = utf8To16(form8);
|
||||
|
||||
const uint32_t start = token["start"];
|
||||
const uint32_t end = token["end"];
|
||||
POSTag tag = POSTag::unknown;
|
||||
if (token.contains("tag")) {
|
||||
const std::string tagStr8 = token["tag"];
|
||||
const std::u16string tagStr = utf8To16(tagStr8);
|
||||
tag = toPOSTag(tagStr);
|
||||
}
|
||||
|
||||
tokenization.push_back(BasicToken{ form, start, end, tag });
|
||||
}
|
||||
|
||||
spans.push_back(PretokenizedSpan{ start, end, tokenization });
|
||||
}
|
||||
|
||||
return spans;
|
||||
}
|
||||
|
||||
|
||||
const PreparedTypoTransformer* parseTypoArg(const json& args, size_t index, float& typoCostThreshold) {
|
||||
if (args.size() <= index) return nullptr;
|
||||
const auto& typoArg = args.at(index);
|
||||
if (typoArg.is_null()) return nullptr;
|
||||
|
||||
typoCostThreshold = getAtOrDefault(args, index + 1, 2.5f);
|
||||
|
||||
std::string cacheKey;
|
||||
if (typoArg.is_string()) {
|
||||
cacheKey = typoArg.get<std::string>();
|
||||
if (cacheKey == "none") return nullptr;
|
||||
} else {
|
||||
cacheKey = typoArg.dump();
|
||||
}
|
||||
|
||||
auto it = preparedTypoCache.find(cacheKey);
|
||||
if (it != preparedTypoCache.end()) {
|
||||
return &it->second;
|
||||
}
|
||||
|
||||
if (typoArg.is_string()) {
|
||||
const std::string typosStr = typoArg.get<std::string>();
|
||||
DefaultTypoSet typoSet = DefaultTypoSet::withoutTypo;
|
||||
if (typosStr == "basic") {
|
||||
typoSet = DefaultTypoSet::basicTypoSet;
|
||||
} else if (typosStr == "continual") {
|
||||
typoSet = DefaultTypoSet::continualTypoSet;
|
||||
} else if (typosStr == "basicWithContinual") {
|
||||
typoSet = DefaultTypoSet::basicTypoSetWithContinual;
|
||||
}
|
||||
return getDefaultPreparedTypoSet(typoSet);
|
||||
} else {
|
||||
TypoTransformer typoTransformer;
|
||||
for (const auto& def : typoArg.value("defs", json::array())) {
|
||||
const float cost = def.value("cost", 1.0f);
|
||||
|
||||
CondVowel condVowel = CondVowel::none;
|
||||
const std::string condVowelStr = def.value("condition", "none");
|
||||
|
||||
if (condVowelStr == "any") {
|
||||
condVowel = CondVowel::any;
|
||||
} else if (condVowelStr == "vowel") {
|
||||
condVowel = CondVowel::vowel;
|
||||
} else if (condVowelStr == "applosive") {
|
||||
condVowel = CondVowel::applosive;
|
||||
}
|
||||
|
||||
for (const auto& orig8 : def["orig"]) {
|
||||
const auto orig16 = utf8To16(orig8);
|
||||
for (const auto& error8 : def["error"]) {
|
||||
typoTransformer.addTypo(orig16, utf8To16(error8), cost, condVowel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const float continualTypoCost = typoArg.value("continualTypoCost", 1.0f);
|
||||
typoTransformer.setContinualTypoCost(continualTypoCost);
|
||||
|
||||
auto [insertIt, _] = preparedTypoCache.emplace(cacheKey, typoTransformer.prepare(true));
|
||||
return &insertIt->second;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline json serializeTokenInfo(const Kiwi& kiwi, const TokenInfo& tokenInfo) {
|
||||
return {
|
||||
{ "str", utf16To8(tokenInfo.str) },
|
||||
{ "position", tokenInfo.position },
|
||||
{ "wordPosition", tokenInfo.wordPosition },
|
||||
{ "sentPosition", tokenInfo.sentPosition },
|
||||
{ "lineNumber", tokenInfo.lineNumber },
|
||||
{ "length", tokenInfo.length },
|
||||
{ "tag", tagToString(tokenInfo.tag) },
|
||||
{ "score", tokenInfo.score },
|
||||
{ "typoCost", tokenInfo.typoCost },
|
||||
{ "typoFormId", tokenInfo.typoFormId },
|
||||
{ "pairedToken", tokenInfo.pairedToken },
|
||||
{ "subSentPosition", tokenInfo.subSentPosition },
|
||||
{ "morphId", kiwi.morphToId(tokenInfo.morph) },
|
||||
{ "senseId", tokenInfo.senseId },
|
||||
{ "script", static_cast<uint8_t>(tokenInfo.script) },
|
||||
{ "dialect", static_cast<uint16_t>(tokenInfo.dialect) },
|
||||
};
|
||||
}
|
||||
|
||||
inline json serializeTokenInfoVec(const Kiwi& kiwi, const std::vector<TokenInfo>& tokenInfoVec) {
|
||||
json result = json::array();
|
||||
for (const TokenInfo& tokenInfo : tokenInfoVec) {
|
||||
result.push_back(serializeTokenInfo(kiwi, tokenInfo));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
inline json serializeTokenResult(const Kiwi& kiwi, const TokenResult& tokenResult) {
|
||||
return {
|
||||
{ "tokens", serializeTokenInfoVec(kiwi, tokenResult.first) },
|
||||
{ "score", tokenResult.second },
|
||||
};
|
||||
}
|
||||
|
||||
inline json serializeTokenResultVec(const Kiwi& kiwi, const std::vector<TokenResult>& tokenResultVec) {
|
||||
json result = json::array();
|
||||
for (const TokenResult& tokenResult : tokenResultVec) {
|
||||
result.push_back(serializeTokenResult(kiwi, tokenResult));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
json version(const json& args) {
|
||||
return KIWI_VERSION_STRING;
|
||||
}
|
||||
|
||||
json build(const json& args) {
|
||||
const int id = nextInstanceId();
|
||||
|
||||
const json buildArgs = args[0];
|
||||
|
||||
const size_t numThreads = 0;
|
||||
const auto modelTypeStr = buildArgs.value("modelType", "none");
|
||||
|
||||
const ModelType modelType = (modelTypeStr == "none") ? ModelType::none
|
||||
: (modelTypeStr == "largest") ? ModelType::largest
|
||||
: (modelTypeStr == "knlm") ? ModelType::knlm
|
||||
: (modelTypeStr == "sbg") ? ModelType::sbg
|
||||
: (modelTypeStr == "cong") ? ModelType::cong
|
||||
: (modelTypeStr == "cong-global") ? ModelType::congGlobal
|
||||
: ModelType::none;
|
||||
|
||||
BuildOption buildOptions = BuildOption::none;
|
||||
if (buildArgs.value("integrateAllomorph", true)) {
|
||||
buildOptions |= BuildOption::integrateAllomorph;
|
||||
}
|
||||
if (buildArgs.value("loadDefaultDict", true)) {
|
||||
buildOptions |= BuildOption::loadDefaultDict;
|
||||
}
|
||||
if (buildArgs.value("loadTypoDict", true)) {
|
||||
buildOptions |= BuildOption::loadTypoDict;
|
||||
}
|
||||
if (buildArgs.value("loadMultiDict", true)) {
|
||||
buildOptions |= BuildOption::loadMultiDict;
|
||||
}
|
||||
auto enabledDialects = buildArgs.value("enabledDialects", "standard");
|
||||
|
||||
KiwiBuilder builder = [&]() {
|
||||
// Check if streamProvider is available, if so use it
|
||||
if (buildArgs.contains("streamProvider")) {
|
||||
std::string streamProviderCallbackName = buildArgs["streamProvider"];
|
||||
|
||||
// Create StreamProvider that calls JavaScript function
|
||||
KiwiBuilder::StreamProvider streamProvider = [streamProviderCallbackName](const std::string& filename) -> std::unique_ptr<std::istream>
|
||||
{
|
||||
try
|
||||
{
|
||||
// Call JavaScript function by name
|
||||
emscripten::val jsFunction = emscripten::val::global(streamProviderCallbackName.c_str());
|
||||
if (jsFunction.isUndefined())
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
emscripten::val result = jsFunction(filename);
|
||||
if (result.isNull() || result.isUndefined())
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Convert result to vector<char>
|
||||
std::vector<char> buffer;
|
||||
if (result.hasOwnProperty("length"))
|
||||
{
|
||||
const int length = result["length"].as<int>();
|
||||
buffer.resize(length);
|
||||
|
||||
for (int i = 0; i < length; ++i)
|
||||
{
|
||||
buffer[i] = result[i].as<unsigned char>();
|
||||
}
|
||||
}
|
||||
else if (result.typeOf().as<std::string>() == "string")
|
||||
{
|
||||
std::string str = result.as<std::string>();
|
||||
buffer.assign(str.begin(), str.end());
|
||||
}
|
||||
else
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::string data(buffer.begin(), buffer.end());
|
||||
return std::make_unique<std::istringstream>(std::move(data));
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
return KiwiBuilder{
|
||||
streamProvider,
|
||||
numThreads,
|
||||
buildOptions,
|
||||
modelType,
|
||||
parseDialects(enabledDialects),
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use traditional modelPath approach
|
||||
const std::string modelPath = buildArgs["modelPath"];
|
||||
return KiwiBuilder{
|
||||
modelPath,
|
||||
numThreads,
|
||||
buildOptions,
|
||||
modelType,
|
||||
parseDialects(enabledDialects),
|
||||
};
|
||||
}
|
||||
}();
|
||||
|
||||
const auto userDicts = buildArgs.value("userDicts", json::array());
|
||||
for (const auto& pathJson : userDicts) {
|
||||
const std::string path = pathJson;
|
||||
builder.loadDictionary(path);
|
||||
}
|
||||
|
||||
const auto userWords = buildArgs.value("userWords", json::array());
|
||||
for (const auto& word : userWords) {
|
||||
const std::string word8 = word["word"];
|
||||
const std::u16string word16 = utf8To16(word8);
|
||||
|
||||
const std::string tag8 = word.value("tag", "NNG");
|
||||
const std::u16string tag16 = utf8To16(tag8);
|
||||
const POSTag tag = toPOSTag(tag16);
|
||||
|
||||
const float score = word.value("score", 0.0f);
|
||||
|
||||
if (word.contains("origWord")) {
|
||||
const std::string origWord8 = word["origWord"];
|
||||
const std::u16string origWord16 = utf8To16(origWord8);
|
||||
|
||||
builder.addWord(word16, tag, score, origWord16);
|
||||
} else {
|
||||
builder.addWord(word16, tag, score);
|
||||
}
|
||||
}
|
||||
|
||||
const auto preanalyzedWords = buildArgs.value("preanalyzedWords", json::array());
|
||||
for (const auto& preanalyzedWord : preanalyzedWords) {
|
||||
const std::string form8 = preanalyzedWord["form"];
|
||||
const std::u16string form = utf8To16(form8);
|
||||
const float score = preanalyzedWord.value("score", 0.0f);
|
||||
|
||||
std::vector<std::tuple<std::u16string, POSTag, uint8_t>> analyzed;
|
||||
std::vector<std::pair<size_t, size_t>> positions;
|
||||
|
||||
for (const auto& analyzedToken : preanalyzedWord["analyzed"]) {
|
||||
const std::string form8 = analyzedToken["form"];
|
||||
const std::u16string form = utf8To16(form8);
|
||||
|
||||
const std::string tag8 = analyzedToken["tag"];
|
||||
const std::u16string tag16 = utf8To16(tag8);
|
||||
const POSTag tag = toPOSTag(tag16);
|
||||
|
||||
const uint8_t senseId = analyzedToken.value("senseId", undefSenseId);
|
||||
analyzed.emplace_back(form, tag, senseId);
|
||||
|
||||
if (analyzedToken.contains("start") && analyzedToken.contains("end")) {
|
||||
const size_t start = analyzedToken["start"];
|
||||
const size_t end = analyzedToken["end"];
|
||||
positions.emplace_back(start, end);
|
||||
}
|
||||
}
|
||||
|
||||
builder.addPreAnalyzedWord(form, analyzed, positions, score);
|
||||
}
|
||||
|
||||
instances.emplace(id, builder.build());
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
json kiwiReady(Kiwi& kiwi, const json& args) {
|
||||
return kiwi.ready();
|
||||
}
|
||||
|
||||
json kiwiIsTypoTolerant(Kiwi& kiwi, const json& args) {
|
||||
return kiwi.isTypoTolerant();
|
||||
}
|
||||
|
||||
json kiwiAnalyze(Kiwi& kiwi, const json& args) {
|
||||
const std::string str = args[0];
|
||||
const Match matchOptions = getAtOrDefault(args, 1, Match::allWithNormalizing);
|
||||
const BlockListArg blockListArg(kiwi, args, 2);
|
||||
const auto pretokenized = parsePretokenizedArg(args, 3);
|
||||
float typoCostThreshold = 2.5f;
|
||||
const auto* typoTransformer = parseTypoArg(args, 4, typoCostThreshold);
|
||||
const auto allowedDialects = parseDialects(getAtOrDefault(args, 6, std::string{ "standard" }));
|
||||
const auto dialectCost = getAtOrDefault(args, 7, 3.0f);
|
||||
|
||||
AnalyzeOption opt{ matchOptions, blockListArg.setPtr(), false, allowedDialects, dialectCost };
|
||||
opt.typoTransformer = typoTransformer;
|
||||
opt.typoThreshold = typoCostThreshold;
|
||||
const TokenResult tokenResult = kiwi.analyze(str, opt, pretokenized);
|
||||
|
||||
return serializeTokenResult(kiwi, tokenResult);
|
||||
}
|
||||
|
||||
json kiwiAnalyzeTopN(Kiwi& kiwi, const json& args) {
|
||||
const std::string str = args[0];
|
||||
const int topN = args[1];
|
||||
const Match matchOptions = getAtOrDefault(args, 2, Match::allWithNormalizing);
|
||||
const BlockListArg blockListArg(kiwi, args, 3);
|
||||
const auto pretokenized = parsePretokenizedArg(args, 4);
|
||||
float typoCostThreshold = 2.5f;
|
||||
const auto* typoTransformer = parseTypoArg(args, 5, typoCostThreshold);
|
||||
const auto allowedDialects = parseDialects(getAtOrDefault(args, 7, std::string{ "standard" }));
|
||||
const auto dialectCost = getAtOrDefault(args, 8, 3.0f);
|
||||
|
||||
AnalyzeOption opt{ matchOptions, blockListArg.setPtr(), false, allowedDialects, dialectCost };
|
||||
opt.typoTransformer = typoTransformer;
|
||||
opt.typoThreshold = typoCostThreshold;
|
||||
const std::vector<TokenResult> tokenResults = kiwi.analyze(str, topN, opt, pretokenized);
|
||||
|
||||
return serializeTokenResultVec(kiwi, tokenResults);
|
||||
}
|
||||
|
||||
json kiwiTokenize(Kiwi& kiwi, const json& args) {
|
||||
const std::string str = args[0];
|
||||
const Match matchOptions = getAtOrDefault(args, 1, Match::allWithNormalizing);
|
||||
const BlockListArg blockListArg(kiwi, args, 2);
|
||||
const auto pretokenized = parsePretokenizedArg(args, 3);
|
||||
float typoCostThreshold = 2.5f;
|
||||
const auto* typoTransformer = parseTypoArg(args, 4, typoCostThreshold);
|
||||
const auto allowedDialects = parseDialects(getAtOrDefault(args, 6, std::string{ "standard" }));
|
||||
const auto dialectCost = getAtOrDefault(args, 7, 3.0f);
|
||||
|
||||
AnalyzeOption opt{ matchOptions, blockListArg.setPtr(), false, allowedDialects, dialectCost };
|
||||
opt.typoTransformer = typoTransformer;
|
||||
opt.typoThreshold = typoCostThreshold;
|
||||
const TokenResult tokenResult = kiwi.analyze(str, opt, pretokenized);
|
||||
|
||||
return serializeTokenInfoVec(kiwi, tokenResult.first);
|
||||
}
|
||||
|
||||
json kiwiTokenizeTopN(Kiwi& kiwi, const json& args) {
|
||||
const std::string str = args[0];
|
||||
const int topN = args[1];
|
||||
const Match matchOptions = getAtOrDefault(args, 2, Match::allWithNormalizing);
|
||||
const BlockListArg blockListArg(kiwi, args, 3);
|
||||
const auto pretokenized = parsePretokenizedArg(args, 4);
|
||||
float typoCostThreshold = 2.5f;
|
||||
const auto* typoTransformer = parseTypoArg(args, 5, typoCostThreshold);
|
||||
const auto allowedDialects = parseDialects(getAtOrDefault(args, 7, std::string{ "standard" }));
|
||||
const auto dialectCost = getAtOrDefault(args, 8, 3.0f);
|
||||
|
||||
AnalyzeOption opt{ matchOptions, blockListArg.setPtr(), false, allowedDialects, dialectCost };
|
||||
opt.typoTransformer = typoTransformer;
|
||||
opt.typoThreshold = typoCostThreshold;
|
||||
const std::vector<TokenResult> tokenResults = kiwi.analyze(str, topN, opt, pretokenized);
|
||||
|
||||
json result = json::array();
|
||||
for (const TokenResult& tokenResult : tokenResults) {
|
||||
result.push_back(serializeTokenInfoVec(kiwi, tokenResult.first));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
json kiwiSplitIntoSents(Kiwi& kiwi, const json& args) {
|
||||
const std::string str = args[0];
|
||||
const Match matchOptions = getAtOrDefault(args, 1, Match::allWithNormalizing);
|
||||
const bool withTokenResult = getAtOrDefault(args, 2, false);
|
||||
|
||||
TokenResult tokenResult;
|
||||
const auto sentenceSpans = kiwi.splitIntoSents(str, matchOptions, withTokenResult ? &tokenResult : nullptr);
|
||||
|
||||
json spans = json::array();
|
||||
for (const auto& span : sentenceSpans) {
|
||||
spans.push_back({
|
||||
{ "start", span.first },
|
||||
{ "end", span.second },
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
{ "spans", spans },
|
||||
{ "tokenResult", withTokenResult ? serializeTokenResult(kiwi, tokenResult) : nullptr },
|
||||
};
|
||||
}
|
||||
|
||||
json kiwiJoinSent(Kiwi& kiwi, const json& args) {
|
||||
const json morphs = args[0];
|
||||
const bool lmSearch = getAtOrDefault(args, 1, true);
|
||||
const bool withRanges = getAtOrDefault(args, 2, false);
|
||||
|
||||
auto joiner = kiwi.newJoiner(lmSearch);
|
||||
|
||||
for (const auto& morph : morphs) {
|
||||
const std::string form8 = morph["form"];
|
||||
const std::u16string form = utf8To16(form8);
|
||||
|
||||
const std::string tagStr8 = morph["tag"];
|
||||
const std::u16string tagStr = utf8To16(tagStr8);
|
||||
const POSTag tag = toPOSTag(tagStr);
|
||||
|
||||
const cmb::Space space = morph.value("space", cmb::Space::none);
|
||||
|
||||
joiner.add(form, tag, true, space);
|
||||
}
|
||||
|
||||
std::vector<std::pair<uint32_t, uint32_t>> ranges;
|
||||
const std::string str = joiner.getU8(withRanges ? &ranges : nullptr);
|
||||
|
||||
json rangesRet = json::array();
|
||||
for (const auto& range : ranges) {
|
||||
rangesRet.push_back({
|
||||
{ "start", range.first },
|
||||
{ "end", range.second },
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
{ "str", str },
|
||||
{ "ranges", withRanges ? rangesRet : nullptr },
|
||||
};
|
||||
}
|
||||
|
||||
json kiwiGetGlobalConfig(Kiwi& kiwi, const json& args) {
|
||||
json obj = json::object();
|
||||
auto config = kiwi.getGlobalConfig();
|
||||
obj["integrateAllomorph"] = config.integrateAllomorph;
|
||||
obj["cutOffThreshold"] = config.cutOffThreshold;
|
||||
obj["oovRuleScale"] = config.oovRuleScale;
|
||||
obj["oovRuleBias"] = config.oovRuleBias;
|
||||
obj["oovChrBias"] = config.oovChrBias;
|
||||
obj["oovGlobalWeight"] = config.oovGlobalWeight;
|
||||
obj["oovLocalWeight"] = config.oovLocalWeight;
|
||||
obj["oovGlobalMinFreq"] = config.oovGlobalMinFreq;
|
||||
obj["spacePenalty"] = config.spacePenalty;
|
||||
obj["typoCostWeight"] = config.typoCostWeight;
|
||||
obj["maxUnkFormSize"] = config.maxUnkFormSize;
|
||||
obj["maxUnkFormSizeFollowedByJClass"] = config.maxUnkFormSizeFollowedByJClass;
|
||||
obj["spaceTolerance"] = config.spaceTolerance;
|
||||
return obj;
|
||||
}
|
||||
|
||||
json kiwiSetGlobalConfig(Kiwi& kiwi, const json& args) {
|
||||
auto config = kiwi.getGlobalConfig();
|
||||
const json& configArg = args[0];
|
||||
if (configArg.contains("integrateAllomorph")) config.integrateAllomorph = configArg["integrateAllomorph"];
|
||||
if (configArg.contains("cutOffThreshold")) config.cutOffThreshold = configArg["cutOffThreshold"];
|
||||
if (configArg.contains("oovRuleScale")) config.oovRuleScale = configArg["oovRuleScale"];
|
||||
if (configArg.contains("oovRuleBias")) config.oovRuleBias = configArg["oovRuleBias"];
|
||||
if (configArg.contains("oovChrBias")) config.oovChrBias = configArg["oovChrBias"];
|
||||
if (configArg.contains("oovGlobalWeight")) config.oovGlobalWeight = configArg["oovGlobalWeight"];
|
||||
if (configArg.contains("oovLocalWeight")) config.oovLocalWeight = configArg["oovLocalWeight"];
|
||||
if (configArg.contains("oovGlobalMinFreq")) config.oovGlobalMinFreq = configArg["oovGlobalMinFreq"];
|
||||
if (configArg.contains("spacePenalty")) config.spacePenalty = configArg["spacePenalty"];
|
||||
if (configArg.contains("typoCostWeight")) config.typoCostWeight = configArg["typoCostWeight"];
|
||||
if (configArg.contains("maxUnkFormSize")) config.maxUnkFormSize = configArg["maxUnkFormSize"];
|
||||
if (configArg.contains("maxUnkFormSizeFollowedByJClass")) config.maxUnkFormSizeFollowedByJClass = configArg["maxUnkFormSizeFollowedByJClass"];
|
||||
if (configArg.contains("spaceTolerance")) config.spaceTolerance = configArg["spaceTolerance"];
|
||||
kiwi.setGlobalConfig(config);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
json kiwiCreateMorphemeSet(Kiwi& kiwi, const json& args) {
|
||||
const int id = nextMorphemeSetId();
|
||||
|
||||
const json morphs = args[0];
|
||||
std::unordered_set<const Morpheme*> set = parseMorphemeSet(kiwi, morphs);
|
||||
|
||||
morphemeSets.emplace(id, set);
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
json kiwiDestroyMorphemeSet(Kiwi& kiwi, const json& args) {
|
||||
const int id = args[0];
|
||||
morphemeSets.erase(id);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
using ApiMethod = json(*)(const json&);
|
||||
using InstanceApiMethod = json(*)(Kiwi&, const json&);
|
||||
|
||||
std::map<std::string, ApiMethod> apiMethods = {
|
||||
{ "version", version },
|
||||
{ "build", build },
|
||||
};
|
||||
|
||||
std::map<std::string, InstanceApiMethod> instanceApiMethods = {
|
||||
{ "ready", kiwiReady },
|
||||
{ "isTypoTolerant", kiwiIsTypoTolerant },
|
||||
{ "analyze", kiwiAnalyze },
|
||||
{ "analyzeTopN", kiwiAnalyzeTopN },
|
||||
{ "tokenize", kiwiTokenize },
|
||||
{ "tokenizeTopN", kiwiTokenizeTopN},
|
||||
{ "splitIntoSents", kiwiSplitIntoSents },
|
||||
{ "joinSent", kiwiJoinSent },
|
||||
{ "getGlobalConfig", kiwiGetGlobalConfig },
|
||||
{ "setGlobalConfig", kiwiSetGlobalConfig },
|
||||
{ "createMorphemeSet", kiwiCreateMorphemeSet },
|
||||
{ "destroyMorphemeSet", kiwiDestroyMorphemeSet },
|
||||
};
|
||||
|
||||
|
||||
std::string api(std::string dataStr) {
|
||||
const json data = json::parse(dataStr);
|
||||
|
||||
const std::string methodName = data["method"];
|
||||
const json args = data["args"];
|
||||
const json id = data.value("id", json(nullptr));
|
||||
|
||||
if (id.is_number_integer()) {
|
||||
const int instanceId = id;
|
||||
auto& instance = instances[instanceId];
|
||||
const auto method = instanceApiMethods[methodName];
|
||||
return method(instance, args).dump();
|
||||
}
|
||||
|
||||
return apiMethods[methodName](args).dump();
|
||||
}
|
||||
|
||||
|
||||
EMSCRIPTEN_BINDINGS(kiwi) {
|
||||
emscripten::constant("VERSION_MAJOR", KIWI_VERSION_MAJOR);
|
||||
emscripten::constant("VERSION_MINOR", KIWI_VERSION_MINOR);
|
||||
emscripten::constant("VERSION_PATCH", KIWI_VERSION_PATCH);
|
||||
emscripten::constant("VERSION", emscripten::val(KIWI_VERSION_STRING));
|
||||
|
||||
emscripten::function("api", &api);
|
||||
}
|
||||
24
bindings/wasm/package-demo/.gitignore
vendored
24
bindings/wasm/package-demo/.gitignore
vendored
|
|
@ -1,24 +0,0 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<title>Kiwi Demo</title>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
|
||||
<link rel="stylesheet" href="./src/style.css" />
|
||||
|
||||
<script src="./src/index.ts" type="module" defer></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="title-wrap">
|
||||
<img src="./public/logo.png" alt="Kiwi Logo" class="logo" />
|
||||
<div id="version">Loading...</div>
|
||||
</div>
|
||||
|
||||
<input
|
||||
id="input"
|
||||
type="text"
|
||||
value="프랑스의 세계적인 의상 디자이너 엠마누엘 웅가로가 실내 장식용 직물 디자이너로 나섰다."
|
||||
hidden
|
||||
/>
|
||||
|
||||
<table id="result" hidden>
|
||||
<tr>
|
||||
<th>시작 위치</th>
|
||||
<th>길이</th>
|
||||
<th>표면</th>
|
||||
<th>형태</th>
|
||||
<th>품사 태그</th>
|
||||
<th>점수</th>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
1178
bindings/wasm/package-demo/package-lock.json
generated
1178
bindings/wasm/package-demo/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,19 +0,0 @@
|
|||
{
|
||||
"name": "package-demo",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "tsc && vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"kiwi-nlp": "file:../package",
|
||||
"vite-plugin-static-copy": "^1.0.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^5.2.2",
|
||||
"vite": "^5.4.8"
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 39 KiB |
|
|
@ -1,69 +0,0 @@
|
|||
import { WorkerRequest, WorkerResponse } from './worker.js';
|
||||
import { TokenInfo } from 'kiwi-nlp';
|
||||
|
||||
const elVersion = document.getElementById('version')!;
|
||||
const elInput = document.getElementById('input') as HTMLInputElement;
|
||||
const elResultTable = document.getElementById('result') as HTMLTableElement;
|
||||
|
||||
const worker = new Worker(
|
||||
new URL('./worker.ts', import.meta.url),
|
||||
{ type: 'module' }
|
||||
);
|
||||
|
||||
worker.onmessage = (event) => {
|
||||
const response: WorkerResponse = event.data;
|
||||
|
||||
switch (response.type) {
|
||||
case 'inited':
|
||||
inited(response.version);
|
||||
break;
|
||||
case 'analyzed':
|
||||
analyzed(response.result, response.text);
|
||||
break;
|
||||
default:
|
||||
console.error('Unknown worker message');
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
function sendWorkerRequest(request: WorkerRequest) {
|
||||
worker.postMessage(request);
|
||||
}
|
||||
|
||||
sendWorkerRequest({ type: 'init' });
|
||||
|
||||
function inited(version: string) {
|
||||
elVersion.innerText = 'v' + version;
|
||||
|
||||
elInput.hidden = false;
|
||||
elInput.addEventListener('input', analyze);
|
||||
analyze();
|
||||
}
|
||||
|
||||
function analyze() {
|
||||
const text = elInput.value;
|
||||
worker.postMessage({ type: 'analyze', text });
|
||||
}
|
||||
|
||||
function analyzed(tokenInfos: TokenInfo[], text: string) {
|
||||
while (elResultTable.rows.length > 1) {
|
||||
elResultTable.deleteRow(1);
|
||||
}
|
||||
|
||||
for (const tokenInfo of tokenInfos) {
|
||||
const surface = text.substring(
|
||||
tokenInfo.position,
|
||||
tokenInfo.position + tokenInfo.length
|
||||
);
|
||||
|
||||
const row = elResultTable.insertRow();
|
||||
row.insertCell().innerText = tokenInfo.position.toString();
|
||||
row.insertCell().innerText = tokenInfo.length.toString();
|
||||
row.insertCell().innerText = surface;
|
||||
row.insertCell().innerText = tokenInfo.str;
|
||||
row.insertCell().innerText = tokenInfo.tag;
|
||||
row.insertCell().innerText = tokenInfo.score.toString();
|
||||
}
|
||||
|
||||
elResultTable.hidden = tokenInfos.length === 0;
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
export const requiredModelFiles = [
|
||||
'combiningRule.txt',
|
||||
'default.dict',
|
||||
'extract.mdl',
|
||||
'multi.dict',
|
||||
'sj.knlm',
|
||||
'sj.morph',
|
||||
'skipbigram.mdl',
|
||||
'typo.dict',
|
||||
];
|
||||
|
||||
export const modelFiles = Object.fromEntries(
|
||||
requiredModelFiles.map((f) => [f, '/model/' + f])
|
||||
);
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
body {
|
||||
width: min(100%, 800px);
|
||||
padding: 1rem;
|
||||
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
|
||||
font-family: "Noto Sans KR", sans-serif;
|
||||
font-optical-sizing: auto;
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
|
||||
}
|
||||
|
||||
.title-wrap {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 1rem;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 15rem;
|
||||
}
|
||||
|
||||
#input {
|
||||
width: 100%;
|
||||
padding: 0.5rem;
|
||||
font-size: 1rem;
|
||||
|
||||
appearance: none;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
|
||||
#input:focus {
|
||||
outline: 2px solid #0078d4;
|
||||
}
|
||||
|
||||
#result {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
border-style: hidden;
|
||||
border-radius: 0.25rem;
|
||||
box-shadow: 0 0 0 1px #ccc;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#result tr:not(:first-child) {
|
||||
border-top: 1px solid #ccc;
|
||||
}
|
||||
|
||||
#result td,
|
||||
#result th {
|
||||
padding: 0.5rem;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#result th {
|
||||
text-align: left;
|
||||
font-weight: 400;
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
1
bindings/wasm/package-demo/src/vite-env.d.ts
vendored
1
bindings/wasm/package-demo/src/vite-env.d.ts
vendored
|
|
@ -1 +0,0 @@
|
|||
/// <reference types="vite/client" />
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
import { KiwiBuilder, Kiwi, TokenInfo } from 'kiwi-nlp';
|
||||
import kiwiWasmPath from 'kiwi-nlp/dist/kiwi-wasm.wasm?url';
|
||||
import { modelFiles } from './modelFiles';
|
||||
|
||||
let kiwiBuilder: KiwiBuilder | null = null;
|
||||
let kiwi: Kiwi | null = null;
|
||||
let version: string | null = null;
|
||||
|
||||
export type WorkerRequest =
|
||||
| { type: 'init' }
|
||||
| { type: 'analyze'; text: string };
|
||||
export type WorkerResponse =
|
||||
| { type: 'inited'; version: string }
|
||||
| { type: 'analyzed'; result: TokenInfo[]; text: string };
|
||||
|
||||
function sendResponse(response: WorkerResponse) {
|
||||
self.postMessage(response);
|
||||
}
|
||||
|
||||
async function init() {
|
||||
kiwiBuilder = await KiwiBuilder.create(kiwiWasmPath);
|
||||
version = kiwiBuilder.version();
|
||||
kiwi = await kiwiBuilder.build({ modelFiles });
|
||||
|
||||
sendResponse({ type: 'inited', version });
|
||||
}
|
||||
|
||||
function analyze(text: string) {
|
||||
if (!kiwi) {
|
||||
throw new Error('Kiwi is not initialized');
|
||||
}
|
||||
|
||||
const result = kiwi.tokenize(text);
|
||||
sendResponse({ type: 'analyzed', result, text });
|
||||
}
|
||||
|
||||
self.onmessage = (event) => {
|
||||
const request: WorkerRequest = event.data;
|
||||
|
||||
switch (request.type) {
|
||||
case 'init':
|
||||
init();
|
||||
break;
|
||||
case 'analyze':
|
||||
analyze(request.text);
|
||||
break;
|
||||
default:
|
||||
throw new Error('Unknown request type');
|
||||
}
|
||||
};
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2020",
|
||||
"useDefineForClassFields": true,
|
||||
"module": "ESNext",
|
||||
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
||||
"skipLibCheck": true,
|
||||
|
||||
/* Bundler mode */
|
||||
"moduleResolution": "bundler",
|
||||
"allowImportingTsExtensions": true,
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"noEmit": true,
|
||||
|
||||
/* Linting */
|
||||
"strict": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noFallthroughCasesInSwitch": true
|
||||
},
|
||||
"include": ["src"]
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
import { defineConfig } from 'vite';
|
||||
import { viteStaticCopy } from 'vite-plugin-static-copy';
|
||||
import { requiredModelFiles } from './src/modelFiles';
|
||||
|
||||
const targets = requiredModelFiles.map((file) => ({
|
||||
src: '../../../models/base/' + file,
|
||||
dest: 'model',
|
||||
}));
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
viteStaticCopy({ targets }),
|
||||
],
|
||||
});
|
||||
4
bindings/wasm/package/.gitignore
vendored
4
bindings/wasm/package/.gitignore
vendored
|
|
@ -1,4 +0,0 @@
|
|||
node_modules
|
||||
dist
|
||||
build
|
||||
doc
|
||||
2019
bindings/wasm/package/package-lock.json
generated
2019
bindings/wasm/package/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,40 +0,0 @@
|
|||
{
|
||||
"name": "kiwi-nlp",
|
||||
"version": "0.22.2",
|
||||
"description": "Kiwi, Korean Intelligent Word Identifier",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/bab2min/Kiwi.git"
|
||||
},
|
||||
"main": "dist/index.js",
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"keywords": [
|
||||
"korean",
|
||||
"nlp",
|
||||
"tokenizer"
|
||||
],
|
||||
"author": "bab2min <bab2min@gmail.com> (lab.bab2min.pe.kr)",
|
||||
"license": "LGPL-2.1-or-later",
|
||||
"bugs": {
|
||||
"url": "https://github.com/bab2min/Kiwi/issues"
|
||||
},
|
||||
"homepage": "https://lab.bab2min.pe.kr/kiwi",
|
||||
"publishConfig": {
|
||||
"provenance": true,
|
||||
"access": "public"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.0.0",
|
||||
"typedoc": "^0.26.2",
|
||||
"typescript": "^5.4.5",
|
||||
"undici-types": "^7.22.0",
|
||||
"vitest": "^1.6.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"doc": "typedoc --out doc src",
|
||||
"test": "vitest run"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,151 +0,0 @@
|
|||
/**
|
||||
* A single file to be loaded. The key is the name of the file and the value is the file data.
|
||||
* The file data can be a string representing a URL or an ArrayBufferView directly containing the file data.
|
||||
*/
|
||||
export type ModelFiles = { [name: string]: ArrayBufferView | string };
|
||||
|
||||
/**
|
||||
* A single user word to add.
|
||||
*/
|
||||
export interface UserWord {
|
||||
/**
|
||||
* The word to add.
|
||||
*/
|
||||
word: string;
|
||||
/**
|
||||
* Part-of-speech tag. Defaults to 'NNP'.
|
||||
*/
|
||||
tag?: string;
|
||||
/**
|
||||
* The weighted score of the morpheme to add.
|
||||
* If there are multiple morpheme combinations that match the form,the word with the higher score will be prioritized.
|
||||
* Defaults to 0.
|
||||
*/
|
||||
score?: number;
|
||||
/**
|
||||
* The original morpheme of the morpheme to be added.
|
||||
* If the morpheme to be added is a variant of a particular morpheme, the original morpheme can be passed as this argument.
|
||||
* If it is not present, it can be omitted.
|
||||
*/
|
||||
origWord?: string;
|
||||
};
|
||||
|
||||
export interface PreanalyzedToken {
|
||||
/**
|
||||
* Form of the token.
|
||||
*/
|
||||
form: string;
|
||||
/**
|
||||
* Part-of-speech tag of the token.
|
||||
*/
|
||||
tag: string;
|
||||
/**
|
||||
* Start position of the token in the preanalyzed word. If omitted, all token positions are automatically calculated.
|
||||
*/
|
||||
start?: number;
|
||||
/**
|
||||
* Ebd position of the token in the preanalyzed word. If omitted, all token positions are automatically calculated.
|
||||
*/
|
||||
end?: number;
|
||||
}
|
||||
|
||||
export interface PreanalyzedWord {
|
||||
/**
|
||||
* Form to add.
|
||||
*/
|
||||
form: string;
|
||||
/**
|
||||
* The result of the morphological analysis of form.
|
||||
*/
|
||||
analyzed: PreanalyzedToken[];
|
||||
/**
|
||||
* The weighted score of the morpheme sequence to add.
|
||||
* If there are multiple morpheme combinations that match the form, the word with the higher score will be prioritized.
|
||||
*/
|
||||
score?: number;
|
||||
}
|
||||
|
||||
export interface TypoDefinition {
|
||||
/**
|
||||
* Source strings
|
||||
*/
|
||||
orig: string[];
|
||||
/**
|
||||
* The typos to be replaced
|
||||
*/
|
||||
error: string[];
|
||||
/**
|
||||
* Replacement cost. Defaults to 1.
|
||||
*/
|
||||
cost?: number;
|
||||
/**
|
||||
* Conditions under which typos can be replaced.
|
||||
* One of `none`, `any` (after any letter), `vowel` (after a vowel), or `applosive` (after an applosive).
|
||||
* Defaults to `none` when omitted.
|
||||
*/
|
||||
condition?: "none" | "any" | "vowel" | "applosive";
|
||||
}
|
||||
|
||||
export interface TypoTransformer {
|
||||
/**
|
||||
* A list of {@link TypoDefinition} that define typo generation rules.
|
||||
*/
|
||||
defs: TypoDefinition[];
|
||||
/**
|
||||
* The cost of continual typos. Defaults to 1.
|
||||
*/
|
||||
continualTypoCost?: number;
|
||||
}
|
||||
|
||||
export interface BuildArgs {
|
||||
/**
|
||||
* The model files to load. Required.
|
||||
*/
|
||||
modelFiles: ModelFiles;
|
||||
/**
|
||||
* If `true`, unify phonological variants.
|
||||
* Outputs endings that change form depending on the positivity/negativity of the preceding vowel, such as /아/ and /어/ or /았/ and /었/, as one.
|
||||
* Defaults to `true`
|
||||
*/
|
||||
integrateAllomorph?: boolean;
|
||||
/**
|
||||
* If `true`, the default dictionary is loaded.
|
||||
* The default dictionary consists of proper noun headings extracted from Wikipedia and Namuwiki.
|
||||
* Defaults to `true`.
|
||||
*/
|
||||
loadDefaultDict?: boolean;
|
||||
/**
|
||||
* If true, the built-in typo dictionary is loaded.
|
||||
* The typo dictionary consists of a subset of common misspellings and variant endings that are commonly used on the internet.
|
||||
* Defaults to `true`.
|
||||
*/
|
||||
loadTypoDict?: boolean;
|
||||
/**
|
||||
* If `true`, the built-in polysemous dictionary is loaded.
|
||||
* The polysemous dictionary consists of proper nouns listed in WikiData.
|
||||
* Defaults to `true`.
|
||||
*/
|
||||
loadMultiDict?: boolean;
|
||||
/**
|
||||
* Additional user dictionaries to load. Used files must appear in the `modelFiles` object.
|
||||
*/
|
||||
userDicts?: string[];
|
||||
/**
|
||||
* Additional user words to load.
|
||||
*/
|
||||
userWords?: UserWord[];
|
||||
/**
|
||||
* Preanalyzed words to load.
|
||||
*/
|
||||
preanalyzedWords?: PreanalyzedWord[];
|
||||
/**
|
||||
* Specifies the language model to use for morphological analysis. Defaults to 'none'.
|
||||
* - `none`: Kiwi selects the model type automatically. If there are multiple models available, the fastest model is selected.
|
||||
* - `largest`: Kiwi selects the model type automatically. If there are multiple models available, the largest model is selected.
|
||||
* - `knlm`: Fast and can model the relationships between morphemes within a short distance (usually two or three) with high accuracy. However, it has the limitation that it cannot take into account the relationships between morphemes over a long distance.
|
||||
* - `sbg`: Driven by internally calibrating the results of SkipBigram to the results of KNLM. At a processing time increase of about 30% compared to KNLM, it is able to model relationships between morphemes over large distances (up to 8 real morphemes) with moderate accuracy.
|
||||
* - `cong`: (experimental) Contextual N-gram embedding Language Model. It consists of lightweighted neural networks that can estimate the relationships between morphemes.
|
||||
* - `cong-global`: (experimental) Contextual N-gram embedding Language Model. It consists of lightweighted neural networks that can estimate the relationships between morphemes over large distances (up to 7 real morphemes) with high accuracy.
|
||||
*/
|
||||
modelType?: 'none' | 'largest' | 'knlm' | 'sbg' | 'cong' | 'cong-global';
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
export * from './build-args.js';
|
||||
export * from './kiwi-builder.js';
|
||||
export * from './kiwi.js';
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
import { ModelFiles } from "./build-args";
|
||||
|
||||
interface LoadModelFilesResult {
|
||||
unload: () => Promise<void>;
|
||||
modelPath: string;
|
||||
}
|
||||
|
||||
export interface KiwiApi {
|
||||
cmd: (args: any) => any;
|
||||
loadModelFiles: (files: ModelFiles) => Promise<LoadModelFilesResult>;
|
||||
}
|
||||
|
||||
export interface KiwiApiAsync {
|
||||
cmd: (...args: any) => Promise<any>;
|
||||
loadFiles: (files: ModelFiles) => Promise<LoadModelFilesResult>;
|
||||
}
|
||||
|
|
@ -1,131 +0,0 @@
|
|||
import initKiwi from './build/kiwi-wasm.js';
|
||||
import { KiwiApi } from './kiwi-api.js';
|
||||
import { Kiwi } from './kiwi.js';
|
||||
import { BuildArgs } from './build-args.js';
|
||||
|
||||
async function createKiwiApi(wasmPath: string): Promise<KiwiApi> {
|
||||
const kiwi = await initKiwi({
|
||||
locateFile: (path) => {
|
||||
if (path.endsWith('.wasm')) {
|
||||
return wasmPath;
|
||||
}
|
||||
return path;
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
cmd: (args: any) => {
|
||||
return JSON.parse(kiwi.api(JSON.stringify(args)));
|
||||
},
|
||||
loadModelFiles: async (files) => {
|
||||
const modelPath =
|
||||
Math.random().toString(36).substring(2) + Date.now();
|
||||
|
||||
kiwi.FS.mkdir(modelPath);
|
||||
|
||||
const fileEntries = Object.entries(files);
|
||||
|
||||
await Promise.all(
|
||||
fileEntries.map(async ([name, data]) => {
|
||||
const path = modelPath + '/' + name;
|
||||
|
||||
if (typeof data === 'string') {
|
||||
const response = await fetch(data);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to fetch file: ${data}`);
|
||||
}
|
||||
|
||||
const fetchData = await response.arrayBuffer();
|
||||
|
||||
kiwi.FS.writeFile(path, new Uint8Array(fetchData));
|
||||
} else {
|
||||
kiwi.FS.writeFile(path, data);
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
return {
|
||||
unload: async () => {
|
||||
kiwi.FS.rmdir(modelPath);
|
||||
},
|
||||
modelPath,
|
||||
};
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to create Kiwi instances. Main entry point for the API.
|
||||
* It is recommended to create a KiwiBuilder and the Kiwi instances in a worker to prevent blocking the main thread.
|
||||
*/
|
||||
export class KiwiBuilder {
|
||||
private api: KiwiApi;
|
||||
|
||||
private constructor(api: KiwiApi) {
|
||||
this.api = api;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new KiwiBuilder instance. This internally loads the wasm file.
|
||||
* @param wasmPath Path to the kiwi-wasm.wasm file. This is located at `/dist/kiwi-wasm.wasm` in the npm package.
|
||||
* It is up to the user to serve this file. See the `package-demo` project for an example of how to include this file as a static asset with vite.
|
||||
*/
|
||||
static async create(wasmPath: string): Promise<KiwiBuilder> {
|
||||
const api = await createKiwiApi(wasmPath);
|
||||
return new KiwiBuilder(api);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new Kiwi instance.
|
||||
* Note: Even though this method is async, the construction of the Kiwi instance happens in the same
|
||||
* JavaScript context. This means that this method can hang your application if not called in a worker.
|
||||
* @param buildArgs Arguments for building the Kiwi instance. See {@link BuildArgs} for more information.
|
||||
* @returns a {@link Kiwi} instance that is ready for morphological analysis.
|
||||
*/
|
||||
public async build(buildArgs: BuildArgs): Promise<Kiwi> {
|
||||
const modelFiles = buildArgs.modelFiles;
|
||||
const loadResult = await this.api.loadModelFiles(modelFiles);
|
||||
|
||||
const apiBuildArgs = {
|
||||
...buildArgs,
|
||||
modelPath: loadResult.modelPath,
|
||||
};
|
||||
apiBuildArgs.modelFiles = undefined;
|
||||
if (apiBuildArgs.userDicts) {
|
||||
apiBuildArgs.userDicts = apiBuildArgs.userDicts.map(
|
||||
(path) => loadResult.modelPath + '/' + path
|
||||
);
|
||||
}
|
||||
|
||||
const id = this.api.cmd({
|
||||
method: 'build',
|
||||
args: [apiBuildArgs],
|
||||
}) as number;
|
||||
|
||||
return new Proxy({}, {
|
||||
get: (_target, prop) => {
|
||||
// prevent recursive promise resolution
|
||||
if (prop === 'then') {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return (...methodArgs: any[]) => {
|
||||
return this.api.cmd({
|
||||
method: prop.toString(),
|
||||
id,
|
||||
args: methodArgs,
|
||||
});
|
||||
};
|
||||
},
|
||||
}) as Kiwi;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the version of the Kiwi wasm module.
|
||||
* @returns The version of the Kiwi wasm module.
|
||||
*/
|
||||
version(): string {
|
||||
return this.api.cmd({ method: 'version', args: [] }) as string;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,313 +0,0 @@
|
|||
import { AsyncMethods } from './util.js';
|
||||
import { TypoTransformer } from './build-args.js';
|
||||
|
||||
/**
|
||||
* Describes a single morpheme in the input string of the morphological analysis.
|
||||
*/
|
||||
export interface TokenInfo {
|
||||
/**
|
||||
* The form of the morpheme.
|
||||
*/
|
||||
str: string;
|
||||
/**
|
||||
* The start position in the input string.
|
||||
*/
|
||||
position: number;
|
||||
/**
|
||||
* Word index in the input string (space based).
|
||||
*/
|
||||
wordPosition: number;
|
||||
/**
|
||||
* Sentence index in the input string.
|
||||
*/
|
||||
sentPosition: number;
|
||||
/**
|
||||
* Line index in the input string.
|
||||
*/
|
||||
lineNumber: number;
|
||||
/**
|
||||
* Length of the morpheme in the input string.
|
||||
*/
|
||||
length: number;
|
||||
/**
|
||||
* Part of speech tag of the morpheme.
|
||||
*/
|
||||
tag: string;
|
||||
/**
|
||||
* Language model score of the morpheme.
|
||||
*/
|
||||
score: number;
|
||||
/**
|
||||
* Cost of the typo that was corrected. If no typo correction was performed, this value is 0.
|
||||
*/
|
||||
typoCost: number;
|
||||
/**
|
||||
* Typo correction form if typo correction was performed. Id of pretokenized span if no typo correction was performed.
|
||||
*/
|
||||
typoFormId: number;
|
||||
/**
|
||||
* For morphemes belonging to SSO, SSC part of speech tags, the position of the paired morpheme (-1 means no corresponding morpheme).
|
||||
*/
|
||||
pairedToken: number;
|
||||
/**
|
||||
* The index of the sub-sentence enclosed in quotation marks or parentheses. Starts at 1. A value of 0 indicates that it is not a subordinate sentence.
|
||||
*/
|
||||
subSentPosition: number;
|
||||
/**
|
||||
* The id of the morpheme information in the used Kiwi object. -1 indicates OOV.
|
||||
*/
|
||||
morphId: number;
|
||||
|
||||
}
|
||||
|
||||
export interface TokenResult {
|
||||
/**
|
||||
* Array of `TokenInfo` objects representing the morphemes in the input string.
|
||||
*/
|
||||
tokens: TokenInfo[];
|
||||
/**
|
||||
* The score of the morphological analysis result.
|
||||
*/
|
||||
score: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Describes matching options when performing morphological analysis.
|
||||
* These options can be combined using the bitwise OR operator.
|
||||
*/
|
||||
export enum Match {
|
||||
none = 0,
|
||||
url = 1 << 0,
|
||||
email = 1 << 1,
|
||||
hashtag = 1 << 2,
|
||||
mention = 1 << 3,
|
||||
serial = 1 << 4,
|
||||
emoji = 1 << 5,
|
||||
oovRuleOnly = 0 << 8,
|
||||
oovChrModel = 1 << 8,
|
||||
oovChrFreqModel = 2 << 8,
|
||||
oovChrFreqBranchModel = 3 << 8,
|
||||
oovMask = 3 << 8,
|
||||
normalizeCoda = 1 << 16,
|
||||
joinNounPrefix = 1 << 17,
|
||||
joinNounSuffix = 1 << 18,
|
||||
joinVerbSuffix = 1 << 19,
|
||||
joinAdjSuffix = 1 << 20,
|
||||
joinAdvSuffix = 1 << 21,
|
||||
splitComplex = 1 << 22,
|
||||
zCoda = 1 << 23,
|
||||
compatibleJamo = 1 << 24,
|
||||
splitSaisiot = 1 << 25,
|
||||
mergeSaisiot = 1 << 26,
|
||||
joinParticleYo = 1 << 27,
|
||||
joinVSuffix = joinVerbSuffix | joinAdjSuffix,
|
||||
joinAffix = joinNounPrefix |
|
||||
joinNounSuffix |
|
||||
joinVerbSuffix |
|
||||
joinAdjSuffix |
|
||||
joinAdvSuffix,
|
||||
all = url | email | hashtag | mention | serial | emoji | zCoda,
|
||||
allWithNormalizing = all | normalizeCoda,
|
||||
}
|
||||
|
||||
export interface SentenceSpan {
|
||||
start: number;
|
||||
end: number;
|
||||
}
|
||||
|
||||
export interface SentenceSplitResult {
|
||||
/**
|
||||
* Array of `SentenceSpan` objects representing the start and end positions of each sentence.
|
||||
*/
|
||||
spans: SentenceSpan[];
|
||||
/**
|
||||
* Array of `TokenResult` objects representing the morphological analysis result of the input string.
|
||||
*/
|
||||
tokenResult: TokenResult | null;
|
||||
}
|
||||
|
||||
export enum Space {
|
||||
none = 0,
|
||||
noSpace = 1,
|
||||
insertSpace = 2,
|
||||
}
|
||||
|
||||
export interface Morph {
|
||||
form: string;
|
||||
tag: string;
|
||||
}
|
||||
|
||||
export interface SentenceJoinMorph extends Morph {
|
||||
space?: Space;
|
||||
}
|
||||
|
||||
export interface SentenceJoinResult {
|
||||
str: string;
|
||||
ranges: SentenceSpan[] | null;
|
||||
}
|
||||
|
||||
export type MorphemeSet = number;
|
||||
|
||||
export interface PretokenizedToken extends Morph {
|
||||
start: number;
|
||||
end: number;
|
||||
}
|
||||
|
||||
export interface PretokenizedSpan {
|
||||
start: number;
|
||||
end: number;
|
||||
tokenization: PretokenizedToken[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Describes global configuration for Kiwi.
|
||||
*/
|
||||
export interface KiwiConfig {
|
||||
integrateAllomorph?: boolean;
|
||||
cutOffThreshold?: number;
|
||||
oovRuleScale?: number;
|
||||
oovRuleBias?: number;
|
||||
oovChrBias?: number;
|
||||
oovGlobalWeight?: number;
|
||||
oovLocalWeight?: number;
|
||||
oovGlobalMinFreq?: number;
|
||||
spacePenalty?: number;
|
||||
typoCostWeight?: number;
|
||||
maxUnkFormSize?: number;
|
||||
maxUnkFormSizeFollowedByJClass?: number;
|
||||
spaceTolerance?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface that performs the actual morphological analysis.
|
||||
* Cannot be constructed directly, use {@link KiwiBuilder} to create a new instance.
|
||||
*/
|
||||
export interface Kiwi {
|
||||
/**
|
||||
* Tells whether the current Kiwi object is ready to perform morphological analysis.
|
||||
* @returns `true` if it is ready for morphological analysis.
|
||||
*/
|
||||
ready: () => boolean;
|
||||
/**
|
||||
* Tells you if the current Kiwi object was created with typo correction turned on.
|
||||
* @returns `true` if typo correction is turned on.
|
||||
*/
|
||||
isTypoTolerant: () => boolean;
|
||||
/**
|
||||
* Performs morphological analysis. Returns a single list of tokens along with an analysis score. Use `tokenize` if the result score is not needed. Use `analyzeTopN` if you need multiple results.
|
||||
* @param str String to analyze
|
||||
* @param matchOptions Specifies the special string pattern extracted. This can be set to any combination of `Match` by using the bitwise OR operator.
|
||||
* @param blockList Specifies a list of morphemes to prohibit from appearing as candidates in the analysis.
|
||||
* @param pretokenized Predefines the result of morphological analysis of a specific segment of text prior to morphological analysis. The section of text defined by this value will always be tokenized in that way only.
|
||||
* @returns A single `TokenResult` object.
|
||||
*/
|
||||
analyze: (
|
||||
str: string,
|
||||
matchOptions?: Match,
|
||||
blockList?: Morph[] | MorphemeSet,
|
||||
pretokenized?: PretokenizedSpan[],
|
||||
typos?: 'none' | 'basic' | 'continual' | 'basicWithContinual' | TypoTransformer,
|
||||
typoCostThreshold?: number
|
||||
) => TokenResult;
|
||||
/**
|
||||
* Performs morphological analysis. Returns multiple list of tokens along with an analysis score. Use `tokenizeTopN` if the result scores are not needed. Use `analyze` if you need only one result.
|
||||
* @param str String to analyze
|
||||
* @param n Number of results to return
|
||||
* @param matchOptions Specifies the special string pattern extracted. This can be set to any combination of `Match` by using the bitwise OR operator.
|
||||
* @param blockList Specifies a list of morphemes to prohibit from appearing as candidates in the analysis.
|
||||
* @param pretokenized Predefines the result of morphological analysis of a specific segment of text prior to morphological analysis. The section of text defined by this value will always be tokenized in that way only.
|
||||
* @returns A list of `TokenResult` objects.
|
||||
*/
|
||||
analyzeTopN: (
|
||||
str: string,
|
||||
n: number,
|
||||
matchOptions?: Match,
|
||||
blockList?: Morph[] | MorphemeSet,
|
||||
pretokenized?: PretokenizedSpan[],
|
||||
typos?: 'none' | 'basic' | 'continual' | 'basicWithContinual' | TypoTransformer,
|
||||
typoCostThreshold?: number
|
||||
) => TokenResult[];
|
||||
/**
|
||||
* Performs morphological analysis. Returns a single list of tokens. Use `analyze` if the result score is needed. Use `tokenizeTopN` if you need multiple results.
|
||||
* @param str String to analyze
|
||||
* @param matchOptions Specifies the special string pattern extracted. This can be set to any combination of `Match` by using the bitwise OR operator.
|
||||
* @param blockList Specifies a list of morphemes to prohibit from appearing as candidates in the analysis.
|
||||
* @param pretokenized Predefines the result of morphological analysis of a specific segment of text prior to morphological analysis. The section of text defined by this value will always be tokenized in that way only.
|
||||
* @returns A list of `TokenInfo` object.
|
||||
*/
|
||||
tokenize: (
|
||||
str: string,
|
||||
matchOptions?: Match,
|
||||
blockList?: Morph[] | MorphemeSet,
|
||||
pretokenized?: PretokenizedSpan[],
|
||||
typos?: 'none' | 'basic' | 'continual' | 'basicWithContinual' | TypoTransformer,
|
||||
typoCostThreshold?: number
|
||||
) => TokenInfo[];
|
||||
/**
|
||||
* Performs morphological analysis. Returns multiple lists of tokens. Use `analyzeTopN` if the result scores are needed. Use `tokenize` if you need only one result.
|
||||
* @param str String to analyze
|
||||
* @param n Number of results to return
|
||||
* @param matchOptions Specifies the special string pattern extracted. This can be set to any combination of `Match` by using the bitwise OR operator.
|
||||
* @param blockList Specifies a list of morphemes to prohibit from appearing as candidates in the analysis.
|
||||
* @param pretokenized Predefines the result of morphological analysis of a specific segment of text prior to morphological analysis. The section of text defined by this value will always be tokenized in that way only.
|
||||
* @returns A list of lists of `TokenInfo` objects.
|
||||
*/
|
||||
tokenizeTopN: (
|
||||
str: string,
|
||||
n: number,
|
||||
matchOptions?: Match,
|
||||
blockList?: Morph[] | MorphemeSet,
|
||||
pretokenized?: PretokenizedSpan[],
|
||||
typos?: 'none' | 'basic' | 'continual' | 'basicWithContinual' | TypoTransformer,
|
||||
typoCostThreshold?: number
|
||||
) => TokenInfo[][];
|
||||
/**
|
||||
* Returns the input text split into sentences. This method uses stemming internally during the sentence splitting process, so it can also be used to get stemming results simultaneously with sentence splitting.
|
||||
* @param str String to split
|
||||
* @param matchOptions Specifies the special string pattern extracted. This can be set to any combination of `Match` by using the bitwise OR operator.
|
||||
* @param withTokenResult Specifies whether to include the result of morphological analysis in the returned `SentenceSplitResult` object.
|
||||
* @returns A `SentenceSplitResult` object.
|
||||
*/
|
||||
splitIntoSents: (
|
||||
str: string,
|
||||
matchOptions?: Match,
|
||||
withTokenResult?: boolean
|
||||
) => SentenceSplitResult;
|
||||
/**
|
||||
* Combines morphemes and restores them to a sentence. Endings are changed to the appropriate form to match the preceding morpheme.
|
||||
* @param morphs List of morphemes to combine
|
||||
* @param lmSearch When there is an ambiguous morpheme that can be restored in more than one form, if this value is `true`, the language model is explored to select the best form. If `false`, no exploration is performed, but restoration is faster.
|
||||
* @param withRanges Wehther to include the ranges of the morphemes in the returned `SentenceJoinResult` object.
|
||||
* @returns
|
||||
*/
|
||||
joinSent: (
|
||||
morphs: SentenceJoinMorph[],
|
||||
lmSearch?: boolean,
|
||||
withRanges?: boolean
|
||||
) => SentenceJoinResult;
|
||||
|
||||
getGlobalConfig: () => KiwiConfig;
|
||||
setGlobalConfig: (config: KiwiConfig) => void;
|
||||
|
||||
/**
|
||||
* Creates a reusable morpheme set from a list of morphemes. This is intended to be used as the `blockList` parameter for the analyse and tokenize methods.
|
||||
* NOTE: The morpheme set must be destroyed using `destroyMorphemeSet` when it is no longer needed. Otherwise, it will cause a memory leak.
|
||||
* If you are using the morpheme set only once, you can pass the morpheme list directly to the `blockList` parameter instead of creating a morpheme set.
|
||||
* @param morphs List of morphemes to create a set from
|
||||
* @returns an handle to the created morpheme set
|
||||
*/
|
||||
createMorphemeSet: (morphs: Morph[]) => MorphemeSet;
|
||||
/**
|
||||
* Destroys a morpheme set created by `createMorphemeSet`.
|
||||
* @param id Handle to the morpheme set to destroy
|
||||
*/
|
||||
destroyMorphemeSet: (id: MorphemeSet) => void;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Interface that performs the actual morphological analysis.
|
||||
* Same as `Kiwi`, but with all methods returning promises. This can be used when the original `Kiwi` object is constructed with a Web Worker.
|
||||
* Cannot be constructed directly.
|
||||
*/
|
||||
export type KiwiAsync = AsyncMethods<Kiwi>;
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
export type AsyncMethods<T> = {
|
||||
[K in keyof T]: T[K] extends (...args: any) => any
|
||||
? (...args: Parameters<T[K]>) => Promise<ReturnType<T[K]>>
|
||||
: T[K];
|
||||
};
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
import { describe, it, expect, beforeAll } from 'vitest';
|
||||
import { KiwiBuilder } from '../src/index.js';
|
||||
import { Kiwi, Match } from '../src/kiwi.js';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
const PROJECT_ROOT = path.resolve(__dirname, '../../../../');
|
||||
const WASM_PATH = path.resolve(PROJECT_ROOT, 'bindings/wasm/build/bindings/wasm/kiwi-wasm.wasm');
|
||||
const MODEL_DIR = path.resolve(PROJECT_ROOT, 'models/cong/base');
|
||||
|
||||
function loadModelFiles(): Record<string, Uint8Array> {
|
||||
const modelFiles: Record<string, Uint8Array> = {};
|
||||
const files = [
|
||||
'combiningRule.txt', 'cong.mdl', 'default.dict',
|
||||
'dialect.dict', 'extract.mdl', 'multi.dict',
|
||||
'nounchr.mdl', 'sj.morph', 'typo.dict'
|
||||
];
|
||||
|
||||
for (const file of files) {
|
||||
const filePath = path.join(MODEL_DIR, file);
|
||||
if (fs.existsSync(filePath)) {
|
||||
modelFiles[file] = fs.readFileSync(filePath);
|
||||
}
|
||||
}
|
||||
return modelFiles;
|
||||
}
|
||||
|
||||
describe('Kiwi WASM', () => {
|
||||
let kiwiBuilder: KiwiBuilder;
|
||||
let kiwi: Kiwi;
|
||||
|
||||
beforeAll(async () => {
|
||||
if (!fs.existsSync(WASM_PATH)) {
|
||||
console.warn(`WASM file not found at ${WASM_PATH}. Skipping tests.`);
|
||||
return;
|
||||
}
|
||||
kiwiBuilder = await KiwiBuilder.create(WASM_PATH);
|
||||
kiwi = await kiwiBuilder.build({
|
||||
modelFiles: loadModelFiles(),
|
||||
modelType: 'cong',
|
||||
integrateAllomorph: true,
|
||||
});
|
||||
});
|
||||
|
||||
it('should be initialized', async () => {
|
||||
if (!kiwiBuilder) return;
|
||||
expect(kiwiBuilder.version()).toBeTypeOf('string');
|
||||
});
|
||||
|
||||
it('should tokenize text', async () => {
|
||||
if (!kiwi) return;
|
||||
|
||||
expect(kiwi.ready()).toBe(true);
|
||||
|
||||
const result = kiwi.tokenize('안녕하세요 세계');
|
||||
expect(result.length).toBeGreaterThan(0);
|
||||
|
||||
const tokens = result.map(t => t.str);
|
||||
expect(tokens).toContain('안녕');
|
||||
});
|
||||
|
||||
it('should split sentences', async () => {
|
||||
if (!kiwi) return;
|
||||
|
||||
const result = kiwi.splitIntoSents('안녕하세요. 반갑습니다!');
|
||||
expect(result.spans.length).toBe(2);
|
||||
});
|
||||
|
||||
it('should correct typos with basic typo set via tokenize', async () => {
|
||||
if (!kiwi) return;
|
||||
|
||||
// Without typo correction
|
||||
const tokensNoTypo = kiwi.tokenize('나 죰 도와죠.');
|
||||
expect(tokensNoTypo.map(t => t.str)).toContain('죰');
|
||||
|
||||
// With basic typo correction at analyze time
|
||||
const tokensWithTypo = kiwi.tokenize('나 죰 도와죠.', Match.allWithNormalizing, undefined, undefined, 'basic');
|
||||
expect(tokensWithTypo.map(t => t.str)).toContain('좀');
|
||||
});
|
||||
|
||||
it('should correct typos with basic typo set via analyze', async () => {
|
||||
if (!kiwi) return;
|
||||
|
||||
const result = kiwi.analyze('나 죰 도와죠.', Match.allWithNormalizing, undefined, undefined, 'basic');
|
||||
expect(result.tokens.map(t => t.str)).toContain('좀');
|
||||
});
|
||||
|
||||
it('should correct typos with basic typo set via analyzeTopN', async () => {
|
||||
if (!kiwi) return;
|
||||
|
||||
const results = kiwi.analyzeTopN('나 죰 도와죠.', 3, Match.allWithNormalizing, undefined, undefined, 'basic');
|
||||
expect(results.length).toBeGreaterThan(0);
|
||||
expect(results[0].tokens.map(t => t.str)).toContain('좀');
|
||||
});
|
||||
|
||||
it('should correct continual typos', async () => {
|
||||
if (!kiwi) return;
|
||||
|
||||
const tokens = kiwi.tokenize('프로그래미', Match.allWithNormalizing, undefined, undefined, 'continual');
|
||||
const forms = tokens.map(t => t.str);
|
||||
expect(forms[0]).toBe('프로그램');
|
||||
expect(forms[1]).toBe('이');
|
||||
});
|
||||
|
||||
it('should correct typos with basicWithContinual', async () => {
|
||||
if (!kiwi) return;
|
||||
|
||||
// continual typo
|
||||
const tokens1 = kiwi.tokenize('프로그래미', Match.allWithNormalizing, undefined, undefined, 'basicWithContinual');
|
||||
expect(tokens1.map(t => t.str)[0]).toBe('프로그램');
|
||||
|
||||
// basic typo
|
||||
const tokens2 = kiwi.tokenize('나 죰 도와죠.', Match.allWithNormalizing, undefined, undefined, 'basicWithContinual');
|
||||
expect(tokens2.map(t => t.str)).toContain('좀');
|
||||
});
|
||||
|
||||
it('should get and set global config', async () => {
|
||||
if (!kiwi) return;
|
||||
|
||||
const config = kiwi.getGlobalConfig();
|
||||
expect(config.cutOffThreshold).toBeTypeOf('number');
|
||||
|
||||
const originalThreshold = config.cutOffThreshold;
|
||||
kiwi.setGlobalConfig({ cutOffThreshold: 10 });
|
||||
|
||||
const newConfig = kiwi.getGlobalConfig();
|
||||
expect(newConfig.cutOffThreshold).toBe(10);
|
||||
|
||||
// Restore
|
||||
kiwi.setGlobalConfig({ cutOffThreshold: originalThreshold });
|
||||
});
|
||||
});
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "ES6",
|
||||
"moduleResolution": "node",
|
||||
"target": "ES2017",
|
||||
"allowJs": true,
|
||||
"declaration": true,
|
||||
"skipLibCheck": true,
|
||||
"outDir": "./dist"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
}
|
||||
|
|
@ -1,362 +0,0 @@
|
|||
# StreamProvider API Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The StreamProvider interface allows KiwiBuilder to read model files from sources other than the traditional filesystem. This enables embedding models in applications, loading from databases, network sources, or any custom data source.
|
||||
|
||||
## C++ API
|
||||
|
||||
### Basic Usage
|
||||
|
||||
```cpp
|
||||
#include <kiwi/Kiwi.h>
|
||||
|
||||
// Define a StreamProvider function
|
||||
kiwi::KiwiBuilder::StreamProvider myProvider = [](const std::string& filename) -> std::unique_ptr<std::istream> {
|
||||
// Return stream for the requested file
|
||||
// Return nullptr if file not found
|
||||
};
|
||||
|
||||
// Create KiwiBuilder with StreamProvider
|
||||
kiwi::KiwiBuilder builder(myProvider, numThreads, options, modelType);
|
||||
auto kiwi = builder.build();
|
||||
```
|
||||
|
||||
### Memory-based Example
|
||||
|
||||
```cpp
|
||||
#include <sstream>
|
||||
#include <map>
|
||||
|
||||
std::map<std::string, std::string> modelFiles = {
|
||||
{"config.txt", "model_type=base\nversion=1.0"},
|
||||
{"basic.mdl", "binary_model_data"},
|
||||
{"combinedRule.txt", "rule1\nrule2"}
|
||||
};
|
||||
|
||||
auto streamProvider = [&modelFiles](const std::string& filename) -> std::unique_ptr<std::istream> {
|
||||
auto it = modelFiles.find(filename);
|
||||
if (it != modelFiles.end()) {
|
||||
return std::make_unique<std::istringstream>(it->second);
|
||||
}
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
kiwi::KiwiBuilder builder(streamProvider, 4, kiwi::BuildOption::default_);
|
||||
```
|
||||
|
||||
## C API
|
||||
|
||||
### Function Signature
|
||||
|
||||
```c
|
||||
#include <kiwi/capi.h>
|
||||
|
||||
typedef size_t(*kiwi_stream_read_func)(void* user_data, char* buffer, size_t length);
|
||||
typedef long long(*kiwi_stream_seek_func)(void* user_data, long long offset, int whence);
|
||||
typedef void(*kiwi_stream_close_func)(void* user_data);
|
||||
|
||||
typedef struct {
|
||||
kiwi_stream_read_func read;
|
||||
kiwi_stream_seek_func seek;
|
||||
kiwi_stream_close_func close;
|
||||
void* user_data;
|
||||
} kiwi_stream_object_t;
|
||||
|
||||
kiwi_builder_h kiwi_builder_init_stream(
|
||||
kiwi_stream_object_t (*stream_object_factory)(const char* filename),
|
||||
int num_threads,
|
||||
int options
|
||||
);
|
||||
```
|
||||
|
||||
### Usage Example
|
||||
|
||||
```c
|
||||
// Stream implementation
|
||||
typedef struct {
|
||||
const char* data;
|
||||
size_t size;
|
||||
size_t position;
|
||||
} memory_stream_t;
|
||||
|
||||
size_t memory_read(void* user_data, char* buffer, size_t length) {
|
||||
memory_stream_t* stream = (memory_stream_t*)user_data;
|
||||
size_t available = stream->size - stream->position;
|
||||
size_t to_read = (length < available) ? length : available;
|
||||
|
||||
memcpy(buffer, stream->data + stream->position, to_read);
|
||||
stream->position += to_read;
|
||||
return to_read;
|
||||
}
|
||||
|
||||
long long memory_seek(void* user_data, long long offset, int whence) {
|
||||
memory_stream_t* stream = (memory_stream_t*)user_data;
|
||||
// Implement seeking logic
|
||||
return new_position;
|
||||
}
|
||||
|
||||
void memory_close(void* user_data) {
|
||||
free(user_data);
|
||||
}
|
||||
|
||||
kiwi_stream_object_t create_stream(const char* filename) {
|
||||
// Load file data (implementation specific)
|
||||
memory_stream_t* mem_stream = load_file_data(filename);
|
||||
|
||||
kiwi_stream_object_t stream_obj = {0};
|
||||
stream_obj.read = memory_read;
|
||||
stream_obj.seek = memory_seek;
|
||||
stream_obj.close = memory_close;
|
||||
stream_obj.user_data = mem_stream;
|
||||
|
||||
return stream_obj;
|
||||
}
|
||||
|
||||
// Create KiwiBuilder
|
||||
kiwi_builder_h builder = kiwi_builder_init_stream(
|
||||
create_stream,
|
||||
4, // num_threads
|
||||
KIWI_BUILD_DEFAULT
|
||||
);
|
||||
|
||||
if (builder) {
|
||||
kiwi_h kiwi = kiwi_builder_build(builder, NULL, 0);
|
||||
// Use kiwi...
|
||||
kiwi_close(kiwi);
|
||||
kiwi_builder_close(builder);
|
||||
}
|
||||
```
|
||||
|
||||
## Java API
|
||||
|
||||
### Interface Definition
|
||||
|
||||
```java
|
||||
@FunctionalInterface
|
||||
public interface StreamProvider {
|
||||
InputStream provide(String filename);
|
||||
}
|
||||
```
|
||||
|
||||
### Usage Example
|
||||
|
||||
```java
|
||||
import kr.pe.bab2min.KiwiBuilder;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.Map;
|
||||
|
||||
// Create model file map
|
||||
Map<String, byte[]> modelFiles = Map.of(
|
||||
"config.txt", "model_type=base\nversion=1.0".getBytes(),
|
||||
"basic.mdl", getBinaryModelData(),
|
||||
"combinedRule.txt", "rule1\nrule2".getBytes()
|
||||
);
|
||||
|
||||
// StreamProvider implementation
|
||||
KiwiBuilder.StreamProvider provider = filename -> {
|
||||
byte[] data = modelFiles.get(filename);
|
||||
return data != null ? new ByteArrayInputStream(data) : null;
|
||||
};
|
||||
|
||||
// Create KiwiBuilder
|
||||
KiwiBuilder builder = new KiwiBuilder(
|
||||
provider,
|
||||
4, // numWorkers
|
||||
KiwiBuilder.BuildOption.default_,
|
||||
KiwiBuilder.ModelType.none
|
||||
);
|
||||
|
||||
Kiwi kiwi = builder.build();
|
||||
```
|
||||
|
||||
### Lambda Expression
|
||||
|
||||
```java
|
||||
// Concise lambda syntax
|
||||
KiwiBuilder builder = new KiwiBuilder(
|
||||
filename -> getModelStream(filename),
|
||||
4,
|
||||
KiwiBuilder.BuildOption.default_
|
||||
);
|
||||
```
|
||||
|
||||
## WASM/JavaScript API
|
||||
|
||||
### Function Definition
|
||||
|
||||
```javascript
|
||||
// Define global StreamProvider function
|
||||
function myStreamProviderFunction(filename) {
|
||||
// Return Uint8Array, ArrayBuffer, or null
|
||||
if (filename === 'config.txt') {
|
||||
return new TextEncoder().encode('model_type=base\nversion=1.0');
|
||||
}
|
||||
return null; // File not found
|
||||
}
|
||||
|
||||
// Make globally available
|
||||
window.myStreamProviderFunction = myStreamProviderFunction;
|
||||
```
|
||||
|
||||
### Usage Example
|
||||
|
||||
```javascript
|
||||
// Build request with StreamProvider
|
||||
const buildRequest = {
|
||||
method: 'buildWithStreamProvider',
|
||||
args: [{
|
||||
streamProviderCallback: 'myStreamProviderFunction',
|
||||
modelType: 'none',
|
||||
integrateAllomorph: true,
|
||||
loadDefaultDict: false,
|
||||
userWords: [
|
||||
{ word: '테스트', tag: 'NNG', score: 0.0 }
|
||||
]
|
||||
}]
|
||||
};
|
||||
|
||||
// Create KiwiBuilder
|
||||
const kiwiId = kiwi.api(JSON.stringify(buildRequest));
|
||||
const result = JSON.parse(kiwiId);
|
||||
```
|
||||
|
||||
### Advanced Example with Fetch
|
||||
|
||||
```javascript
|
||||
function networkStreamProvider(filename) {
|
||||
// Note: This is pseudo-code as WASM StreamProvider must be synchronous
|
||||
// In practice, you'd pre-fetch and cache the data
|
||||
const cachedData = modelCache[filename];
|
||||
if (cachedData) {
|
||||
return new Uint8Array(cachedData);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Pre-cache model files
|
||||
async function loadModels() {
|
||||
const files = ['config.txt', 'basic.mdl', 'combinedRule.txt'];
|
||||
for (const file of files) {
|
||||
const response = await fetch(`/models/${file}`);
|
||||
modelCache[file] = await response.arrayBuffer();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Use Cases
|
||||
|
||||
### 1. Embedded Applications
|
||||
|
||||
Package model files as binary resources in your application:
|
||||
|
||||
```cpp
|
||||
// Embed model files as byte arrays
|
||||
extern const char config_txt[];
|
||||
extern const size_t config_txt_len;
|
||||
|
||||
auto provider = [](const std::string& filename) -> std::unique_ptr<std::istream> {
|
||||
if (filename == "config.txt") {
|
||||
return std::make_unique<std::istringstream>(
|
||||
std::string(config_txt, config_txt_len)
|
||||
);
|
||||
}
|
||||
return nullptr;
|
||||
};
|
||||
```
|
||||
|
||||
### 2. Network Loading
|
||||
|
||||
Load models from a CDN or server:
|
||||
|
||||
```java
|
||||
KiwiBuilder.StreamProvider networkProvider = filename -> {
|
||||
try {
|
||||
URL url = new URL("https://cdn.example.com/models/" + filename);
|
||||
return url.openStream();
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### 3. Database Storage
|
||||
|
||||
Store models in a database:
|
||||
|
||||
```cpp
|
||||
auto dbProvider = [&database](const std::string& filename) -> std::unique_ptr<std::istream> {
|
||||
auto data = database.getModelFile(filename);
|
||||
if (!data.empty()) {
|
||||
return std::make_unique<std::istringstream>(data);
|
||||
}
|
||||
return nullptr;
|
||||
};
|
||||
```
|
||||
|
||||
### 4. Encrypted/Compressed Models
|
||||
|
||||
Decrypt or decompress models on-the-fly:
|
||||
|
||||
```c
|
||||
int encrypted_provider(const char* filename, char* buffer, void* user_data) {
|
||||
if (buffer == NULL) {
|
||||
return get_encrypted_file_size(filename);
|
||||
}
|
||||
|
||||
// Decrypt data into buffer
|
||||
return decrypt_file(filename, buffer);
|
||||
}
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
### C++
|
||||
- Return `nullptr` from StreamProvider for missing files
|
||||
- Exceptions thrown by StreamProvider are caught and handled
|
||||
|
||||
### C API
|
||||
- Return `-1` from callback function to indicate error
|
||||
- Check return value of `kiwi_builder_init_stream` for `NULL`
|
||||
|
||||
### Java
|
||||
- Return `null` from `StreamProvider.provide()` for missing files
|
||||
- IOException and other exceptions are handled gracefully
|
||||
|
||||
### WASM
|
||||
- Return `null` or `undefined` from JavaScript function for missing files
|
||||
- JavaScript exceptions are caught and handled
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
1. **Caching**: Cache frequently accessed files in memory
|
||||
2. **Lazy Loading**: Only load files when requested
|
||||
3. **Compression**: Consider compressing model files and decompressing in StreamProvider
|
||||
4. **Threading**: StreamProvider may be called from multiple threads in C++
|
||||
|
||||
## Limitations
|
||||
|
||||
1. **WordDetector**: When using StreamProvider, `extractWords()` and `extractAddWords()` methods are not available
|
||||
2. **Synchronous**: All StreamProvider implementations must be synchronous
|
||||
3. **WASM**: JavaScript callback function must be globally accessible
|
||||
4. **Memory**: Large models loaded into memory may increase RAM usage
|
||||
|
||||
## Migration Guide
|
||||
|
||||
### From Filesystem to StreamProvider
|
||||
|
||||
**Before:**
|
||||
```cpp
|
||||
KiwiBuilder builder("/path/to/models", numThreads, options);
|
||||
```
|
||||
|
||||
**After:**
|
||||
```cpp
|
||||
auto provider = [](const std::string& filename) {
|
||||
return std::make_unique<std::ifstream>("/path/to/models/" + filename, std::ios::binary);
|
||||
};
|
||||
KiwiBuilder builder(provider, numThreads, options);
|
||||
```
|
||||
|
||||
This allows gradual migration and testing of the StreamProvider interface while maintaining the same functionality.
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
# 한국어 방언 형태소 분석 평가데이터
|
||||
|
||||
[우리말샘](https://opendict.korean.go.kr/)에서 제공하는 예문 중 방언 예문들만 수집하여 자동으로 형태소 분석 수행 후 수작업으로 교정하는 방식으로 데이터셋 구축.
|
||||
|
||||
## 방언 목록
|
||||
* chungcheong: 충청, 충남, 충북
|
||||
* gangwon: 강원
|
||||
* gyeonggi: 경기
|
||||
* gyeongsang: 경상, 경북, 경남
|
||||
* hamgyeong: 함경, 함남, 함북
|
||||
* hwanghae: 황해
|
||||
* jeolla: 전라, 전북, 전남
|
||||
* jeju: 제주
|
||||
* pyeongan: 평안, 평남, 평북
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
잠깐만 긁어두 갈퀴밥이 잔뜩이여. 잠깐/NNG 만/JX 긁/VV 어두/EC 갈퀴밥__1/NNG 이/JKS 잔뜩/MAG 이/VCP 여/EF ./SF 잠깐만 긁어도 갈큇밥이 잔뜩이야.
|
||||
버리똥이 익으믄 붉어진다. 버리똥__1/NNG 이/VCP 익/VV 으믄/EC 붉/VA 어/EC 지/VX ᆫ다/EF ./SF 보리수가 익으면 붉어진다.
|
||||
네 선상님하고 여기 으른들하구는 동곱질 같은 거 핼 때부터 친구였다니께. 너/NP 의/JKG 선상님__1/NNG 하고/JC 여기/NP 으른__1/NNG 들/XSN 하구/JC 는/JX 동곱질__1/NNG 같/VA 은/ETM 거/NNB 하/VV ᆯ/ETM 때/NNG 부터/JX 친구/NNG 이/VCP 었/EP 다니께/EF ./SF 네 선생님하고 여기 어른들하고는 소꿉질 같은 거 할 때부터 친구였다니까.
|
||||
저울에 땔 땔감을 미리 장만해야 되잖에유. 저울__4/NNG 에/JKB 때/VV ᆯ/ETM 땔감/NNG 을/JKO 미리/MAG 장만/NNG 하/XSV 어야/EC 되/VV 잖에유/EF ./SF 겨울에 땔 땔감을 미리 장만해야 되잖아요.
|
||||
그러고서는 산내기 꽈서 전부 늘여 지붕을 덮잖여. 그러/VV 고서/EC 는/JX 산내기__1/NNG 꼬/VV 어서/EC 전부/MAG 늘이/VV 어/EC 지붕/NNG 을/JKO 덮/VV 잖여/EF ./SF 그러고서는 새끼 꼬아서 전부 늘여 지붕을 덮잖아.
|
||||
금자리에 물리면 엄칭이 갠지럽더라구요. 금자리__1/NNG 에/JKB 물리/VV 면/EC 엄칭이__1/MAG 갠지럽__2/VA-I 더라구요/EF ./SF 거머리에 물리면 엄청 간지럽더라고요.
|
||||
소 몰 적이 저쪽으루 갈 째 ‘저저저저’ 하는 겨. 소/NNG 몰/VV ᆯ/ETM 적/NNB 이/JKS 저쪽/NP 으루/JKB 가/VV ᆯ/ETM 째__3/NNG ‘/SSO 저/MM 저/MM 저/MM 저/MM ’/SSC 하/VV 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 소 몰 적에 저쪽으로 갈 때 ‘저저저저’ 하는 거야.
|
||||
국이 근덕지두 없구 맛이 웂구먼. 국/NNG 이/JKS 근덕지__1/NNG 두/JX 없/VA 구/EC 맛/NNG 이/JKS 웂__1/VA 구먼/EF ./SF 국이 건더기도 없고 맛이 없구먼.
|
||||
남자 장금은 오약손으루 보는 겨. 남자/NNG 장금__2/NNG 은/JX 오약손__1/NNG 으루/JKB 보/VV 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 남자 손금은 왼손으로 보는 거야.
|
||||
쌀이서 뉘를 골러내야 되는 겨. 쌀/NNG 이서/JKB 뉘/NNG 를/JKO 골러내__1/VV 어야/EC 되/VV 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 쌀에서 뉘를 골라내야 되는 거야.
|
||||
어딜 그리 줄불나게 돌아댕긴댜? 어디/NP ᆯ/JKO 그리/MAG 줄불나/VV 게/EC 돌/VV 어/EC 댕기/VV ᆫ댜/EF ?/SF 어디를 그리 계속해서 자주 돌아다닌대?
|
||||
왕대 죽순 만들라문 이 순이 빼족허게 나올 때 거기다 꽉 허니 뭐 장떼께나 저런 것 꽉 씌워 놓는대요. 왕대/NNP 죽순/NNG 만들/VV 라/EC 문/NNG 이/JKS 순이/NNP 빼족/XR 허/XSA 게/EC 나오/VV ᆯ/ETM 때/NNG 거기/NP 다/JX 꽉/MAG 허/VV 니/EC 뭐/IC 장떼께__1/NNG 나/JC 저런/MM 것/NNB 꽉/MAG 씌우/VV 어/EC 놓/VX 는대요/EF ./SF 왕대 죽순 만들려면 이 순이 빼족하게 나올 때 거기다 꽉 하니 뭐 장독소래기나 저런 것을 꽉 씌워 놓는대요.
|
||||
금방이라도 그를 줘팰 듯한 분위기다. 금방/MAG 이/VCP 라도/EC 그/NP 를/JKO 줘패/VV ᆯ/ETM 듯/NNB 하/XSA ᆫ/ETM 분위기/NNG 이/VCP 다/EF ./SF 금방이라도 그를 쥐어팰 듯한 분위기다.
|
||||
모시를 따듬어서 치마두 하구 적삼두 해 입잖어유. 모시/NNG 를/JKO 따듬__1/VV 어서/EC 치마/NNG 두/JX 하/VV 구/EC 적삼/NNG 두/JX 하/VV 어/EC 입/VV-R 지/EC 않/VX 어유/EF ./SF 모시를 다듬어서 치마도 하고 적삼도 해 입잖아요.
|
||||
밤이 불을 써 놓으니께 납벌거지가 지천이유. 밤/NNG 이/JKS 불/NNG 을/JKO 써__3/VV 어/EC 놓/VX 으니께/EC 납벌거지__1/NNG 가/JKS 지천/NNG 이/VCP 유/EF ./SF 밤에 불을 켜 놓으니까 부나비가 지천이에요.
|
||||
엔날이는 가실하구 나먼 가을 떡을 해 먹었유. 엔날/NNG 이/JKB 는/JX 가실하__1/VV 구/EC 나/VX 먼/EC 가을/NNG 떡/NNG 을/JKO 하/VV 어/EC 먹/VV 었/EP 유/EF ./SF 옛날에는 가을하고 나면 가을 떡을 해 먹었어요.
|
||||
텃밭이다가 고추씨를 드렸다. 텃밭/NNG 이다가/JKB 고추/NNG 씨/NNG 를/JKO 드리__15/VV 었/EP 다/EF ./SF 텃밭에다가 고추씨를 심었다.
|
||||
방고래서 재를 긁어 담는 거를 잿고물개라 불러유. 방고래/NNG 서/JKB 재/NNG 를/JKO 긁/VV 어/EC 담/VV 는/ETM 거/NNB 를/JKO 잿고물개__1/NNG 이/VCP 라/EC 부르/VV 어유/EF ./SF 방고래에서 재를 긁어 담는 것을 잿고무래라 불러요.
|
||||
가싥에는 농삿일 때문에 엄청 바뻐유. 가싥__1/NNG 에/JKB 는/JX 농삿일/NNG 때문/NNB 에/JKB 엄청/MAG 바쁘/VA 어유/EF ./SF 가을에는 농삿일 때문에 엄청 바빠요.
|
||||
논이나 밭얼 맬 때 맨 츠음에 매넌 걸 아시 맨다 그래구 두 번채 매는 걸 이듬 맨다 그래는 기여. 논/NNG 이나/JC 밭/NNG 얼/JKO 매/VV ᆯ/ETM 때/NNG 맨/MM 츠음__1/NNG 에/JKB 매/VV 넌/ETM 거/NNB ᆯ/JKO 아시__3/NNG 매/VV ᆫ다/EF 그러/VV 구/EC 두/MM 번/NNB 채/XSN 매/VV 는/ETM 거/NNB ᆯ/JKO 이듬__2/NNG 매/VV ᆫ다/EF 그러/VV 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 논이나 밭을 맬 때 맨 처음에 매는 것을 애벌 맨다 그러고 두 번째 매는 것을 두벌 맨다 그러는 거야.
|
||||
질을 가는디 갑재기 천둥이 치구 소나기가 오는데 대단햐. 질__4/NNG 을/JKO 가/VV 는디/EC 갑재기__1/MAG 천둥/NNG 이/JKS 치/VV 구/EC 소나기/NNG 가/JKS 오/VV 는데/EC 대단/XR 하/XSA 어/EF ./SF 길을 가는데 갑자기 천둥이 치고 소나기가 오는데 대단해.
|
||||
깨진 게울을 보믄 재수 읎다 그러니께 버려유. 깨지/VV ᆫ/ETM 게울__1/NNG 을/JKO 보/VV 믄/EC 재수/NNG 읎__1/VA 다/EC 그러/VV 니께/EC 버리/VV 어유/EF ./SF 깨진 거울을 보면 재수 없다 그러니까 버려요.
|
||||
이까이 꺼 하나도 필요 없다. 이까이__1/MM 꺼/NNB 하나/NR 도/JX 필요/NNG 없/VA 다/EF ./SF 이까짓 것 하나도 필요 없다.
|
||||
조두 차조가 있구 미조가 있지유. 조/NNG 두/JX 차조/NNG 가/JKS 있/VV 구/EC 미조__3/NNG 가/JKS 있/VV 지유/EF ./SF 조도 차조가 있고 메조가 있지요.
|
||||
그 사람은 더듬바리래서 같이 일하믄 답답허다. 그/MM 사람/NNG 은/JX 더듬바리__2/NNG 이/VCP 래서/EC 같이/MAG 일/NNG 하/XSV 믄/EC 답답/XR 허/XSA 다/EF ./SF 그 사람은 뒤틈바리라서 같이 일하면 답답하다.
|
||||
아들을 아주 받들어 키워서 버리쟁이가 하나두 웂었지유. 아들/NNG 을/JKO 아주/MAG 받들/VV 어/EC 키우/VV 어서/EC 버리쟁이/NNG 가/JKS 하나/NR 두/JX 웂__1/VA 었/EP 지유/EF ./SF 아들을 아주 받들어 키워서 버릇이 하나도 없었지요.
|
||||
그 선상님은 술을 한나도 몬헌댜. 그/MM 선상님__1/NNG 은/JX 술/NNG 을/JKO 한나__2/NR 도/JX 몬/MAG 허/VV ᆫ댜/EF ./SF 그 선생님은 술을 하나도 못한대.
|
||||
끔을 질겅질겅 씹다. 끔__3/NNG 을/JKO 질겅질겅/MAG 씹/VV-R 다/EF ./SF 껌을 질겅질겅 씹다.
|
||||
어제 술에 취혀서 갱굴채이에 빠졌유. 어제/NNG 술/NNG 에/JKB 취하/VV 어서/EC 갱굴채이__1/NNG 에/JKB 빠지/VV 었/EP 유/EF ./SF 어제 술에 취해서 개골창에 빠졌어요.
|
||||
늙은 오이는 껍디기 뻣기구 속을 발라내구 썰어 가주구서넌 볶어 먹어유. 늙/VV 은/ETM 오이/NNG 는/JX 껍디기/NNG 뻣기__1/VV 구/EC 속/NNG 을/JKO 발라내/VV 구/EC 썰/VV 어/EC 가주/VX 구서/EC 넌/JX 볶/VV 어/EC 먹/VV 어유/EF ./SF 늙은 오이는 껍질 벗기고 속을 발라내고 썰어 가지고서는 볶아 먹어요.
|
||||
오눌 할 일의 반천은 한 심이다. 오눌__1/NNG 하/VV ᆯ/ETM 일/NNG 의/JKG 반천__5/NNG 은/JX 한/MM 심__21/NNB 이/VCP 다/EF ./SF 오늘 할 일의 반절은 한 셈이다.
|
||||
걔는 사날좋아 몰루는 사람하구두 잘 지냐. 걔/NP 는/JX 사날좋/VA 어/EC 몰루__3/VV 는/ETM 사람/NNG 하구/JKB 두/MM 잘/MAG 지내/VV 어/EF ./SF 걔는 넉살스러워 모르는 사람하고도 잘 지내.
|
||||
반질그륵에는 주로 가세, 바눌, 골무, 실꾸리가 담겨 있었유. 반질그륵__1/NNG 에/JKB 는/JX 주로/MAG 가세__10/NNG ,/SP 바눌__1/NNG ,/SP 골무/NNG ,/SP 실꾸리/NNG 가/JKS 담기/VV 어/EC 있/VX 었/EP 유/EF ./SF 반짇고리에는 주로 가위, 바늘, 골무, 실꾸리가 담겨 있었어요.
|
||||
오늘 점선 국수 해 먹기루 했어. 오늘/NNG 점선__2/NNG 국수/NNG 하/VV 어/EC 먹/VV 기/ETN 루/JKB 하/VV 었/EP 어/EF ./SF 오늘 점심 국수 해 먹기로 했어
|
||||
겹방에는 할매 한 분이 살고 계셔유. 겹방__1/NNG 에/JKB 는/JX 할매__1/NNG 한/MM 분/NNB 이/JKS 살/VV 고/EC 계시/VX 어유/EF ./SF 곁방에는 할머니 한 분이 살고 계세요.
|
||||
산포두를 따다가 푹 달여 가주구 멕이믄 기침을 안 해유. 산포두__1/NNG 를/JKO 따/VV 다가/EC 푹/MAG 달이/VV 어/EC 가주/VX 구/EC 멕이__1/VV 믄/EC 기침/NNG 을/JKO 안/MAG 하/VV 어유/EF ./SF 머루를 따다가 푹 달여 가지고 먹이면 기침을 안 해요.
|
||||
옛날이는 베를 열 단, 스무 단씩 쌓아 놨다가 흘태기로 훑었어유. 옛날/NNG 이/JKS 는/JX 베__6/NNG 를/JKO 열/NR 단/NNG ,/SP 스무/MM 단/NNB 씩/XSN 쌓/VV 어/EC 놓/VX 었/EP 다가/EC 흘태기__1/NNG 로/JKB 훑/VV 었/EP 어유/EF ./SF 옛날에는 벼를 열 단, 스무 단씩 쌓아 놨다가 벼훑이로 훑었어요.
|
||||
내가 들어 봐두 몸대기만치두 틀린 게 웂어. 나/NP 가/JKS 듣/VV-I 어/EC 보/VX 어두/EC 몸대기__1/NNG 만치/JKB 두/JX 틀리/VV ᆫ/ETM 것/NNB 이/JKS 웂__1/VA 어/EF ./SF 내가 들어 봐도 먼지만치도 틀린 게 없어.
|
||||
예전이는 몸에 끌껭이가 있는 애덜이 많었댜. 예전/NNG 이/JKS 는/JX 몸/NNG 에/JKB 끌껭이__1/NNG 가/JKS 있/VA 는/ETM 애/NNG 덜/XSN 이/JKS 많/VA 었/EP 댜/EF ./SF 예전에는 몸에 거위가 있는 애들이 많았대.
|
||||
콩 갈어서 가매솥에 끓이 가주구 간수 늫구 두부를 맨들지. 콩/NNG 갈/VV 어서/EC 가매솥__1/NNG 에/JKB 끓이/VV 어/EC 가주/VX 구/EC 간수/NNG 늫__1/VV 구/EC 두부/NNG 를/JKO 맨들/VV 지/EF ./SF 콩 갈아서 가마솥에 끓여 가지고 간수 넣고 두부를 만들지.
|
||||
쟁기 앞에 뾰쪽한 거를 보숩이라구 하지유. 쟁기/NNG 앞/NNG 에/JKB 뾰쪽/MAG 하/XSA ᆫ/ETM 거/NNB 를/JKO 보숩__1/NNG 이/VCP 라구/EC 하/VV 지유/EF ./SF 쟁기 앞에 뾰쪽한 것을 보습이라고 하지요.
|
||||
오야짝 고기가 더 좋잖여? 그것으루 줘유. 오야짝__1/NNG 고기/NNG 가/JKS 더/MAG 좋/VA 지/EC 않/VX 여/EF ?/SF 그것/NP 으루/JKB 주/VV 어유/EF ./SF 왼짝 고기가 더 좋잖아? 그것으로 줘요.
|
||||
수레가 잘 가다가 내리막이서 갑자기 아래루 꼬꾸뱅이를 하는 겨. 수레/NNG 가/JKS 잘/MAG 가/VV 다가/EC 내리막/NNG 이서/JKB 갑자기/MAG 아래/NNG 루/JKB 꼬꾸뱅이__1/NNG 를/JKO 하/VV 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 수레가 잘 가다가 내리막에서 갑자기 아래로 곤두박질을 하는 거야.
|
||||
비가 마이 와서 올해 갈버리 농사는 다 망쳤유. 비/NNG 가/JKS 마이__1/MAG 오/VV 어서/EC 올해/NNG 갈버리__1/NNG 농사/NNG 는/JX 다/MAG 망치/VV 었/EP 유/EF ./SF 비가 많이 와서 올해 가을보리 농사는 다 망쳤어요.
|
||||
이제 거기 나왔든 사람덜이 이제 간 사람덜하구 맬깡 다 가주가서 한 개두 안 냄겨 놨지. 이제/MAG 거기/NP 나오/VV 었/EP 든/ETM 사람/NNG 덜/XSN 이/JKS 이제/MAG 가/VV ᆫ/ETM 사람/NNG 덜/XSN 하구/JKB 맬깡__1/MAG 다/MAG 가주가__1/VV 어서/EC 한/MM 개/NNB 두/JX 안/MAG 냄기/VV 어/EC 놓/VX 었/EP 지/EF ./SF 이제 거기 나왔던 사람들이 이제 간 사람들하고 모두 다 가져가서 한 개도 안 남겨 놨지.
|
||||
아부지가 이놈우 새끼 어딜 나가냐구, 들쌀얼 대구 그래서 난리를 쳤어. 아부지__2/NNG 가/JKS 이놈/NP 우/JKG 새끼/NNG 어디/NP ᆯ/JKO 나가/VV 냐구/EC ,/SP 들쌀__1/NNG 얼/JKO 대/VV 구/EC 그렇/VA-I 어서/EC 난리/NNG 를/JKO 치/VV 었/EP 어/EF ./SF 아버지가 이놈의 새끼 어딜 나가냐고, 등쌀을 대고 그래서 난리를 쳤어.
|
||||
콧구멍이 간지라와서 재채기가 나올락 말락 해유. 콧구멍/NNG 이/JKS 간지랍/VA-I 어서/EC 재채기/NNG 가/JKS 나오/VV ᆯ락/EC 말/VV ᆯ락/EC 하/VX 어유/EF ./SF 콧구멍이 간지러워서 재채기가 나올락 말락 해요.
|
||||
옷은 집에 내비두고 왔지. 옷/NNG 은/JX 집/NNG 에/JKB 내비두__1/VV 고/EC 오/VV 었/EP 지/EF ./SF 옷은 집에 놓아두고 왔지.
|
||||
아가 약어서 부텀 딴청을 피우는 겨. 아__23/NNG 가/JKS 약/VA 어서/EC 부텀__2/MAG 딴청/NNG 을/JKO 피우/VV 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 아이가 약아서 부러 딴청을 피우는 거야.
|
||||
어렸을 때 가랫덧 서면 침을 탁 뱉어 갖구 가랫덧 선 데 문질러 주구 그랬어. 어리/VA 었/EP 을/ETM 때/NNG 가랫덧__1/NNG 서/VV 면/EC 침/NNG 을/JKO 탁/MAG 뱉/VV 어/EC 갖/VX 구/EC 가랫덧__1/NNG 서/VV ᆫ/ETM 데/NNB 문지르/VV 어/EC 주/VX 구/EC 그렇/VA-I 었/EP 어/EF ./SF 어렸을 때 가래톳 서면 침을 탁 뱉어 갖고 가래톳 선 데 문질러 주고 그랬어.
|
||||
무슨 참이를 한 소고대미나 가지구 왔유? 무슨/MM 참이__1/NNG 를/JKO 한/MM 소고대미__1/NNG 나/JX 가지/VV 구/EC 오/VV 었/EP 유/EF ?/SF 무슨 참외를 한 소쿠리나 가지고 왔어요?
|
||||
무말랭이두 맛있게 담궈서 주믄 애들두 좋아혀. 무말랭이/NNG 두/JX 맛있/VA 게/EC 담구/VV 어서/EC 주/VV 믄/EC 애/NNG 들/XSN 두/JX 좋아하/VV 어/EF ./SF 무말랭이도 맛있게 담가서 주면 애들도 좋아해.
|
||||
빈대헌티 물리문 가려운디 뻬룩헌티 물리면 따끔따금혀. 빈대/NNG 헌티/JKB 물리/VV 문/EC 가렵/VA-I 은디/EC 뻬룩__1/NNG 헌티/JKB 물리/VV 면/EC 따끔따끔/MAG 하/XSV 어/EF ./SF 빈대한테 물리면 가려운데 벼룩한테 물리면 따끔따끔해.
|
||||
그전이넌 돗얼 단 큰 배가 강얼 근네댕겼어. 그/MM 전/NNG 이/JKS 너/NP ᆫ/JX 돗__7/NNG 얼/JKO 달/VV ᆫ/ETM 크/VA ᆫ/ETM 배/NNG 가/JKS 강/NNG 얼/JKO 근네__2/VV 어/EC 댕기/VV 었/EP 어/EF ./SF 그전에는 돛을 단 큰 배가 강을 건너다녔어.
|
||||
시장혀서 뿔나케 집이루 돌아왔지. 시장/NNG 하/XSA 어서/EC 뿔나케__1/MAG 집/NNG 이루/JKB 돌아오/VV 었/EP 지/EF ./SF 시장해서 부리나케 집으로 돌아왔지.
|
||||
근디기만 있구 국말이 읎어. 근디기__1/NNG 만/JX 있/VV 구/EC 국말__3/NNG 이/JKS 읎__1/VA 어/EF ./SF 건더기만 있고 국물이 없어.
|
||||
사람이 울고 하더니 그냥 일변 쓰러진 거여. 사람/NNG 이/JKS 울/VV 고/EC 하/VX 더니/EC 그냥/MAG 일변__8/MAG 쓰러지/VV ᆫ/ETM 거/NNB 이/VCP 여/EF ./SF 사람이 울고 하더니 그냥 금방 쓰러진 거야.
|
||||
맏이두 딸이구 막내두 딸이구 간테가 아들이여. 맏이/NNG 두/MM 딸/NNG 이/JKS 구/EC 막내/NNG 두/JX 딸/NNG 이/JKS 구/EC 간테__1/NNG 가/JKS 아들/NNG 이/VCP 여/EF ./SF 맏이도 딸이고 막내도 딸이고 가운데가 아들이야.
|
||||
불집개는 화로에 꽂아 두셔유. 불집개__1/NNG 는/ETM 화로/NNG 에/JKB 꽂/VV 어/EC 두/VX 시/EP 어유/EF ./SF 부젓가락은 화로에 꽂아 두세요.
|
||||
여기서 핵교에 갈라먼 이 길이 가착지. 여기/NP 서/JKB 핵교__1/NNG 에/JKB 가/VV ᆯ라먼/EC 이/MM 길/NNG 이/JKS 가착__1/VA-I 지/EF ./SF 여기서 학교에 가려면 이 길이 가깝지.
|
||||
국수를 한강 먹었드니 속이 더부룩해유. 국수/NNG 를/JKO 한강__4/MAG 먹/VV 었/EP 드니/EC 속/NNG 이/JKS 더부룩/XR 하/XSA 어유/EF ./SF 국수를 잔뜩 먹었더니 속이 더부룩해요.
|
||||
먹구 살라구 한대 나가 있유. 먹/VV 구/EC 살/VV 라구/EC 한대__4/NNG 나가/VV 어/EC 있/VX 유/EF ./SF 먹고 살려고 한데 나가 있어요.
|
||||
인제 고물갱이루 재를 죄 모아 놓는 겨. 인제/MAG 고물갱이__1/NNG 루/JKB 재/NNG 를/JKO 죄/MAG 모으/VV 어/EC 놓/VX 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 인제 고무래로 재를 죄 모아 놓는 거야.
|
||||
천 길 낭언덕에 떨어지는 기분이지. 천/NR 길/NNB 낭언덕__1/NNG 에/JKB 떨어지/VV 는/ETM 기분/NNG 이/VCP 지/EF ./SF 천 길 낭떠러지에 떨어지는 기분이지.
|
||||
나사가 자꾸 빠져서 조이럴 낑구구 죄였드니 안 빠지드라. 나사/NNG 가/JKS 자꾸/MAG 빠지/VV 어서/EC 조이__1/NNG 럴/JKO 낑구__1/VV 구/EC 죄/VV 었/EP 드니/EC 안/MAG 빠지/VV 드라/EF ./SF 나사가 자꾸 빠져서 종이를 끼우고 조였더니 안 빠지더라.
|
||||
해기로 했으문 곧바루 시작햐. 하/VV 기/ETN 로/JKB 하/VV 었/EP 으문/EC 곧바루__1/MAG 시작/NNG 하/XSV 어/EF ./SF 하기로 했으면 곧바로 시작해.
|
||||
인제 치료가 건진 끝났유. 인제/MAG 치료/NNG 가/JKS 건진__1/MAG 끝나/VV 었/EP 유/EF ./SF 인제 치료가 거의 끝났어요.
|
||||
타작을 하구 나서 남은 북디기는 깔키루 긁어 가주구 갖다 때기두 하구 그러지유. 타작/NNG 을/JKO 하/VV 구/EC 나/VX 어서/EC 남/VV 은/ETM 북디기__1/NNG 는/JX 깔키__2/NNG 루/JKB 긁/VV 어/EC 가주/VX 구/EC 갖/VV 다/EC 때/VV 기/ETN 두/JX 하/VX 구/EC 그러/VV 지유/EF ./SF 타작을 하고 나서 남은 북데기는 갈퀴로 긁어 가지고 갖다 때기도 하고 그러지요.
|
||||
예전이는 강을 건네서 핵교를 대녔어유. 예전/NNG 이/JKB 는/JX 강/NNG 을/JKO 건네__5/VV 서/EC 핵교__1/NNG 를/JKO 대니/VV 었/EP 어유/EF ./SF 예전에는 강을 건너서 학교를 다녔어요.
|
||||
저울에는 지벙 추마에 고두룸이 달리잖에유. 저울__4/NNG 에/JKB 는/JX 지벙__1/NNG 추마__1/NNG 에/JKB 고두룸__1/NNG 이/JKS 달리/VV 지/EC 않/VX 에유/EF ./SF 겨울에는 지붕 처마에 고드름이 달리잖아요.
|
||||
빈 지게다가는 뭘 못 담으니께 지게 위에다 바주거리를 얹어 갖구 다니지유. 비/VV ᆫ/ETM 지게/NNG 다가/JX 는/JX 뭐/NP ᆯ/JKO 못/MAG 담/VV 으니께/EC 지게/NNG 위/NNG 에다/JKB 바주거리__1/NNG 를/JKO 얹/VV 어/EC 갖/VV 구/EC 다니/VV 지유/EF ./SF 빈 지게에다가는 뭘 못 담으니까 지게 위에다 발채를 얹어 갖고 다니지요.
|
||||
어즈께 갑재기 딘내기가 내려서 날이 추워졌유. 어즈께__2/MAG 갑재기__1/MAG 딘내기__1/NNG 가/JKS 내리/VV 어서/EC 날/NNG 이/JKS 춥/VA-I 어/EC 지/VX 었/EP 유/EF ./SF 어저께 갑자기 된서리가 내려서 날이 추워졌어요.
|
||||
그 집이 망할 때두 밤이 지키미가 나갔더래유. 그/MM 집/NNG 이/JKS 망하/VV ᆯ/ETM 때/NNG 두/JX 밤/NNG 이/JKB 지키미__1/NNG 가/JKS 나가/VV 었/EP 더/EP 래유/EF ./SF 그 집이 망할 때도 밤에 업구렁이가 나갔더래요.
|
||||
입이 막 허터러지믄 밥을 못 먹어. 입/NNG 이/JKS 막/MAG 허터러지__1/VV 믄/EC 밥/NNG 을/JKO 못/MAG 먹/VV 어/EF ./SF 입이 막 짓무르면 밥을 못 먹어.
|
||||
아덜이 철봉에 까꿀루 매달려 있어유. 아__23/NNG 덜/XSN 이/JKS 철봉/NNG 에/JKB 까꿀루__1/MAG 매달리/VV 어/EC 있/VX 어유/EF ./SF 아이들이 철봉에 거꾸로 매달려 있어요.
|
||||
어릴 적이는 꽤구리를 잡어서 궈 먹기두 했유. 어리/VA ᆯ/ETM 적/NNB 이/JKB 는/JX 꽤구리__1/NNG 를/JKO 잡/VV-R 어서/EC 굽/VV-I 어/EC 먹/VV 기/ETN 두/JX 하/VX 었/EP 유/EF ./SF 어릴 적에는 개구리를 잡아서 구워 먹기도 했어요.
|
||||
저는 군대 갔다 오구, 사헤에서 생활두 하다 보니까 겨론을 늦게 했유. 저/NP 는/JX 군대/NNG 가/VV 었/EP 다/EC 오/VV 구/EC ,/SP 사헤__2/NNG 에서/JKB 생활/NNG 두/JX 하/VV 다/EC 보/VX 니까/EC 겨론__1/NNG 을/JKO 늦/VA 게/EC 하/VV 었/EP 유/EF ./SF 저는 군대 갔다 오고, 사회에서 생활도 하다 보니까 결혼을 늦게 했어요.
|
||||
쌀 한 말 갖구 팔어서 을마 남지두 않구, 참 사는 기 매란두 웂어요. 쌀/NNG 한/MM 말/NNB 갖/VV 구/EC 팔/VV 어서/EC 을마__1/NNG 남/VV 지/EC 두/JX 않/VX 구/EC ,/SP 참/MAG 사/VV 는/ETM 기__76/NNB 이/JKS 매란__1/NNG 두/JX 웂__1/VA 어요/EF ./SF 쌀 한 말 갖고 팔아서 얼마 남지도 않고, 참 사는 게 마련도 없어요.
|
||||
당분간 밭이는 비빨도 못 하게 햐. 당분간/MAG 밭/NNG 이/JKB 는/JX 비빨__1/MAG 도/JX 못/MAG 하/VV 게/EC 하/VX 어/EF ./SF 당분간 밭에는 얼씬도 못 하게 해.
|
||||
창밖이서 깨구락깨구락 깨구리 우는 소리가 들려유. 창/NNG 밖/NNG 이서/JKB 깨구락깨구락__1/MAG 깨구리__1/NNG 울/VV 는/ETM 소리/NNG 가/JKS 들리/VV 어유/EF ./SF 창밖에서 개굴개굴 개구리 우는 소리가 들려요.
|
||||
호랭이나 짐성이 있어도 머물머물 겁을 안 내고 소릴 지르면서 소를 몰구 그래. 호랭이__1/NNG 나/JC 짐성__1/NNG 이/JKS 있/VV 어도/EC 머물머물__1/MAG 겁/NNG 을/JKO 안/MAG 내/VV 고/EC 소리/NNG ᆯ/JKO 지르/VV 면서/EC 소/NNG 를/JKO 몰/VV 구/EC 그렇/VA-I 어/EF ./SF 호랑이나 짐승이 있어도 머뭇머뭇 겁을 안 내고 소릴 지르면서 소를 몰고 그래.
|
||||
그까이 꺼 별거 아니여. 그까이__1/MM 꺼/NNB 별거/NNG 아니/VCN 여/EF ./SF 그까짓 거 별거 아니야.
|
||||
배고프다고 너머 빨리 먹었네. 배고프/VA 다고/EC 너머__2/MAG 빨리/MAG 먹/VV 었/EP 네/EF ./SF 배고프다고 너무 빨리 먹었네.
|
||||
니는 말번새가 왜 그랴? 니/NP 는/JX 말번새__1/NNG 가/JKS 왜/MAG 그렇/VA-I 어/EF ?/SF 너는 말본새가 왜 그래?
|
||||
물이 오르지 않은 버들가지는 껍질을 벗겨 내기가 어려워 호때기를 만들기가 어려웠다. 물/NNG 이/JKS 오르/VV 지/EC 않/VX 은/ETM 버들/NNG 가지/NNG 는/JX 껍질/NNG 을/JKO 벗기/VV 어/EC 내/VX 기/ETN 가/JKS 어렵/VA-I 어/EC 호때기__1/NNG 를/JKO 만들/VV 기/ETN 가/JKS 어렵/VA-I 었/EP 다/EF ./SF 물이 오르지 않은 버들가지는 껍질을 벗겨 내기가 어려워 버들피리를 만들기가 어려웠다.
|
||||
오이를 이릏게 쪽쪽 째 가지구 게다가 불초를 인제 양념해서 속이다 박아유. 오이/NNG 를/JKO 이릏/VA 게/EC 쪽쪽/MAG 째/VV 어/EC 가지/VX 구/EC 게다가/MAG 불초__3/NNG 를/JKO 인제/MAG 양념/NNG 하/XSV 어서/EC 속/NNG 이다/JKB 박/VV 어유/EF ./SF 오이를 이렇게 쪽쪽 째 가지고 게다가 부추를 인제 양념해서 속에다 박아요.
|
||||
어무니, 밥이 을추 다 됐유. 어무니__2/NNG ,/SP 밥/NNG 이/JKS 을추__1/MAG 다/MAG 되/VV 었/EP 유/EF ./SF 어머니, 밥이 얼추 다 됐어요.
|
||||
솥이다 콩 물 늫구 갠수두 늫구 불을 때면 두부가 엉겨유. 솥/NNG 이다/JKB 콩/NNG 물/NNG 늫__1/VV 구/EC 갠수__1/NNG 두/JX 늫__1/VV 구/EC 불/NNG 을/JKO 때/VV 면/EC 두부/NNG 가/JKS 엉기/VV 어유/EF ./SF 솥에다 콩 물 넣고 간수도 넣고 불을 때면 두부가 엉겨요.
|
||||
애덜이 냇가서 월게미루 물괴기를 잡어유. 애/NNG 덜/XSN 이/JKS 냇가/NNG 서/JKB 월게미__1/NNG 루/JKB 물괴기__1/NNG 를/JKO 잡/VV-R 어유/EF ./SF 애들이 냇가에서 어레미로 민물고기를 잡아요.
|
||||
야야, 가팔진 데서 자전거 타믄 위험허다. 이/MM 아__23/NNG 야/JKV ,/SP 가팔지/VA ᆫ/ETM 데/NNB 서/JKB 자전거/NNG 타/VV 믄/EC 위험/NNG 허/XSA 다/EF ./SF 얘야, 비탈진 데서 자전거 타면 위험하다.
|
||||
알을 품는 것은 암닥이지유. 알/NNG 을/JKO 품/VV 는/ETM 것/NNB 은/JX 암닥__1/NNG 이/VCP 지유/EF ./SF 알을 품는 것은 암탉이지요.
|
||||
지금은 마때치기 같은 건 안 하잖여. 지금/NNG 은/JX 마때치기__1/NNG 같/VA 은/ETM 거/NNB ᆫ/JX 안/MAG 하/VV 잖여/EF ./SF 지금은 자치기 같은 건 안 하잖아.
|
||||
베 베서 탈곡해서 인제 맬끔을 저 신작로다 말리는 겨. 베__6/NNG 베/VV 어서/EC 탈곡/NNG 하/XSV 어서/EC 인제/MAG 맬끔__2/NNG 을/JKO 저/MM 신작로/NNG 이다/JKB 말리/VV 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 벼 베서 탈곡해서 인제 전부를 저 신작로에다 말리는 거야.
|
||||
집 문이 안 열려서 뿌서구 들어갔댜. 집/NNG 문/NNG 이/JKS 안/MAG 열리/VV 어서/EC 뿌서__1/VV 구/EC 들어가/VV 었/EP 댜/EF ./SF 집 문이 안 열려서 부수고 들어갔대.
|
||||
한참을 팠더니 샘물이 쏫치는 겨. 한참/NNG 을/JKO 파/VV 었/EP 더니/EC 샘물/NNG 이/JKS 쏫치__1/VV 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 한참을 팠더니 샘물이 솟구치는 거야.
|
||||
아이빨래를 하구 또 쌂어 가주구 또 빨구 그러지유. 아이빨래__1/NNG 를/JKO 하/VV 구/EC 또/MAG 쌂__1/VV 어/EC 가주/VX 구/EC 또/MAG 빨/VV 구/EC 그러/VV 지유/EF ./SF 애벌빨래를 하고 또 삶아 가지고 또 빨고 그러지요.
|
||||
며칠 전까정만 해두 생각하구 있었는디 구만 깜빡 잃어버리는 바람에 일이 이릏게 되았네. 며칠/NNG 전/NNG 까정/JX 만/JX 하/VV 어두/EC 생각/NNG 하/XSV 구/EC 있/VX 었/EP 는디/EC 구만__3/MAG 깜빡/MAG 잃어버리__9/VV 는/ETM 바람/NNB 에/JKB 일/NNG 이/JKS 이릏/VA 게/EC 되/VV 었/EP 네/EF ./SF 며칠 전까지만 해도 생각하고 있었는데 그만 깜빡 잊어버리는 바람에 일이 이렇게 되었네.
|
||||
흔떡가래는 쌀을 빻아다가 시루에 쪄 가주구서, 손이루 주물러서 기다랗게 빼넌 거유. 흔떡가래__1/NNG 는/JX 쌀/NNG 을/JKO 빻/VV 어다가/EC 시루/NNG 에/JKB 찌/VV 어/EC 가주/VX 구서/EC ,/SP 손/NNG 이루/JKB 주무르/VV 어서/EC 기다랗/VA-I 게/EC 빼/VV 넌/ETM 거/NNB 이/VCP 유/EF ./SF 가래떡은 쌀을 빻아다가 시루에 쪄 가지고서, 손으로 주물러서 기다랗게 빼는 거예요.
|
||||
잰작 밥을 줬어야지, 애들이 배들이 고프니께 울잖어. 잰작__1/MAG 밥/NNG 을/JKO 주/VV 었/EP 어야지/EC ,/SP 애/NNG 들/XSN 이/JKS 배/NNG 들/XSN 이/JKS 고프/VA 니께/EC 울/VV 잖어/EF ./SF 진작 밥을 줬어야지, 애들이 배들이 고프니까 울잖아.
|
||||
걔는 나잇갑을 못허니 참 걱정이유. 걔/NP 는/JX 나잇갑__1/NNG 을/JKO 못/MAG 허/VV 니/EC 참/MAG 걱정/NNG 이/VCP 유/EF ./SF 걔는 나잇값을 못하니 참 걱정이에요.
|
||||
그 사람은 얌잔해서 일을 꼼꼼허게 잘 마무리해유. 그/MM 사람/NNG 은/JX 얌잔/NNG 하/VV 어서/EC 일/NNG 을/JKO 꼼꼼/MAG 허/XSA 게/EC 잘/MAG 마무리/NNG 하/XSV 어유/EF ./SF 그 사람은 얌전해서 일을 꼼꼼하게 잘 마무리해요.
|
||||
시동생들 공부 갈키느라구 참이 농사두 했어유. 시동생/NNG 들/XSN 공부/NNG 갈키__1/VV 느라구/EC 참이__1/NNG 농사/NNG 두/JX 하/VV 었/EP 어유/EF ./SF 시동생들 공부 가르치느라고 참외 농사도 했어요.
|
||||
새닥이 가져온 빛이 참 곱네유. 새닥__1/NNG 이/JKS 가져오/VV ᆫ/ETM 빛__8/NNG 이/JKS 참/MAG 곱/VA-I 네유/EF ./SF 새댁이 가져온 빗이 참 곱네요.
|
||||
어떻게 생긴지두 물르고 그냥 신부를 얻은 겨. 어떻게/MAG 생기/VV ᆫ지/EC 두/JX 물르__4/VV 고/EC 그냥/MAG 신부/NNG 를/JKO 얻/VV-R 은/ETM 기__76/NNB 이/VCP 여/EF ./SF 어떻게 생긴지도 모르고 그냥 신부를 얻은 거야.
|
||||
씨를 뿌리는 우묵하게 파인 데를 밧골이라구 해유. 씨/NNG 를/JKO 뿌리/VV 는/ETM 우묵/MAG 하/XSA 게/EC 파이/VV ᆫ/ETM 데/NNB 를/JKO 밧골__1/NNG 이/VCP 라구/EC 하/VV 어유/EF ./SF 씨를 뿌리는 우묵하게 파인 데를 밭고랑이라고 해요.
|
||||
배깥이 나갔드니 속소리바람이 훅 하고 불대유. 배깥__1/NNG 이/JKB 나가/VV 었/EP 드니/EC 속소리바람__1/NNG 이/JKS 훅/MAG 하/VV 고/EC 불/VV 대유/EF ./SF 바깥에 나갔더니 회오리바람이 훅 하고 불대요.
|
||||
예전이는 고드래미를 따서 먹기도 하고 그랬유. 예전/NNG 이/JKS 는/JX 고드래미__2/NNG 를/JKO 따/VV 어서/EC 먹/VV 기/ETN 도/JX 하/VX 고/EC 그렇/VA-I 었/EP 유/EF ./SF 예전에는 고드름을 따서 먹기고 하고 그랬어요.
|
||||
오늘 안으로 벳단을 져다가 논 가생이에 배겨 놔야 햐. 오늘/NNG 안/NNG 으로/JKB 벳단__1/NNG 을/JKO 지/VV 어다가/EC 논/NNG 가생이__2/NNG 에/JKB 배기__6/VV 어/EC 놓/VX 어야/EC 하/VV 어/EF ./SF 오늘 안으로 볏단을 져다가 논가에 부려 놔야 해.
|
||||
평생 농사만 졌는디 인제는 지긋덥구 짜증이 나. 평생/NNG 농사/NNG 만/JX 지/VV 었/EP 는디/EC 인제/NNG 는/JX 지긋덥__1/VA 구/EC 짜증/NNG 이/JKS 나/VV 어/EF ./SF 평생 농사만 졌는데 인제는 지긋지긋하고 짜증이 나.
|
||||
마당이다 곡식을 널고는 고몰개루 넓게 펴는 거유. 마당/NNG 이다/JKB 곡식/NNG 을/JKO 널/VV 고/EC 는/JX 고몰개__1/NNG 루/JKB 넓/VA 게/EC 펴/VV 는/ETM 거/NNB 이/VCP 유/EF ./SF 마당에다 곡식을 널고는 고무래로 넓게 펴는 거예요.
|
||||
가을거시는 엣날이는 베를 손이루 베서 널었다가, 걷어서 볏가리를 쌓았유. 가을거시__1/NNG 는/JX 엣날__1/NNG 이/JKB 는/JX 베__6/NNG 를/JKO 손/NNG 이루/JKB 베/VV 어서/EC 널/VV 었/EP 다가/EC ,/SP 걷/VV-R 어서/EC 볏가리/NNG 를/JKO 쌓/VV 었/EP 유/EF ./SF 가을걷이는 옛날에는 벼를 손으로 베서 널었다가, 걷어서 볏가리를 쌓았어요.
|
||||
마침 방앗간집에서 돼지를 잡었다길래 괴기 한 근 사다 끓이 먹었지. 마침/MAG 방앗간/NNG 집/NNG 에서/JKB 돼지/NNG 를/JKO 잡/VV-R 었/EP 다/EF 길래/EC 괴기__6/NNG 한/MM 근/NNB 사/VV 다/EC 끓이/VV 어/EC 먹/VV 었/EP 지/EF ./SF 마침 방앗간집에서 돼지를 잡았다길래 고기 한 근 사다가 끓여 먹었지.
|
||||
왜 저누리가 빨리 안 온댜? 왜/MAG 저누리__1/NNG 가/JKS 빨리/MAG 안/MAG 오/VV ᆫ댜/EF ?/SF 왜 곁두리가 빨리 안 온대?
|
||||
부엌이서 쓰는 고무래는 붝고무래지유. 부엌/NNG 이서/JKB 쓰/VV 는/ETM 고무래/NNG 는/JX 붝고무래__1/NNG 이/VCP 지유/EF ./SF 부엌에서 쓰는 고무래는 불고무래지요.
|
||||
기을에는 한가하니께 들어앉어서 두부두 해 먹구 그러잖아유. 기을__1/NNG 에/JKB 는/JX 한가하/VA 니께/EC 들어앉/VV 어서/EC 두부/NNG 두/JX 하/VV 어/EC 먹/VV 구/EC 그러/VV 잖아유/EF ./SF 겨울에는 한가하니까 들어앉아서 두부도 해 먹고 그러잖아요.
|
||||
엣날이는 일할 적이 고등아하구 감자 늫구 조려 가는 게 큰 반찬이었유. 엣날__1/NNG 이/JKB 는/JX 일/NNG 하/XSV ᆯ/ETM 적/NNB 이/JKB 고등아__1/NNG 하구/JC 감자/NNG 늫__1/VV 구/EC 조리/VV 어/EC 가/VX 는/ETM 것/NNB 이/JKS 크/VA ᆫ/ETM 반찬/NNG 이/VCP 었/EP 유/EF ./SF 옛날에는 일할 적에 고등어하고 감자 넣고 조려 가는 게 큰 반찬이었어요.
|
||||
저 게으름디는 일은 안 허구 맨날 놀기만 해유. 저/MM 게으름디__1/NNG 는/JX 일/NNG 은/JX 안/MAG 허/VV 구/EC 맨날/MAG 놀/VV 기/ETN 만/JX 하/VX 어유/EF ./SF 저 게으름쟁이는 일은 안 하고 맨날 놀기만 해요.
|
||||
너는 나라미 끄티매기를 잘 잡아야 햐. 너/NP 는/JX 나라미__4/NNG 끄티매기__2/NNG 를/JKO 잘/MAG 잡/VV-R 어야/EC 하/VV 어/EF ./SF 너는 줄 끝을 잘 잡아야 해.
|
||||
너 똑바루 안 허면 엄마한티 혼꾸녕날 줄 알어. 너/NP 똑바루__1/MAG 안/MAG 허/VV 면/EC 엄마/NNG 한티/JKB 혼꾸녕/NNG 나/VV ᆯ/ETM 줄/NNB 알/VV 어/EF ./SF 너 똑바로 안 하면 엄마한테 혼꾸멍날 줄 알아.
|
||||
올봄엔 동네 노인덜이 차럴 대절해서 남해안으루 귀경 간디여. 올/MM 봄/NNG 에/JKB ᆫ/JX 동네/NNG 노인/NNG 덜/XSN 이/JKS 차/NNG 럴/JKO 대절/NNG 하/XSV 어서/EC 남해안/NNP 으루/JKB 귀경__7/NNG 가/VV ᆫ디/EF 여/JX ./SF 올봄에는 동네 노인들이 차를 대절해서 남해안으로 구경 간대.
|
||||
그전에는 지붕에서 노내각시가 마이 니리왔지. 그/MM 전/NNG 에/JKB 는/JX 지붕/NNG 에서/JKB 노내각시__1/NNG 가/JKS 마이__1/MAG 니리오__1/VV 었/EP 지/EF ./SF 그전에는 지붕에서 노래기가 많이 내려왔지.
|
||||
저 꼼꼼쟁이 양반은 돈 한 푼 쓸 줄을 몰러유. 저/MM 꼼꼼쟁이__2/NNG 양반/NNG 은/JX 돈/NNG 한/MM 푼/NNB 쓰/VV ᆯ/ETM 줄/NNG 을/JKO 모르/VV 어유/EF ./SF 저 구두쇠 양반은 돈 한 푼 쓸 줄을 몰라요.
|
||||
멫 번이나 이사를 대니느라구 우리 집 살림살이가 다 망가졌지유. 멫__1/NR 번/NNB 이나/JX 이사/NNG 를/JKO 대니__1/VV 느라구/EC 우리/NP 집/NNG 살림살이/NNG 가/JKS 다/MAG 망가지/VV 었/EP 지유/EF ./SF 몇 번이나 이사를 다니느라고 우리 집 살림살이가 다 망가졌지요.
|
||||
꼴뱅이가 풀맀는지 소가 어데 가구 없는 겨. 꼴뱅이__2/NNG 가/JKS 풀리/VV 었/EP 는지/EC 소/NNG 가/JKS 어데__2/NP 가/VV 구/EC 없/VA 는/ETM 기__76/NNB 이/VCP 여/EF ./SF 고삐가 풀렸는지 소가 어디 가고 없는 거야.
|
||||
거시럼돈은 그냥 둬유. 거시럼돈__1/NNG 은/JX 그냥/MAG 두/VV 어유/EF ./SF 거스름돈은 그냥 둬요.
|
||||
그 바다리가 냅다 떼루 몰려와서는 눈팅이를 쐈다 이거여. 그/IC 바다리__2/NNG 가/JKS 냅다/MAG 떼/NNG 루/JKB 몰려오/VV 어서/EC 는/JX 눈팅이__1/NNG 를/JKO 쏘/VV 었/EP 다/EF 이거/NP 이/VCP 여/EF ./SF 그 바더리가 냅다 떼로 몰려와서는 눈퉁이를 쐈다 이거야.
|
||||
배추 간절일 때는 속잎은 들 절여질 정도로만 해야 해유. 배추/NNG 간절이__1/VV ᆯ/ETM 때/NNG 는/JX 속잎/NNG 은/JX 들__5/MAG 절이/VV 어/EC 지/VX ᆯ/ETM 정도/NNG 로/JKB 만/JX 하/VV 어야/EC 하/VX 어유/EF ./SF 배추 절일 때는 속잎은 덜 절여질 정도로만 해야 해요.
|
||||
일은 내가 다 했는디 지가 왜 그드럭거린다야? 일/NNG 은/JX 나/NP 가/JKS 다/MAG 하/VV 었/EP 는디/EC 지/NP 가/JKS 왜/MAG 그드럭/XR 거리/XSV ᆫ다야/EF ?/SF 일은 내가 다 했는데 자기가 왜 거드럭거린다니?
|
||||
술을 얼마 먹지두 않었는디 가뿍 취해 버린 겨. 술/NNG 을/JKO 얼마/NNG 먹/VV 지/EC 두/JX 않/VX 었/EP 는디/EC 가뿍__2/MAG 취하/VV 어/EC 버리/VX ᆫ/ETM 기__76/NNB 이/VCP 여/EF ./SF 술을 얼마 먹지도 않았는데 흠뻑 취해 버린 거야.
|
||||
내일이 반굉일이지. 내일/NNG 이/JKS 반굉일__1/NNG 이/VCP 지/EF ./SF 내일이 반공일이지.
|
||||
엔날이는 장난감이 웂으니께루 버드나무 물오르문 그거 벗겨 갖구 호디기 같은 거 해서 불지유. 엔날/NNG 이/JKB 는/JX 장난감/NNG 이/JKS 웂__1/VA 으니께루/EC 버드나무/NNG 물오르/VV 문/EC 그거/NP 벗기/VV 어/EC 갖/VX 구/EC 호디기__1/NNG 같/VA 은/ETM 거/NNB 하/VV 어서/EC 불/VV 지유/EF ./SF 옛날에는 장난감이 없으니까 버드나무 물오르면 그거 벗겨 갖고 호드기 같은 것 해서 불지요.
|
||||
가방은 아저씨한테 맽기고 들어오렴. 가방/NNG 은/JX 아저씨/NNG 한테/JKB 맽기__1/VV 고/EC 들어오/VV 렴/EF ./SF 가방은 아저씨한테 맡기고 들어오렴.
|
||||
복도서는 발꾸머리를 들고 살살 걸어 대녀라. 복도/NNG 서/JKB 는/JX 발꾸머리__1/NNG 를/JKO 들/VV 고/EC 살살/MAG 걷/VV-I 어/EC 대니/VV 어라/EF ./SF 복도에서는 발뒤축을 들고 살살 걸어 다녀라.
|
||||
애덜이 많으니께 내위만 하루에 한 번씩 갈아입어두 빨래가 잔뜩이유. 애/NNG 덜/XSN 이/JKS 많/VA 으니께/EC 내위__1/NNG 만/JX 하루/NNG 에/JKB 한/MM 번/NNB 씩/XSN 갈아입/VV-R 어두/EC 빨래/NNG 가/JKS 잔뜩/MAG 이/VCP 어유/EF ./SF 애들이 많으니까 내의만 하루에 한 번씩 갈아입어도 빨래가 잔뜩이에요.
|
||||
깨똥버러지는 빛을 내며 날아댕기잖어유. 깨똥버러지__1/NNG 는/JX 빛/NNG 을/JKO 내/VV 며/EC 날아댕기__1/VV 잖어/EF 유/JX ./SF 개똥벌레는 빛을 내며 날아다니잖아요.
|
||||
같이 갈텨? 안 가면 나 혼자 갈텨. 같이/MAG 가/VV ᆯ/ETM 터/NNB 이/VCP 요/EF ?/SF 안/MAG 가/VV 면/EC 나/NP 혼자/MAG 가/VV ᆯ/ETM 터/NNB 이/VCP 요/EF ./SF 같이 갈래? 안 가면 나 혼자 갈래.
|
||||
나는 인제 솔가리 글러 가유. 나/NP 는/JX 인제/MAG 솔가리/NNG 글__4/VV 러/EC 가/VV 어유/EF ./SF 나는 인제 솔가리 긁으러 가요.
|
||||
엔날이는 베를 손이루 베서 벳테미를 쌓아 놨다가 타작을 했지유. 엔날/NNG 이/JKB 는/JX 베__6/NNG 를/JKO 손/NNG 이루/JKB 베/VV 어서/EC 벳테미__1/NNG 를/JKO 쌓/VV 어/EC 놓/VX 었/EP 다가/EC 타작/NNG 을/JKO 하/VV 었/EP 지유/EF ./SF 옛날에는 벼를 손으로 베서 볏가리를 쌓아 놨다가 타작을 했지요.
|
||||
오둥아를 울마나 마이 먹었는지 셋바닥이 씨커멓게 물들었네. 오둥아__1/NNG 를/JKO 울마나__1/MAG 마이__1/MAG 먹/VV 었/EP 는지/EC 셋바닥__1/NNG 이/JKS 씨커멓__1/VA-I 게/EC 물들/VV 었/EP 네/EF ./SF 오디를 얼마나 많이 먹었는지 혓바닥이 시커멓게 물들었네.
|
||||
더덕 뿌릴 캐다가 껍디길 벗겨 흙을 앃구 잘 두디리유. 더덕/NNG 뿌리/VV ᆯ/ETM 캐/VV 다가/EC 껍디기__1/NNG ᆯ/ETM 벗기/VV 어/EC 흙/NNG 을/JKO 앃__1/VV-R 구/EC 잘/MAG 두디리__1/VV 어요/EF ./SF 더덕 뿌리를 캐다가 껍데기를 벗겨 흙을 씻구 잘 두드려요.
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
우리 아는 볼움물이 들어가는 것까정 지 아부지르 닮었잖소. 우리/NP 아__23/NNG 는/JX 볼움물__1/NNG 이/JKS 들어가/VV 는/ETM 것/NNB 까정/JX 지__51/NP 아부지__2/NNG 르/JKO 닮/VV 었/EP 지/EC 않/VX 소/EF ./SF 우리 아이는 볼우물이 들어가는 것까지 제 아버지를 닮았잖소.
|
||||
겨욹에는 낭그를 짚으로 싸뎅에야 한다. 겨욹__1/NNG 에/JKB 는/JX 낭그__1/NNG 를/JKO 짚/NNG 으로/JKB 싸뎅이/VV 어야/EC 하/VX ᆫ다/EF ./SF 겨울에는 나무를 짚으로 싸매야 한다.
|
||||
요짐에는 어딜 가두 지풀집으 찾어볼 수 웂아. 요짐__1/NNG 에/JKB 는/JX 어디/NP ᆯ/JKO 가/VV 어두/EC 지풀집__1/NNG 으/JKO 찾/VV 어/EC 보/VV ᆯ/ETM 수/NNB 웂__1/VA 아/EF ./SF 요즘에는 어딜 가도 초가집을 찾아볼 수 없어.
|
||||
지냑을 너머 일찌거니 먹었드니 입이 꿉꿉하다. 지냑__1/NNG 을/JKO 너머__2/MAG 일찌거니/MAG 먹/VV 었/EP 드니/EC 입/NNG 이/JKS 꿉꿉하__3/VA 다/EF ./SF 저녁을 너무 일찌거니 먹었더니 입이 궁금하다.
|
||||
어젯밤부터 즘심때까정 장곧 잤나? 어젯밤/NNG 부터/JX 즘심때__1/NNG 까정/JX 장곧__1/MAG 자/VV 었/EP 나/EF ?/SF 어젯밤부터 점심때까지 줄곧 잤니?
|
||||
쪼구매한 기 빠르긴 음청 빠르네. 쪼구매/NNG 하/XSA ᆫ/ETM 기__76/NNB 이/JKS 빠르/VA 기/ETN ᆫ/JX 음청__3/MAG 빠르/VA 네/EF ./SF 쪼그마한 게 빠르긴 엄청 빠르네.
|
||||
즈녁 먹기엔 적빠른 시간이야. 즈녁__1/NNG 먹/VV 기/ETN 에/JKB ᆫ/JX 적빠르/VA ᆫ/ETM 시간/NNG 이/VCP 야/EF ./SF 저녁 먹기엔 어지빠른 시간이야.
|
||||
장에 갔으문 하더모해 과일이래두 좀 사오지 그랬나? 장/NNG 에/JKB 가/VV 었/EP 으문/EC 하더모해__1/MAG 과일/NNG 이/VCP 래두/EC 좀/MAG 사/VV 어/EC 오/VV 지/EC 그렇/VA-I 었/EP 나/EF ?/SF 장에 갔으면 하다못해 과일이라도 좀 사오지 그랬니?
|
||||
빈집에서 갑재기 사램이 퇴나와서 얼매나 씩겁단장했는지 몰러요. 빈집/NNG 에서/JKB 갑재기__1/MAG 사램__1/NNG 이/JKS 퇴나오/VV 어서/EC 얼매나__1/MAG 씩겁단장/XR 하/XSV 었/EP 는지/EC 모르/VV 어요/EF ./SF 빈집에서 갑자기 사람이 튀어나와서 얼마나 식겁했는지 몰라요.
|
||||
오늘 즘심은 이 떡으루 어지자. 오늘/NNG 즘심__1/NNG 은/JX 이/MM 떡/NNG 으루/JKB 어지__2/VV 자/EF ./SF 오늘 점심은 이 떡으로 때우자.
|
||||
아 때는 싸드바리로 배깥을 돌아댕기기도 하다와. 아__23/NNG 때/NNG 는/JX 싸드바리__1/NNG 로/XSM 배깥__1/NNG 을/JKO 돌아댕기__1/VV 기/ETN 도/JX 하/VX 다와/EF ./SF 아이 때는 알몸으로 바깥을 돌아다니기도 합디다
|
||||
이따가 지냑에 동네 으른들 모세 놓구 술대즙으 한다든데요. 이따가/MAG 지냑__1/NNG 에/JKB 동네/NNG 으른__1/NNG 들/XSN 모시/VV 어/EC 놓/VV 구/EC 술대즙__1/NNG 으/JKO 하/VV ᆫ다든데/EF 요/JX ./SF 이따가 저녁에 동네 어른들 모셔 놓고 술대접을 한다던데요.
|
||||
할루근네 한 번씩 말으 일기든 우리 아덜내미거 이제는 다 커서 취직으 했잖소. 할루근네__1/MAG 한/MM 번/NNB 씩/XSN 말__34/NNG 으/JKO 일기__1/VV 든/ETM 우리/NP 아덜내미__1/NNG 거/JKS 이제/NNG 는/JX 다/MAG 크/VV 어서/EC 취직/NNG 으/JKO 하/XSV 었/EP 지/EC 않/VX 소/EC ./SF 하루건너 한 번씩 말썽을 일으키던 우리 아들내미가 이제는 다 커서 취직을 했잖소.
|
||||
되바래진 어린눔이 버르장머리라군 웂구 아주 앨미르와. 되바래지/VV ᆫ/ETM 어린눔__1/NNG 이/JKS 버르장머리/NNG 이/VCP 라구/EC ᆫ/JX 웂__1/VA 구/EC 아주/MAG 앨미릅/VA-I 어/EF ./SF 되바라진 어린놈이 버르장머리라곤 없고 아주 얄미워.
|
||||
지가 잘못해 놓구 외루 화르 내드라니! 지__49/NNG 가/JKS 잘못/MAG 하/VV 어/EC 놓/VX 구/EC 외루__3/MAG 화/NNG 르/JKO 내/VV 드라니/EF !/SF 자기가 잘못해 놓고 외려 화를 내더라니!
|
||||
맛없는 음석이래도 개 주자니 아꿉다. 맛없/VA 는/ETM 음석__1/NNG 이/VCP 래도/EC 개/NNG 주/VV 자니/EC 아꿉__1/VA-I 다/EF ./SF 맛없는 음식이라도 개 주자니 아깝다.
|
||||
말 안 듣구 나가 놀다가 넘어졌다니 그것 아주 싸고지다. 말/NNG 안/MAG 듣/VV-I 구/EC 나가/VV 어/EC 놀/VV 다가/EC 넘어지/VV 었/EP 다니/EC 그것/NP 아주/MAG 싸고지__1/NNG 이/VCP 다/EF ./SF 말 안 듣고 나가 놀다가 넘어졌다니 그것 아주 쌤통이다.
|
||||
자는 어렜을 적부터 대두 쫄라 대는 버릇이 있었아. 자/NP 는/JX 어리/VA 었/EP 을/ETM 적/NNB 부터/JX 대두__9/MAG 쪼르/VV 어/EC 대/VX 는/ETM 버릇/NNG 이/JKS 있/VV 었/EP 아/EF ./SF 쟤는 어렸을 적부터 되우 졸라 대는 버릇이 있었어.
|
||||
초저욹이래두 바람이 차니까 옷으 뜨시게 입구 나가라. 초저욹__1/NNG 이/VCP 래두/EC 바람/NNG 이/JKS 차/VA 니까/EC 옷/NNG 으/JKO 뜨시__1/VA 게/EC 입/VV-R 구/EC 나가/VV 라/EF ./SF 초겨울이라도 바람이 차니까 옷을 따뜻하게 입고 나가라.
|
||||
책상 모새이에 부닺헤서 멍당구가 시퍼렇게 들었아. 책상/NNG 모새이__1/NNG 에/JKB 부닺히/VV 어서/EC 멍당구__1/NNG 가/JKS 시퍼렇/VA-I 게/EC 들/VV 었/EP 아/EF ./SF 책상 모서리에 부딪혀서 멍이 시퍼렇게 들었어.
|
||||
올해는 가믐더우 땜에 나락이 쨀고 그래서 걱정이래. 올해/NNG 는/JX 가믐더우__1/NNG 땜/NNB 에/JKB 나락__2/NNG 이/MM 쨀__1/VA 고/EC 그래서/MAJ 걱정/NNG 이/VCP 래/EF ./SF 올해는 가뭄더위 땜에 벼가 잘고 그래서 걱정이래.
|
||||
버점은 허옇기 일어나는 것도 있고 자꾸 번지 나가는 것도 있어여. 버점__1/NNG 은/JX 허옇/VA-I 기/ETN 일어나/VV 는/ETM 것/NNB 도/JX 있/VA 고/EC 자꾸/MAG 번지/VV 어/EC 나가/VX 는/ETM 것/NNB 도/JX 있/VA 어여/EF ./SF 버짐은 허옇게 일어나는 것도 있고 자꾸 번져 나가는 것도 있어요.
|
||||
우산 없이 길으 가다가 소나기르 좔락 다 맞았다. 우산/NNG 없이/MAG 길/NNG 으/JKO 가/VV 다가/EC 소나기/NNG 르/JKO 좔락__1/MAG 다/MAG 맞/VV 었/EP 다/EF ./SF 우산 없이 길을 가다가 소나기를 쫄딱 다 맞았다.
|
||||
콩국시가 아주 걸찌한 기 맛이 참 고만이네. 콩국시__1/NNG 가/JKS 아주/MAG 걸찌/XR 하/XSA ᆫ/ETM 기__76/NNB 이/JKS 맛/NNG 이/JKS 참/MAG 고만/MAG 이/VCP 네/EF ./SF 콩국수가 아주 걸쭉한 게 맛이 참 고만이네.
|
||||
가서 쇠궁이에 여물 좀 줘라. 가/VV 어서/EC 쇠궁이__1/NNG 에/JKB 여물/NNG 좀/MAG 주/VV 어라/EF ./SF 가서 소구유에 여물 좀 줘라.
|
||||
구리가 궁게이로 드가 뿠어. 구리__14/NNG 가/JKS 궁게이__1/NNG 로/XSM 드가/VV 어/EC 뿌/VX 었/EP 어/EF ./SF 구렁이가 구멍으로 들어가 버렸어.
|
||||
엉차 내가 다 할 일이잖소. 엉차__1/MAG 나/NP 가/JKS 다/MAG 하/VV ᆯ/ETM 일/NNG 이/VCP 잖소/EF ./SF 어차피 내가 다 할 일이잖소.
|
||||
어제 자에 갔더거 어릴 적 친구르 맞주이했잖소. 어제/MAG 자__53/NNG 에/JKB 가/VV 었/EP 더거/EC 어리/VA ᆯ/ETM 적/NNB 친구/NNG 르/JKO 맞주이하/VV 었/EP 잖소/EF ./SF 어제 장에 갔다가 어릴 적 친구와 마주쳤잖소.
|
||||
떡으 할라모 실그가 있어야 하잖소. 떡/NNG 으/JKO 하/VV ᆯ라모/EC 실그__1/NNG 가/JKS 있/VV 어야/EC 하/VX 잖소/EF ./SF 떡을 하려면 시루가 있어야 하잖소.
|
||||
자는 처래미 놔두모 종일 잘 놈이야. 자/NP 는/JX 처래미__1/MAG 놔두/VV 모/EC 종일/NNG 자/VV ᆯ/ETM 놈/NNB 이/VCP 야/EF ./SF 쟤는 그대로 놔두면 종일 잘 놈이야.
|
||||
니는 왜 지냑도 안 먹고 씨뚜룩한 얼굴으 하고 있나? 니/NP 는/JX 왜/MAG 지냑__1/NNG 도/JX 안/MAG 먹/VV 고/EC 씨뚜룩/XR 하/XSA ᆫ/ETM 얼굴/NNG 으/JKO 하/VV 고/EC 있/VX 나/EF ?/SF 너는 왜 저녁도 안 먹고 씨무룩한 얼굴을 하고 있니?
|
||||
니는 옆차개에드거 머이를 그러 불룩하게 늫고 다니나? 니/NP 는/JX 옆차개__2/NNG 에드거/JKB 머이__5/NP 를/JKO 그러/MAG 불룩/MAG 하/XSA 게/EC 늫__1/VV 고/EC 다니/VV 나/EF ?/SF 너는 호주머니에다가 무엇을 그렇게 불룩하게 넣고 다니니?
|
||||
머리가 너머 짧어서 잘 묶이키지 않어요. 머리/NNG 가/JKS 너머__2/MAG 짧/VA 어서/EC 잘/MAG 묶이키__1/VV 지/EC 않/VX 어요/EF ./SF 머리가 너무 짧아서 잘 묶이지 않아요.
|
||||
다 잡은 퇴끼를 털괐아. 다/MAG 잡/VV-R 은/ETM 퇴끼__2/NNG 를/JKO 털구/VV 었/EP 어/EF ./SF 다 잡은 토끼를 놓쳤어.
|
||||
집이 너무 오래 돼사 허시릅구나. 집/NNG 이/JKS 너무/MAG 오래/MAG 되/VV 어사/EC 허시릅__1/VA 구나/EF ./SF 집이 너무 오래 되어서 허름하구나.
|
||||
마눌루 담근 장쩨이 좋아하나? 마눌__1/NNG 루/JKB 담그/VV ᆫ/ETM 장쩨이__1/NNG 좋아하/VV 나/EF ?/SF 마늘로 담근 장아찌 좋아하니?
|
||||
어머야라 니 언제 왔나? 어머야라__1/IC 니/NP 언제/MAG 오/VV 었/EP 나/EF ?/SF 어머 너 언제 왔니?
|
||||
감재를 캐문 상찌리로만 골러서 자석들한테 보내지요. 감재__1/NNG 를/JKO 캐/VV 어/EC 물/VV ᆫ/ETM 상찌리__1/NNG 로/JKB 만/JX 고르/VV 어서/EC 서/JKB 자석__1/NNG 들/XSN 한테/JKB 보내/VV 지요/EF ./SF 감자를 캐면 상길로만 골라서 자식들한테 보내지요.
|
||||
어젯밤 바람에 밤꼬쇠이가 마이 떨어졌든데요. 어젯밤/NNG 바람/NNG 에/JKB 밤꼬쇠이__1/NNG 가/JKS 마이__1/MAG 떨어지/VV 었/EP 든데요/EF ./SF 어젯밤 바람에 밤송이가 많이 떨어졌던데요.
|
||||
즈녁나절쯤이문 밭일두 얼치 끝나요. 즈녁나절__1/NNG 쯤/XSN 이/VCP 문/EC 밭일/NNG 두/JX 얼치__1/MAG 끝나/VV 어요/EF ./SF 저녁나절쯤이면 밭일도 얼추 끝나요.
|
||||
감재 캐러 갔더거 그 오래비를 딱 맞중이했잔. 감재__1/NNG 캐/VV 러/EC 가/VV 었/EP 더거/EC 그/MM 오래비/NNG 를/JKO 딱/MAG 맞중이하/VV 었/EP 잔/EF ./SF 감자 캐러 갔다가 그 오빠를 딱 마주쳤잖아.
|
||||
형제들찌리 째그럭거리는 일은 웂어야지. 형제/NNG 들/XSN 찌리/XSN 째그럭거리__1/VV 는/ETM 일/NNG 은/JX 웂__1/VA 어야지/EF ./SF 형제들끼리 짜그락거리는 일은 없어야지.
|
||||
우리 첫째 아나랑 둘째 사우랑 어릴 때 친구였아. 우리/NP 첫째/NR 아나__7/NNG 랑/JC 둘째/NR 사우__1/NNG 랑/JC 어리/VA ᆯ/ETM 때/NNG 친구/NNG 이/VCP 었/EP 아/EF ./SF 우리 첫째 며느리랑 둘째 사위랑 어릴 때 친구였어.
|
||||
으제이뜨제이 다 모아 놓구 뭔 일으 꾸미고 있나? 으제이뜨제이__1/MAG 다/MAG 모으/VV 어/EC 놓/VX 구/EC 뭔/MM 일/NNG 으/JKO 꾸미/VV 고/EC 있/VX 나/EF ?/SF 어중이떠중이 다 모아 놓고 뭔 일을 꾸미고 있니?
|
||||
누거 이 냄비르 이러 짜불띠렜나? 누거/NNG 이/MM 냄비/NNG 르/JKO 이러/MAG 짜불띠리/VV 었/EP 나/EF ?/SF 누가 이 냄비를 이렇게 짜부라뜨렸니?
|
||||
읎는 헹펜에 반듯한 농토 매련하기가 죄련찮지요. 읎__1/VA 는/ETM 헹펜__2/NNG 에/JKB 반듯/XR 하/XSA ᆫ/ETM 농토/NNG 매련하__2/VV 기/ETN 가/JKS 죄련찮__1/VA 지요/EF ./SF 없는 형편에 반듯한 농토 마련하기가 조련찮지요.
|
||||
결혼을 할라면 우선 살 집이라도 우그린 후에 해야지. 결혼/NNG 을/JKO 하/VV ᆯ라면/EC 우선/MAG 살/VV ᆯ/ETM 집/NNG 이/VCP 라도/EC 우그리__3/VV ᆫ/ETM 후/NNG 에/JKB 하/VV 어야지/EF ./SF 결혼을 하려면 우선 살 집이라도 마련한 후에 해야지.
|
||||
도랑물으 타주콰서 논에 물을 좌라. 도랑/NNG 물/NNG 으/JKO 타주쿠/VV 어서/EC 논/NNG 에/JKB 물/NNG 을/JKO 조__2/VV 어라/EF ./SF 도랑물을 터뜨려서 논에 물을 줘라.
|
||||
싸전 아지매는 됫박질으 할 때 말방치로 그양 미는 기 아니라 파면서 미니 징말루 얄똥시루와. 싸전/NNG 아지매__1/NNG 는/JX 됫박/NNG 질/XSN 으/JKO 하/VV ᆯ/ETM 때/NNG 말방치__1/NNG 로/JKB 그양__1/MAG 밀/VV 는/ETM 기__76/NNB 이/JKS 아니/VCN 라/EC 파/VV 면서/EC 밀/VV 니/EC 징말루__1/MAG 얄똥시룹/VV 어/EF ./SF 싸전 아주머니는 됫박질을 할 때 평미레로 그냥 미는 게 아니라 파면서 미니 정말로 얄미워.
|
||||
쪼매한 걸 거기다 꽂아 놓고 맹길었어, 이러. 쪼매/XR 하/XSV ᆫ/ETM 거/NNB ᆯ/JKO 거기/NP 다/JX 꽂/VV 어/EC 놓/VX 고/EC 맹길__1/VV 었/EP 어/EC ,/SP 이러/MAG ./SF 조그마한 걸 거기다 꽂아 놓고 만들었어, 이렇게.
|
||||
줄으 단디이 짠매라. 줄/NNG 으/JKO 단디이__1/MAG 짠매__1/VV 어라/EF ./SF 줄을 단단히 잡아매라.
|
||||
밭짐으 서너 번은 매야 곡석이 잘돼. 밭짐__1/NNG 으/JKO 서너/MM 번/NNB 은/JX 매/VV 어야/EC 곡석__1/NNG 이/JKS 잘/MAG 되/VV 어/EF ./SF 밭풀을 서너 번은 매야 곡식이 잘돼.
|
||||
누거 장작데미르 허물고띠렜나? 누거/NNG 장작데미__1/NNG 르/JKO 허물고띠리/VV 었/EP 나/EF ?/SF 누가 장작더미를 허물어뜨렸니?
|
||||
옛날 서당에서는 잘못한 일이 있으문 싸리낭그루 종아리르 맞았다드라. 옛날/NNG 서당/NNG 에서/JKB 는/JX 잘못/MAG 하/XSV ᆫ/ETM 일/NNG 이/JKS 있/VV 으문/EC 싸리낭그__1/NNG 루/JKB 종아리/NNG 르/JKO 맞/VV 었/EP 다드라/EF ./SF 옛날 서당에서는 잘못한 일이 있으면 싸리나무로 종아리를 맞았다더라.
|
||||
빨랫감으 이러 치무제 놓구 어데르 가나? 빨랫감/NNG 으/JKO 이러/MAG 치무지/VV 어/EC 놓/VV 구/EC 어데__2/NP 르/JKO 가/VV 나/EF ?/SF 빨랫감을 이렇게 치쌓아 놓고 어디를 가니?
|
||||
배가 고프다드니 밥은 시큰 먹었나? 배/NNG 가/JKS 고프/VA 다/EC 들/VX 니/EC 밥/NNG 은/JX 시큰__2/MAG 먹/VV 었/EP 나/EF ?/SF 배가 고프다더니 밥은 실컷 먹었니?
|
||||
싱검이 든 기 없어지려면 족히 한 달은 걸리겠다. 싱검__1/NNG 이/JKS 들/VV ᆫ/ETM 기__76/NNB 이/JKS 없/VA 어/EC 지/VX 려면/EC 족히/MAG 한/MM 달/NNB 은/JX 걸리/VV 겠/EP 다/EF ./SF 멍이 든 게 없어지려면 족히 한 달은 걸리겠다.
|
||||
예즌에 우리 둘이 약속한 거 생각나나? 예즌__1/NNG 에/JKB 우리/NP 둘/NR 이/JKS 약속/NNG 하/XSV ᆫ/ETM 거/NNB 생각/NNG 나/VV 나/EF ?/SF 예전에 우리 둘이 약속한 거 생각나니?
|
||||
그 옷이 삐까리가 참 좋다야. 그/MM 옷/NNG 이/JKS 삐까리__2/NNG 가/JKS 참/MAG 좋/VA 다야/EF ./SF 그 옷이 빛깔이 참 좋다야.
|
||||
왜서 해피랄 이러 바쁠 때 놀러 가나? 왜서/MAG 해피랄__1/MAG 이러/MAG 바쁘/VA ᆯ/ETM 때/NNG 놀/VV 러/EC 가/VV 나/EF ?/SF 왜 해필 이렇게 바쁠 때 놀러 가니?
|
||||
가는 하는 짓이 벨시루운 기 아주 밉괄시루와. 가/NP 는/JX 하/VV 는/ETM 짓/NNG 이/JKS 벨시롭/VA-I 은/ETM 기__76/NNB 이/JKS 아주/MAG 밉괄시룹/VA-I 어/EF ./SF 걔는 하는 짓이 별스러운 게 아주 밉살스러워.
|
||||
아문 모재나 씨구 가라. 아문__10/MM 모재__8/NNG 나/JC 씨__3/VV 구/EC 가/VV 라/EF ./SF 아무 모자나 쓰고 가라.
|
||||
옥시끼 껍지는 거름테미에 갖다 버레라. 옥시끼__1/NNG 껍지__1/NNG 는/JX 거름테미__1/NNG 에/JKB 갖/VV 다/EC 버리/VV 어라/EF ./SF 옥수수 껍질은 두엄자리에 갖다 버려라.
|
||||
왜서 이러 등디기가 자주 개룹나? 왜서/MAG 이러/MAG 등디기__1/NNG 가/NNG 자주/MAG 개룹__1/VA-I 나/EF ?/SF 왜 이렇게 등이 자주 가렵니?
|
||||
저기 샘물둔지에 가서 목이나 췩이구 가자. 저기/NP 샘물둔지__1/NNG 에/JKB 가/VV 어서/EC 목/NNG 이나/JC 췩이__1/VV 구/EC 가/VV 자/EF ./SF 저기 샘물터에 가서 목이나 축이고 가자.
|
||||
옆집 두 내우분은 어데 댕겨오시는가 보드라. 옆집/NNG 두/MM 내우분__1/NNG 은/JX 어데__2/NP 댕겨오__1/VV 시/EP 는가/EC 보/VX 드라/EF ./SF 옆집 두 내외분은 어디 다녀오시는가 보더라.
|
||||
부애가 난 날에느 대림질으 하지 마고 마실이나 댕게오시우. 부애__4/NNG 가/JKS 나/VV ᆫ/ETM 날/NNG 에/JKB 느/JX 대림질__1/NNG 으/JKO 하/VV 지/EC 마/VX 고/EC 마실__2/NNG 이나/JC 댕기/VV 어/EC 오/VV 시우/EF ./SF 부아가 난 날에는 다리미질을 하지 말고 마을이나 다녀오세요.
|
||||
뽁닥양지에사 일을 하니 죽겠다라. 뽁닥양지__1/NNG 에사/JKB 일/NNG 을/JKO 하/VV 니/EC 죽/VV 겠/EP 다라/EF ./SF 땡볕에서 일을 하니 죽겠더라.
|
||||
오랜만에 술을 먹었더니 삐리하다라. 오랜만/NNG 에/JKB 술/NNG 을/JKO 먹/VV 었/EP 더니/EC 삐리하__1/VA 다라/EF ./SF 오랜만에 술을 먹었더니 얼근하더라.
|
||||
신비하구 신랭이 좀 닮었든데요. 신비__4/NNG 하구/JC 신랭__1/NNG 이/JKS 좀/MAG 닮/VV 었/EP 든데요/EF ./SF 신부하고 신랑이 좀 닮았던데요.
|
||||
옛날에 애들이 장난치다가 장독사래 뿌숴도 야단이나 치고 말었지, 뭐. 옛날/NNG 에/JKB 애/NNG 들/XSN 이/JKS 장난치/VV 다가/EC 장독사래__1/NNG 뿌수/VV 어도/EC 도/JX 야단/NNG 이나/JX 치/VV 고/EC 말/VX 었/EP 지/EC ,/SP 뭐/IC ./SF 옛날에 애들이 장난치다가 장독소래기 부숴도 야단이나 치고 말았지, 뭐.
|
||||
가겟바에 가서 아버지 좀 모세 와라. 가겟바__1/NNG 에/JKB 가/VV 어서/EC 아버지/NNG 좀/MAG 모시/VV 어/EC 오/VX 어라/EF ./SF 가겟방에 가서 아버지 좀 모셔 와라.
|
||||
낭그쪼가리 좀 더 넣어 가주구 불을 잉글잉글하게 해 봐라. 낭그쪼가리__1/NNG 좀/MAG 더/MAG 넣/VV 어/EC 가주/VX 구/EC 불/NNG 을/JKO 잉글잉글하__1/VV 게/EC 하/VV 어/EC 보/VX 어라/EF ./SF 나무쪽 좀 더 넣어 가지고 불을 이글이글하게 해 봐라.
|
||||
나르 보구 알근척두 않구 가든데요. 나/NP 르/JKO 보구/JKB 알근척__1/NNG 두/JX 않/VV 구/EC 가/VV 든데요/EF ./SF 나를 보고 알은척도 않고 가던데요.
|
||||
벜에 가서 우북한 즙시르 하나만 가주와라. 벜__2/NNG 에/JKB 가/VV 어서/EC 우북하__2/VA ᆫ/ETM 즙시__1/NNG 르/JKO 하나/NR 만/JX 가주오/VV 어라/EF ./SF 부엌에 가서 우묵한 접시를 하나만 가져와라.
|
||||
올챙이거 깨구리 될 때 뒷달구리부터 생기재? 올챙이/NNG 거/JKS 깨구리__1/NNG 되/VV ᆯ/ETM 때/NNG 뒷달구리__1/NNG 부터/JX 생기/VV 재/EF ?/SF 올챙이가 개구리 될 때 뒷다리부터 생기지?
|
||||
“짠드럭거리지 말어라.” 꼭 그러드라구요. “/SSO 짠드럭거리/VV 지/EC 말/VX 어라/EF ./SF ”/SSC 꼭/MAG 그러/VV 드라구요/EF ./SF “자부락거리지 마라.” 꼭 그러더라고요.
|
||||
오래전 일이라사 기억이 아사무사하다야. 오래/MAG 전/NNG 일/NNG 이/VCP 라사/EC 기억/NNG 이/JKS 아사무사하__1/VV 다야/EF ./SF 오래전 일이라서 기억이 어사무사하다야.
|
||||
돈베락이 떨어진다구 해두 인심을 살 수는 웂아. 돈베락__1/NNG 이/JKS 떨어지/VV ᆫ다구/EC 하/VV 어두/EC 인심/NNG 을/JKO 살/VV ᆯ/ETM 수/NNB 는/JX 웂__1/VA 아/EF ./SF 돈벼락이 떨어진다고 해도 인심을 살 수는 없어.
|
||||
사람덜이 그 아주머이 말재간에 마커 파대우임했잖소. 사람/NNG 덜/XSN 이/JKS 그/MM 아주머이__1/NNG 말/NNG 재간/NNG 에/JKB 마커__1/MAG 파대우임__1/NNG 하/XSV 었/EP 지/EC 않/VX 소/EF ./SF 사람들이 그 아주머니 말재간에 말끔 폭소했잖소.
|
||||
빗잘기와 씨리박 좀 가져와라. 빗잘기__1/NNG 와/JC 씨리박__1/NNG 좀/MAG 가져오/VV 어라/EF ./SF 빗자루와 쓰레받기 좀 가져와라.
|
||||
아가 울민서 자꼬 날 치다보드라구. 아__23/NNG 가/JKS 울/VV 민서/EC 자꼬__1/MAG 나/NP ᆯ/JKO 치다보__1/VV 드라구/EF ./SF 아이가 울면서 자꾸 날 쳐다보더라고.
|
||||
뭘 태쾄는지 방에 연기가 꼬르리하다라. 뭐/NP ᆯ/JKO 태쿠/VV 었/EP 는지/EC 는지/EC 방/NNG 에/JKB 연기/NNG 가/JKS 꼬르리하__1/VA 다라/EF ./SF 뭘 태웠는지 방에 연기가 자욱하더라.
|
||||
꼬들빼기는 심이 들아 몬 올라가. 꼬들빼기__1/NNG 는/JX 심__3/NNG 이/JKS 들/VV 아/EC 몬__3/MAG 올라가/VV 어/EF ./SF 꼭대기는 힘이 들어 못 올라가.
|
||||
저 큰 돌으 짜갈라사 산에다 버레라. 저/MM 크/VA ᆫ/ETM 돌/NNG 으/JKO 짜가르/VV 어서/EC 산/NNG 에다/JKB 버리/VV 어라/EF ./SF 저 큰 돌을 짜개서 산에다 버려라.
|
||||
뭐가 그라 좋아사 해발랑 웃고 있나? 뭐/NP 가/JKS 그라/MAG 좋/VA 어사/EF 해발랑__1/MAG 웃/VV-R 고/EC 있/VX 나/EF ?/SF 뭐가 그렇게 좋아서 해발쪽 웃고 있니?
|
||||
옥시끼르 잔떡 넣은 주루먹으 지구 자에 가든데요. 옥시끼__1/NNG 르/JKO 잔떡__1/MAG 넣/VV 은/ETM 주루먹__1/NNG 으/JKO 지/VV 구/EC 자__53/NNG 에/JKB 가/VV 든데요/EF ./SF 옥수수를 잔뜩 넣은 주루막을 지고 장에 가던데요.
|
||||
젊었을 적에는 고만만한 어린 자석들 키우는 재미에 살었지요. 젊/VA 었/EP 을/ETM 적/NNB 에/JKB 는/JX 고만만하/VA ᆫ/ETM 어리/VA ᆫ/ETM 자석__1/NNG 들/XSN 키우/VV 는/ETM 재미/NNG 에/JKB 살/VV 었/EP 지요/EF ./SF 젊었을 적에는 고만고만한 어린 자식들 키우는 재미에 살았지요.
|
||||
어제 캔 햇감재루 감재적으 좀 부칠까? 어제/MAG 캐/VV ᆫ/ETM 햇감재__1/NNG 루/JKB 감재적__1/NNG 으/JKO 좀/MAG 부치/VV ᆯ까/EF ?/SF 어제 캔 햇감자로 감자전을 좀 부칠까?
|
||||
옷에 먼 얼룩이 생게서 극정으 했드니 생각보다 잘 빨리킨다. 옷/NNG 에/JKB 먼__2/MM 얼룩/NNG 이/JKS 생기/VV 어서/EC 극정__3/NNG 으/JKO 하/VV 었/EP 드니/EC 생각/NNG 보다/JKB 잘/MAG 빨리키/VV ᆫ다/EF ./SF 옷에 무슨 얼룩이 생겨서 걱정을 했더니 생각보다 잘 빨린다.
|
||||
일꾼덜이 집 앞 감자밭으 건주건주 다 매 가드라. 일/NNG 꾼/XSN 덜/XSN 이/JKS 집/NNG 앞/NNG 감자/NNG 밭/NNG 으/JKO 건주건주__1/MAG 다/MAG 매/VV 어/EC 가/VX 드라/EF ./SF 일꾼들이 집 앞 감자밭을 거의거의 다 매 가더라.
|
||||
사람으 깔어뭉기는 그런 못된 짓으 어데서 배웠나? 사람/NNG 으/JKO 깔어뭉기__1/VV 는/ETM 그런/MM 못되/VA ᆫ/ETM 짓/NNG 으/JKO 어데__2/NP 서/JKB 배우/VV 었/EP 나/EF ?/SF 사람을 깔아뭉개는 그런 못된 짓을 어디서 배웠니?
|
||||
곰배도 벆에 불 늫구 불 담을 적에 사용하는 거지. 곰배__2/NNG 도/JX 벆__1/NNG 에/JKB 불/NNG 늫__1/VV 구/EC 불/NNG 담/VV 을/ETM 적/NNB 에/JKB 사용/NNG 하/XSV 는/ETM 거/NNB 이/VCP 지/EF ./SF 고무래도 아궁이에 불 넣고 불 담을 적에 사용하는 거지.
|
||||
잘못이 있으문 말루 하지, 왜서 남어 호박새이르 잡나? 잘못/NNG 이/JKS 있/VV 으문/EC 말/NNG 루/JKB 하/VV 지/EC ,/SP 왜서/MAG 남/NNG 어/JKG 호박새이__1/NNG 르/JKO 잡/VV-R 나/EF ?/SF 잘못이 있으면 말로 하지, 왜 남의 머리채를 잡니?
|
||||
올레리꼴레리, 영수는 바지에다 오줌 쌌대요. 올레리꼴레리__1/IC ,/SP 영수/NNP 는/JX 바지/NNG 에다/JKB 오줌/NNG 싸/VV 었/EP 대요/EF ./SF 알나리깔나리, 영수는 바지에다 오줌 쌌대요.
|
||||
질에 가래춤으 함부루 뱉으면 안 돼. 질__4/NNG 에/JKB 가래춤__1/NNG 으/JKO 함부루__1/MAG 뱉/VV 으면/EC 안/MAG 되/VV 어/EF ./SF 길에 가래침을 함부로 뱉으면 안 돼.
|
||||
지금 있는 돈은 이기 가작이다. 지금/MAG 있/VA 는/ETM 돈/NNG 은/JX 이/MM 기__76/NNB 이/JKS 가작__7/NNG 이/VCP 다/EF ./SF 지금 있는 돈은 이게 고작이다.
|
||||
돈으 애낄 줄 모르면 못씬다. 돈/NNG 으/JKO 애끼/VV ᆯ/ETM 줄/NNB 모르/VV 면/EC 못씨/VV ᆫ다/EF ./SF 돈을 아낄 줄 모르면 못쓴다.
|
||||
사람이 잘났다고 너무 양양대모 뵈기 싫다. 사람/NNG 이/JKS 잘나/VA 었/EP 다고/EC 너무/MAG 양양대__2/VV 모/EC 뵈/VV 기/ETN 싫/VA 다/EF ./SF 사람이 잘났다고 너무 으스대면 보기 싫다.
|
||||
사나가 지지부리한 일에 신경 쓰모 못쓴다. 사나__1/NNG 가/JKS 지지부리/XR 하/XSA ᆫ/ETM 일/NNG 에/JKB 신경/NNG 쓰/VV 모/EC 못쓰/VV ᆫ다/EF ./SF 사나이가 지지한 일에 신경 쓰면 못쓴다.
|
||||
가는 건딜지 말고 처레미 놔 두어라. 가/NP 는/JX 건딜__1/VV 지/EC 말/VX 고/EC 처레미__1/MAG 놓/VX 어/EC 두/VX 어라/EF ./SF 걔는 건들지 말고 그냥 놔 두어라.
|
||||
젊었을 때 맨날 안팎이 갈러센다 어쩐다 하든 건넷집이 하마 손지를 봤다잖소. 젊/VA 었/EP 을/ETM 때/NNG 맨날/MAG 안팎/NNG 이/JKS 갈러세__1/VV ᆫ다/EC 어쩌/VV ᆫ다/EC 하/VV 든/ETM 건넷집__1/NNG 이/JKS 하마__3/MAG 손지__4/NNG 를/JKO 보/VV 었/EP 다/EF 하/VV 잖소/EF ./SF 젊었을 때 만날 안팎이 갈라선다 어쩐다 하던 건넛집이 벌써 손주를 봤다잖소.
|
||||
참꽃이 피문 양지바른 곳에 짐이 아롱아롱 올라. 참꽃/NNG 이/JKS 피/VV 문/EC 양지바르/VA ᆫ/ETM 곳/NNG 에/JKB 짐__10/NNG 이/MM 아롱아롱/MAG 오르/VV 어/EF ./SF 참꽃이 피면 양지바른 곳에 아지랑이가 아롱아롱 올라.
|
||||
눈이 침침해서 바눌구녕이 잘 안 보킨다. 눈/NNG 이/JKS 침침/XR 하/XSA 어서/EC 바눌구녕__1/NNG 이/JKS 잘/MAG 안/MAG 보키__1/VV ᆫ다/EF ./SF 눈이 침침해서 바늘구멍이 잘 안 보인다.
|
||||
할머이, 올해 단우떡 잡솠어요? 할머이__1/NNG ,/SP 올해/NNG 단우떡__1/NNG 잡소__1/VV 었/EP 어요/EF ?/SF 할머니, 올해 단오떡 잡수었어요?
|
||||
나으 먹고 삼질이나 하고 댕기모 못쓴다. 나으__1/NNG 먹/VV 고/EC 삼질__2/NNG 이나/JX 하/VV 고/EC 댕기/VV 모/EC 못쓰/VV ᆫ다/EF ./SF 나이 먹고 쌈질이나 하고 다니면 못쓴다.
|
||||
내 종이비행기가 하날로 솟지를 않구 땅으로 강중배기했아. 나/NP 의/JKG 종이/NNG 비행기/NNG 가/JKS 하날__1/NNG 로/JKB 솟/VV-R 지/EC 를/JKO 않/VX 구/EC 땅/NNG 으로/JKB 강중배기/XR 하/XSV 었/EP 어/EF ./SF 내 종이비행기가 하늘로 솟지를 않고 땅으로 재곤두쳤어.
|
||||
오랜만에 장에 나왔으니 서둘르지 말구 시느매 귀경하구 가자. 오랜만/NNG 에/JKB 장/NNG 에/JKB 나오/VV 었/EP 으니/EC 서둘르/VV 지/EC 말/VX 구/EC 시느매__1/MAG 귀경__7/NNG 하/XSV 구/EC 가/VV 자/EF ./SF 오랜만에 장에 나왔으니 서두르지 말고 천천히 구경하고 가자.
|
||||
자는 어릴 때부터 사가닥질으 잘하더니 체조 선수가 됐잖소. 자/NP 는/JX 어리/VA ᆯ/ETM 때/NNG 부터/JX 사가닥질__1/NNG 으/JKO 잘/MAG 하/XSV 더니/EC 체조/NNG 선수/NNG 가/JKC 되/VV 었/EP 지/EC 않/VX 소/EC ./SF 쟤는 어릴 때부터 공중제비를 잘하더니 체조 선수가 됐잖소.
|
||||
메칠 동안 청소르 못 했드니 집 안이 아주 너분지르하구나. 메칠__1/NNG 동안/NNG 청소/NNG 르/JKO 못/MAG 하/VV 었/EP 드니/EC 집/NNG 안/NNG 이/JKS 아주/MAG 너분지르하__1/VA 구나/EF ./SF 며칠 동안 청소를 못 했더니 집 안이 아주 너저분하구나.
|
||||
우리 집은 지대거 높어서 아릿동네거 다 내더보케요. 우리/NP 집/NNG 은/JX 지대/NNG 거/JKS 높/VA 어서/EC 아릿동네__1/NNG 거/JKS 다/MAG 내더보키__1/VV 어요/EF ./SF 우리 집은 지대가 높아서 아랫동네가 다 내다보여요.
|
||||
모심기하다가 먹는 즘숨이 그라 맛있잖소. 모심기/NNG 하/XSV 다가/EC 먹/VV 는/ETM 즘숨__1/NNG 이/JKS 그렇/VA-I 게/EC 맛있/VA 잖소/EF ./SF 모심기하다가 먹는 점심이 그렇게 맛있잖소.
|
||||
니네 집 뒷산에 밤낭그가 많재? 니/NP 네/XSN 집/NNG 뒷산/NNG 에/JKB 밤낭그__1/NNG 가/JKS 많/VA 재/EF ?/SF 너네 집 뒷산에 밤나무가 많지?
|
||||
어데서 이러 흘투세이거 될 때꺼지 놀았나? 어데__2/NP 서/JKB 이렇/VA-I 게/EC 흘투세이__1/NNG 거/JKC 되/VV ᆯ/ETM 때/NNG 꺼지/JX 놀/VV 었/EP 나/EC ?/SF 어디서 이렇게 흙투성이가 될 때까지 놀았니?
|
||||
이번 태풍 때민에 낭기가 부라졌잖소. 이번/NNG 태풍/NNG 때민__1/NNB 에/JKB 낭기__1/NNG 가/JKS 부라지__1/VV 었/EP 지/EC 않/VX 소/EC ./SF 이번 태풍 때문에 나무가 부러졌잖소.
|
||||
너머 쏘댕기지만 말구 진득하게 앉어서 공부 좀 해라. 너머__2/MAG 쏘댕기__1/VV 지만/EC 말/VX 구/EC 진득/XR 하/XSA 게/EC 앉/VV 어서/EC 공부/NNG 좀/MAG 하/VV 어라/EF ./SF 너무 쏘다니지만 말고 진득하게 앉아서 공부 좀 해라.
|
||||
속이 안 좋은지 자꾸 꿱질이 나와. 속/NNG 이/JKS 안/MAG 좋/VA 은지/EC 자꾸/MAG 꿱질__1/NNG 이/JKS 나오/VV 어/EF ./SF 속이 안 좋은지 자꾸 구역질이 나와.
|
||||
일할 때 매사 빈틈이 없는 기 꼭 차돌이다라. 일/NNG 하/XSV ᆯ/ETM 때/NNG 매사/MAG 빈틈/NNG 이/JKS 없/VA 는/ETM 기__76/NNB 이/JKS 꼭/MAG 차돌/NNG 이/VCP 다라/EF ./SF 일할 때 매사 빈틈이 없는 게 꼭 차돌이더라.
|
||||
마누라 몰르게 꽁쳐 둔 돈으루 술 한잔 걸쳈아. 마누라/NNG 몰르__2/VV 게/EC 꽁치__1/VV 어/EC 두/VV ᆫ/ETM 돈/NNG 으루/JKB 술/NNG 한/MM 잔/NNG 걸치/VV 었/EP 어/EF ./SF 마누라 모르게 꿍쳐 둔 돈으로 술 한잔 걸쳤어.
|
||||
왜 이러 얼굴이 모씨게 됐소. 왜/MAG 이렇/VA-I 게/EC 얼굴/NNG 이/JKS 모씨__1/VV 게/EC 되/VV 었/EP 소/EC ./SF 왜 이렇게 얼굴이 못쓰게 됐소.
|
||||
어제 음석을 잘못 먹었더니 속이 대루와서 혼났아. 어제/MAG 음석__1/NNG 을/JKO 잘/MAG 못/MAG 먹/VV 었/EP 더니/EC 속/NNG 이/JKS 대릅__1/VA-I 어서/EC 혼나/VV 었/EP 어/EF ./SF 어제 음식을 잘못 먹었더니 속이 메스꺼워서 혼났어.
|
||||
하루 죙일 뙤댕기드니 배고프재? 하루/NNG 죙일__1/NNG 뙤댕기__1/VV 드니/EC 배고프/VA 재/EF ?/SF 하루 종일 뛰어다니더니 배고프지?
|
||||
사티기가 자꾸 씨닥거레서 씨라린다. 사티기__1/NNG 가/JKS 자꾸/MAG 씨닥거리__1/VV 어서/EC 씨라리__1/VA ᆫ다/EF ./SF 사타구니가 자꾸 쓸려서 쓰라린다.
|
||||
가가 하는 말은 수완 거짓말이다라. 가/NP 가/JKS 하/VV 는/ETM 말/NNG 은/JX 수완__3/MAG 거짓말/NNG 이/VCP 다라/EF ./SF 걔가 하는 말은 순 거짓말이더라.
|
||||
내 말뜻은 그기 아이다. 나/NP 의/JKG 말뜻/NNG 은/JX 그기/NP 이/JKC 아이__1/VA 다/EF ./SF 내 말뜻은 그게 아니다.
|
||||
어제는 너무 심이 들었는지 꾸시레져서 아칙까지 잤잖소. 어제/NNG 는/JX 너무/MAG 심__3/NNG 이/JKS 들/VV 었/EP 는지/EC 꾸시레지__1/VV 어서/EC 아칙__1/NNG 까지/JX 자/VV 었/EP 잖소/EF ./SF 어제는 너무 힘이 들었는지 쓰러져서 아침까지 잤잖소.
|
||||
겅굼대로 빨랫줄으 높이 올려라. 겅굼대__1/NNG 로/JKB 빨랫줄/NNG 으/JKO 높이/MAG 올리/VV 어라/EF ./SF 바지랑대로 빨랫줄을 높이 올려라.
|
||||
누가 이러 방으 매렌읎이 어질고 놓구 갔나? 누구/NP 가/JKS 이렇/VA-I 게/EC 방/NNG 으/JKO 매렌읎__1/VA 이/EC 어질__2/VV 고/EC 놓/VV 구/EC 가/VV 었/EP 나/EF ?/SF 누가 이렇게 방을 형편없이 어질러 놓고 갔니?
|
||||
엄마 팔비개 비구 코자자. 엄마/NNG 팔비개__1/NNG 비__13/VV 구/EC 코자__1/VV 자/EF ./SF 엄마 팔베개 베고 코하자.
|
||||
마누래한테 쥐케사는 것처름 말해두, 그 집 부부 금실은 말두 못하게 좋아. 마누래__1/NNG 한테/JKB 쥐케살__1/VV 는/ETM 것/NNB 처름/JKB 말/NNG 하/XSV 어두/EC ,/SP 그/MM 집/NNG 부부/NNG 금실/NNG 은/JX 말/NNG 두/JX 못/MAG 하/VV 게/EC 좋/VA 어/EF ./SF 마누라한테 쥐여사는 것처럼 말해도, 그 집 부부 금실은 말도 못하게 좋아.
|
||||
봄철 반찬으루는 씹씨레한 산나물이 젤이야. 봄철/NNG 반찬/NNG 으루/JKB 는/JX 씹씨레/XR 하/XSA ᆫ/ETM 산나물/NNG 이/JKS 젤__1/NNG 이/VCP 야/EF ./SF 봄철 반찬으로는 씁쓰레한 산나물이 젤이야.
|
||||
비도 추적추적 오는데 오늘 즘심에는 부치미르 부체 먹자. 비/NNG 도/JX 추적추적/MAG 오/VV 는데/EC 오늘/NNG 즘심__1/NNG 에/JKB 는/JX 부치미__1/NNG 르/JKO 부치/VV 어/EC 먹/VV 자/EF ./SF 비도 추적추적 오는데 오늘 점심에는 부침개를 부쳐 먹자.
|
||||
우리 말은 사방으루 산이 맥헤 있어서 저울철에두 참 안득해요. 우리/NP 말__26/NNG 은/JX 사방/NNG 으루/JKB 산/NNG 이/JKS 맥히__1/VV 어/EC 있/VX 어서/EC 저울철__1/NNG 에/JKB 두/JX 참/MAG 안득/XR 하/XSA 어요/EF ./SF 우리 마을은 사방으로 산이 막혀 있어서 겨울철에도 참 아늑해요.
|
||||
옛날이나 지끔이나 무조근 냉게눌룬다고 사램들이 순순히 따르겠소? 옛날/NNG 이나/JC 지끔__2/NNG 이나/JC 무조근__1/NNG 냉게눌루__1/VV ᆫ다고/EC 사램__1/NNG 들/XSN 이/JKS 순순히/MAG 따르/VV 겠/EP 소/EF ?/SF 옛날이나 지금이나 무조건 내리누른다고 사람들이 순순히 따르겠소?
|
||||
장마철이라 어디서 코다부리한 내금새가 난다야. 장마철/NNG 이/VCP 라/EC 어디/NP 서/JKB 코다부리/XR 하/XSA ᆫ/ETM 내금새__1/NNG 가/JKS 나/VV ᆫ다야/EF ./SF 장마철이라 어디서 퀴퀴한 냄새가 나는구나.
|
||||
자전게르 끌구 던들배기질으 올라왔으이 심들기두 하겠다. 자전게__1/NNG 르/JKO 끌/VV 구/EC 던들배기질__1/NNG 으/JKO 올라오/VV 었/EP 으이/EC 심들__1/VA 기/ETN 두/JX 하/VX 겠/EP 다/EF ./SF 자전거를 끌고 언덕길을 올라왔으니 힘들기도 하겠다.
|
||||
무렆으 꿇구 앉어 있었드니 다리거 제리제리해. 무렆__1/NNG 으/JKO 꿇/VV 구/EC 앉/VV 어/EC 있/VX 었/EP 드니/EC 다리/NNG 거/JKS 제리제리__1/MAG 하/XSA 어/EF ./SF 무릎을 꿇고 앉아 있었더니 다리가 저리저리해.
|
||||
옛날에는 산에 가서 깍쟁이질으 해서 소갈비르 끌어 왔아. 옛날/NNG 에/JKB 는/JX 산/NNG 에/JKB 가/VV 어서/EC 깍쟁이질__1/NNG 으/JKO 하/XSV 어서/EC 소갈비__2/NNG 르/JKO 끌/VV 어/EC 오/VX 었/EP 어/EF ./SF 옛날에는 산에 가서 갈퀴질을 해서 솔가리를 끌어 왔어.
|
||||
자들은 따치 떨어져 댕게야 안 시꾸룹다. 자/NP 들/XSN 은/JX 따치__2/MAG 떨어지/VV 어/EC 댕기__2/VV 어야/EC 안/MAG 시꾸룹__1/VA-I 다/EF ./SF 쟤들은 따로 떨어져 다녀야 안 시끄럽다.
|
||||
남 보구 함부루 꼴불겐이라구 그러문 못써. 남/NNG 보/VV 구/EC 함부루__1/MAG 꼴불겐__1/NNG 이/VCP 라구/EC 그러/VV 문/EC 못/MAG 쓰/VV 어/EF ./SF 남 보고 함부로 꼴불견이라고 그러면 못써.
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
바구니에 개나리꼿을 잔뜩 담어 놨어요. 바구니/NNG 에/JKB 개나리/NNG 꼿__1/NNG 을/JKO 잔뜩/MAG 담/VV 어/EC 놓/VX 었/EP 어요/EF ./SF 바구니에 개나리꽃을 잔뜩 담아 놨어요.
|
||||
새용에 밥을 지어 먹었다. 새용__1/NNG 에/JKB 밥/NNG 을/JKO 짓/VV-I 어/EC 먹/VV 었/EP 다/EF ./SF 새옹에 밥을 지어 먹었다.
|
||||
냄에 물건을 훔쳐서 달아나구 했지. 냄__3/NNG 에/JKG 물건/NNG 을/JKO 훔치/VV 어서/EC 달아나/VV 구/EC 하/VV 었/EP 지/EF ./SF 남의 물건을 훔쳐서 달아나고 했지.
|
||||
아주 옛날에는 사람의 힘으로다 절굿괭이로 절구질을 해서 쌀을 맨들었지. 아주/MAG 옛날/NNG 에/JKB 는/JX 사람/NNG 의/JKG 힘/NNG 으로다/JKB 절굿괭이__1/NNG 로/JKB 절구/NNG 질/XSN 을/JKO 하/VV 어서/EC 쌀/NNG 을/JKO 맨들__3/VV 었/EP 지/EF ./SF 아주 옛날에는 사람의 힘으로 절굿공이로 절구질을 해서 쌀을 만들었지.
|
||||
그 아이는 날 때부터 귀먹추다. 그/MM 아이/NNG 는/JX 나/VV ᆯ/ETM 때/NNG 부터/JX 귀먹추__1/NNG 이/VCP 다/EF ./SF 그 아이는 날 때부터 귀머거리다.
|
||||
아이 온몸이 죄다 헐어 혼디 투성이야. 아이/NNG 온몸/NNG 이/JKS 죄다/MAG 헐/VV 어/EC 혼디__1/NNG 투성이/XSN 이/VCP 야/EF ./SF 아이 온몸이 죄다 헐어 헌데 투성이야.
|
||||
성허구 아오가 비샛하게 생겼구나. 성__5/NNG 허구/JC 아오__1/NNG 가/JKS 비샛하__1/VA 게/EC 생기/VV 었/EP 구나/EF ./SF 형하고 아우가 비슷하게 생겼구나.
|
||||
결혼 첫날에 배깥에서 문을 뚫어서 보는 것도 있었지요. 결혼/NNG 첫날/NNG 에/JKB 배깥__1/NNG 에서/JKB 문/NNG 을/JKO 뚫/VV 어서/EC 보/VV 는/ETM 것/NNB 도/JX 있/VV 었/EP 지요/EF ./SF 결혼 첫날 바깥에서 문을 뚫어서 보는 것도 있었지요.
|
||||
산에 가도토리 주우러 간다. 산/NNG 에/JKB 가도토리__1/NNG 줍/VV-I 으러/EC 가/VV ᆫ다/EF ./SF 산에 상수리 주우러 간다.
|
||||
논에 가서 박고둥을 많이 잡았다. 논/NNG 에/JKB 가/VV 어서/EC 박고둥__1/NNG 을/NNG 많이/MAG 잡/VV-R 었/EP 다/EF ./SF 논에 가서 우렁이를 많이 잡았다.
|
||||
가꺼운 데는 죄 해 가서 낭구를 할 거도 웂구. 가꺼운/NNG 데/NNB 는/JX 죄/MAG 하/VV 어/EC 가/VX 어서/EC 낭구__1/NNG 를/JKO 하/VV ᆯ/ETM 거/NNB 도/JX 웂__1/VA 구/EF ./SF 가까운 데는 죄 해 가서 나무를 할 것도 없고.
|
||||
김치는 새우로 맨들은 젖에다가 담근 게 맛있지요. 김치/NNG 는/JX 새우/NNG 로/JKB 맨들__3/VV 은/ETM 젖__4/NNG 에다가/JKB 담그/VV ᆫ/ETM 것/NNB 이/JKS 맛있/VA 지요/EF ./SF 김치는 새우로 만든 젓에다가 담근 게 맛있지요.
|
||||
깎이비얄이 너마 가팔라서 오르기가 힘들다. 깎이비얄__1/NNG 이/JKS 너마__1/MAG 가파르/VA 어서/EC 오르/VV 기/ETN 가/JKS 힘들/VA 다/EF ./SF 비탈이 너무 가팔라서 오르기가 힘들다.
|
||||
정월에는 집집마다 힌떡을 만들어 먹었어요. 정월/NNG 에/JKB 는/JX 집집/NNG 마다/JX 힌떡__1/NNG 을/JKO 만들/VV 어/EC 먹/VV 었/EP 어요/EF ./SF 정월에는 집집마다 가래떡을 만들어 먹었어요.
|
||||
애를 사정없이 줘패선 안 되지. 애/NNG 를/JKO 사정없이/MAG 줘패__1/VV 서/EC ᆫ/JX 안/MAG 되/VV 지/EF ./SF 애를 사정없이 쥐어패선 안 되지.
|
||||
벌에 물려서 벌따구가 부었다. 벌/NNG 에/JKB 물리/VV 어서/EC 벌따구__1/NNG 가/JKS 붓/VV-I 었/EP 다/EF ./SF 벌에 물려서 볼때기가 부었다.
|
||||
자기보다두 더 나으면 낫지 들하진 않거든. 자기/NP 보다/JKB 두/JX 더/MAG 낫/VV-I 으면/EC 낫/VV-I 지/EC 들하__1/VA 지/EC ᆫ/JX 않/VX 거든/EF ./SF 자기보다도 더 나으면 낫지 덜하진 않거든.
|
||||
그게 인제 봇줄을 이렇게 해서 몽지를 소 목에 걸구 대니죠. 그것/NP 이/JKS 인제/MAG 봇/NNG 줄/NNG 을/JKO 이렇/VA-I 게/EC 하/VV 어서/EC 몽지__1/NNG 를/JKO 소/NNG 목/NNG 에/JKB 걸/VV 구/EC 대니__1/VV 죠/EF ./SF 그게 이제 봇줄을 이렇게 해서 멍에를 소 목에 걸고 다니죠.
|
||||
암소가 암청을 내게 대문 교배를 해서 새끼를 낳지. 암소/NNG 가/JKS 암청__1/NNG 을/NNG 내/VV 게/EC 대__22/VV 문/EC 교배/NNG 를/JKO 하/VV 어서/EC 새끼/NNG 를/JKO 낳/VV 지/EF ./SF 암소가 암내를 내게 되면 교배를 해서 새끼를 낳지.
|
||||
산에서 솔가래를 긁어모아 불을 땐다. 산/NNG 에서/JKB 솔가래__1/NNG 를/JKO 긁어모으/VV 어/EC 불/NNG 을/JKO 때/VV ᆫ다/EF ./SF 산에서 솔가리를 긁어모아 불을 땐다.
|
||||
옛날에는 가마섯에다 밥할 때 애호박을 같이 쪄 갖구두 먹었어요. 옛날/NNG 에/JKB 는/JX 가마섯__1/NNG 에다/JKB 밥/NNG 하/XSV ᆯ/ETM 때/NNG 애호박/NNG 을/JKO 같이/MAG 찌/VV 어/EC 갖/VX 구/EC 두/JX 먹/VV 었/EP 어요/EF ./SF 옛날에는 가마솥에다 밥할 때 애호박을 같이 쪄 갖고도 먹었어요.
|
||||
하도 정신이 웂어서 집만 쌓아 두구 송태이는 하나두 안 엮어 놓은 거야. 하도/MAG 정신/NNG 이/JKS 웂__1/VA 어서/EC 집__19/NNG 만/JX 쌓/VV 어/EC 두/VX 구/EC 송태이__1/NNG 는/JX 하나/NR 두/JX 안/MAG 엮/VV 어/EC 놓/VX 은/ETM 거/NNB 이/VCP 야/EF ./SF 하도 정신이 없어서 짚만 쌓아 두고 멱둥구미는 하나도 안 엮어 놓은 거야.
|
||||
갈쿠로다 낙엽 떨어진 걸 긁어다 아공지에 때고 그랬지요. 갈쿠__2/NNG 로다/JKB 낙엽/NNG 떨어지/VV ᆫ/ETM 거/NNB ᆯ/JKO 긁/VV 어다/EC 아공지__1/NNG 에/JKB 때/VV 고/EC 그렇/VA-I 었/EP 지요/EF ./SF 갈퀴로다 낙엽 떨어진 걸 긁어다 아궁이에 때고 그랬지요.
|
||||
다듬이돌에 명지 놓구 한참 두드리믄 명지가 뜨끈뜨끈허지. 다듬이돌__1/NNG 에/JKB 명지__1/NNG 놓/VX 구/EC 한참/NNG 두드리/VV 믄/EC 명지__1/NNG 가/JKS 뜨끈뜨끈/MAG 허/XSA 지/EF ./SF 다듬잇돌에 명주 놓고 한참 두드리면 명주가 뜨끈뜨끈하지.
|
||||
이 대레미는 전기를 많이 먹지. 이/MM 대레미__1/NNG 는/JX 전기/NNG 를/JKO 많이/MAG 먹/VV 지/EF ./SF 이 다리미는 전기를 많이 먹지.
|
||||
물가에 옛날에는 깔땅이 많었는데, 요새는 하나두 웂어요. 물가/NNG 에/JKB 옛날/NNG 에/JKB 는/JX 깔땅__1/NNG 이/JKS 많/VA 었/EP 는데/EC ,/SP 요새/NNG 는/JX 하나/NR 두/JX 웂__1/VA 어요/EF ./SF 물가에 옛날에는 갈대가 많았는데, 요새는 하나도 없어요.
|
||||
낭구꾼이니 잿갓에 낭구하러 갔지. 낭구꾼__1/NNG 이/VCP 니/EC 잿갓__1/NNG 에/JKB 낭구하__1/VV 러/EC 가/VV 었/EP 지/EF ./SF 나무꾼이니 산에 나무하러 갔지.
|
||||
감기가 오려나 자꾸 재치기가 나온다. 감기/NNG 가/JKS 오/VV 려나/EC 자꾸/MAG 재치기__4/NNG 가/JKS 나오/VV ᆫ다/EF ./SF 감기가 오려나 자꾸 재채기가 나온다.
|
||||
아주머이들이 보구니 들고 가서 나물 많이 뜯어 왔지요. 아주머이__1/NNG 들/XSN 이/JKS 보구니__1/NNG 들/VV 고/EC 가/VV 어서/EC 나물/NNG 많이/MAG 뜯/VV-R 어/EC 오/VX 었/EP 지요/EF ./SF 아주머니들이 바구니 들고 가서 나물 많이 뜯어 왔지요.
|
||||
넘의 머리를 왜 헤틀어 놓니? 넘__2/NNG 의/JKG 머리/NNG 를/JKO 왜/MAG 헤틀__1/VV 어/EC 놓/VX 니/EC ?/SF 남의 머리를 왜 헝클어 놓니?
|
||||
봄에는 아주머이들이 보그니 들고 나물 뜯으러 갔었어요. 봄/NNG 에/JKB 는/JX 아주머이__1/NNG 들/XSN 이/JKS 보그니__1/NNG 들/VV 고/EC 나물/NNG 뜯/VV-R 으러/EC 가/VV 었었/EP 어요/EF ./SF 봄에는 아주머니들이 바구니 들고 나물 뜯으러 갔었어요.
|
||||
불젓갈은 뜨거니깐 조심해라. 불젓갈__1/NNG 은/JX 뜨겁/VA-I 으니까/EC 조심/NNG 하/XSV 어라/EF ./SF 부젓가락은 뜨거우니까 조심해라.
|
||||
불뚜개루 벙갱이 재 좀 퍼라. 불뚜개__1/NNG 루/JKB 벙갱이__1/NNG 재/NNG 좀/MAG 푸/VV 어라/EF ./SF 부삽으로 아궁이 재 좀 퍼라.
|
||||
아침복새를 받으문 창문이 벌겋게 보여요. 아침복새__1/NNG 를/JKO 받/VV-R 으문/EC 창문/NNG 이/JKS 벌겋/VA-I 게/EC 보이/VV 어요/EF ./SF 아침노을을 받으면 창문이 벌겋게 보여요.
|
||||
벅에 불을 때서 소죽을 쒀 멕여요. 벅__4/NNG 에/JKB 불/NNG 을/JKO 때/VV 어서/EC 소/NNG 죽/NNG 을/JKO 쑤/VV 어/EC 멕이/VV 어요/EF ./SF 아궁이에 불을 때서 소죽을 쒀 먹여요.
|
||||
아궁이에 불을 땔 때는 부지깨이가 필요하다. 아궁이/NNG 에/JKB 불/NNG 을/JKO 때/VV ᆯ/ETM 때/NNG 는/JX 부지깨이__1/NNG 가/JKS 필요/NNG 하/XSA 다/EF ./SF 아궁이에 불을 땔 때는 부지깽이가 필요하다.
|
||||
그래도 이거를 다가 해결해 주구 가야 핼 텐데. 그래도/MAJ 이거/NP 를/JKO 다가__11/MAG 해결/NNG 하/XSV 어/EC 주/VX 구/EC 가/VV 어야/EC 하/VX ᆯ/ETM 터/NNB 이/VCP ᆫ데/EF ./SF 그래도 이거를 얼른 해결해 주고 가야 할 텐데.
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
나가 가마이 보이끼네 기가 멕히는 기라. 나/NP 가/JKS 가마이__1/MAG 보/VV 이끼네/EC 기/NNG 가/JKS 멕히/VV 는/ETM 기__76/NNB 이/VCP 라/EF ./SF 내가 가만히 보니까 기가 막히는 거야.
|
||||
급히 묵는 찜에 까시가 목에 걸렜다. 급히/MAG 묵__4/VV 는/ETM 찜__10/NNB 에/JKB 까시__1/NNG 가/JKS 목/NNG 에/JKB 걸리/VV 었/EP 다/EF ./SF 급히 먹는 바람에 가시가 목에 걸렸다.
|
||||
쓰레기를 길바닥에다 그렇게 내봉치모 우짜노? 쓰레기/NNG 를/JKO 길바닥/NNG 에다/JKB 그렇/VA-I 게/EC 내봉치__1/VV 모/EC 우짜__1/VV 노/EF ?/SF 쓰레기를 길바닥에다 그렇게 내팽개치면 어쩌니?
|
||||
윗집 영감재이 변덕이 앵꼬시럽다. 윗집/NNG 영감재이__1/NNG 변덕/NNG 이/JKS 앵꼬시럽__1/VA-I 다/EF ./SF 윗집 영감쟁이의 변덕이 아니꼽다.
|
||||
배겉사돈이 참 사람이 좋아 보이네예. 배겉사돈__1/NNG 이/JKS 참/MAG 사람/NNG 이/JKS 좋/VA 어/EC 보이/VV 네예/EF ./SF 바깥사돈이 참 사람이 좋아 보이네요.
|
||||
떡꿀밤은 다람지 조야지 다 훑어 오믄 우짜노? 떡꿀밤__1/NNG 은/NNG 다람지__1/NNG 조__2/VV 어야지/EC 다/MAG 훑/VV 어/EC 오/VX 믄/EC 우짜/VV 노/EF ?/SF 상수리는 다람쥐 줘야지 다 훑어 오면 어떡하니?
|
||||
꽃병에 있는 장미가 인자 싸드리하다. 꽃병/NNG 에/JKB 있/VV 는/ETM 장미/NNG 가/JKS 인자/MAG 싸드리하__1/VA 다/EF ./SF 꽃병에 있는 장미가 이제 시들하다.
|
||||
자는 보고도 못 본 척할 일을 꼭 쉬언쟁이맨치로 다 말로 한다. 자/NP 는/JX 보/VV 고/EC 도/JX 못/MAG 보/VV ᆫ/ETM 척/NNB 하/XSV ᆯ/ETM 일/NNG 을/JKO 꼭/MAG 쉬언쟁이__1/NNG 맨치로/JKB 다/MAG 말/NNG 로/JKO 하/VV ᆫ다/EF ./SF 쟤는 보고도 못 본 척할 일을 꼭 수다쟁이처럼 다 말을 한다.
|
||||
옴마, 띠오다 움벙에 자빠지서 옷이 추지 삤어예. 옴마__1/NNG ,/SP 띠오__1/VV 다/EC 움벙__1/NNG 에/JKB 자빠지/VV 서/EC 옷/NNG 이/JKS 추지/VA 어/EC 삐__4/VX 었/EP 어예/EF ./SF 엄마, 뛰어오다 웅덩이에 자빠져서 옷이 추져 버렸어요.
|
||||
요새 산에 오서리가 어데 있노? 요새/MAG 산/NNG 에/JKB 오서리__1/NNG 가/JKS 어데__2/NP 있/VV 노/EF ?/SF 요새 산에 오소리가 어디 있니?
|
||||
봄에 논 갈 때에 골바이 주다가 쌂아 무마 맛있제. 봄/NNG 에/JKB 논/NNG 가/VV ᆯ/ETM 때/NNG 에/JKB 골바이__1/NNG 줍/VV-I 어다가/EC 쌂__1/VV 어/EC 묵__4/VV 으마/EC 맛있/VA 제/EF ./SF 봄에 논 갈 때에 고둥 주워다가 삶아 먹으면 맛있지.
|
||||
배물미가 심해서 섬 배껕에 나가 본 적이 한 분도 없대이. 배물미__1/NNG 가/JKS 심하/VA 어서/EC 섬/NNG 배껕__1/NNG 에/JKB 나가/VV 어/EC 보/VX ᆫ/ETM 적/NNB 이/JKS 한/MM 분__28/NNB 도/JX 없/VA 대이/EF ./SF 뱃멀미가 심해서 섬 바깥에 나가 본 적이 한 번도 없다.
|
||||
수채구멍이 막히서 물이 안 내리간다. 수채구멍__1/NNG 이/MM 막히/VV 어서/EC 물/NNG 이/JKS 안/MAG 내리/VV 어/EC 가/VX ᆫ다/EF ./SF 수채가 막혀서 물이 안 내려간다.
|
||||
타시매로 기름에 티기 가 반찬으로 머마 좋아여. 타시매__1/NNG 로/JKO 기름/NNG 에/JKB 티기/VV 어가/EC 반찬/NNG 으로/JKB 먹/VV 으마/EC 좋/VA 아여/EF ./SF 다시마를 기름에 튀겨 가지고 반찬으로 먹으면 좋아요.
|
||||
어무이는 늘 반질당새기를 끌안고 앉아서 옷을 꾸매신다. 어무이__2/NNG 는/JX 늘/MAG 반질당새기__1/NNG 를/JKO 끌/VV 어/EC 안/VV 고/EC 앉/VV 어서/EC 옷/NNG 을/JKO 꾸매__1/VV 시/EP ᆫ다/EF ./SF 어머니는 늘 반짇고리를 끌어안고 앉아서 옷을 꿰매신다.
|
||||
그 집 아가 빌나서 고랑때를 묵다. 그/MM 집/NNG 아__23/NNG 가/JKS 빌나__1/VA 어서/EC 고랑때__1/NNG 를/JKO 묵__4/VV 다/EF ./SF 그 집 아이가 별나서 골탕을 먹다.
|
||||
도굿대더 나무로 가이고 깎아여. 도굿대__1/NNG 더/JX 나무/NNG 로/JKO 가이__2/VX 고/EC 깎/VV 아여/EF ./SF 절굿공이도 나무를 가지고 깎아요.
|
||||
얼신이 사기를 당해 가이고 하루아침에 질가람에 나앉았다 카대. 얼신__1/NNG 이/JKS 사기/NNG 를/JKO 당하/VV 어/EC 가이__2/VX 고/EC 하루아침/NNG 에/JKB 질가람__1/NNG 에/JKB 나앉/VV 었/EP 다고/EC 하/VV 대/EF ./SF 어르신이 사기를 당해 가지고 하루아침에 길거리에 나앉았다고 하대.
|
||||
띠다가 넘어져서 온몸에 맹당구가 들었다. 띠__8/VV 다가/EC 넘어지/VV 어서/EC 온몸/NNG 에/JKB 맹당구__1/NNG 가/NNG 들/VV 었/EP 다/EF ./SF 뛰다가 넘어져서 온몸에 멍이 들었다.
|
||||
칼을 가와 가주고 반을 따개가 반씩 농가라. 칼/NNG 을/JKO 가오__1/VV 어/EC 가주/VX 고/EC 반/NNG 을/JKO 따개/VV 어가/EC 반/NNG 씩/XSN 농그/VV 어라/EF ./SF 칼을 가지고 와 가지고 반을 갈라서 반씩 나누어라.
|
||||
내 국에는 와 고기 살찌미가 하나도 없노? 내/MM 국/NNG 에/JKB 는/JX 와/MAG 고기/NNG 살찌미__1/NNG 가/JKS 하나/NR 도/JX 없/VA 노/EF ?/SF 내 국에는 왜 고기 살점이 하나도 없니?
|
||||
국 퍼그로 사바리 멫 개 가온나. 국/NNG 퍼__1/VV 그로/EC 사바리__2/NNG 멫__1/NR 개/NNB 가오__1/VV ᆫ나/EF ./SF 국 푸게 사발 몇 개 가져오너라.
|
||||
이 사람이 자네 서군인가? 이/MM 사람/NNG 이/JKS 자네/NP 서군__1/NNG 이/VCP ᆫ가/EF ?/SF 이 사람이 자네 서랑인가?
|
||||
바닷가에서 소라고디이 마이 잡았나? 바닷가/NNG 에서/JKB 소라고디이__1/NNG 마이__1/MAG 잡/VV-R 었/EP 나/EC ?/SF 바닷가에서 소라고둥 많이 잡았니?
|
||||
다리 한쪽을 쩔뚝쩔뚝하는 사람은 쩔룸발이라 카지. 다리/NNG 한쪽/NNG 을/JKO 쩔뚝쩔뚝/XR 하/VV 는/ETM 사람/NNG 은/JX 쩔룸발이__1/NNG 이/VCP 라고/EC 하/VV 지/EF ./SF 다리 한쪽을 쩔뚝쩔뚝하는 사람은 절름발이라고 하지.
|
||||
가는 갱기도에서 살다 이게로 이사 왔다. 가/NP 는/JX 갱기도__1/NNG 에서/JKB 살/VV 다/EC 이게__2/NP 로/JKB 이사/NNG 오/VV 었/EP 다/EF ./SF 걔는 경기도에서 살다 여기로 이사 왔다.
|
||||
맨바닥에 들눕지 마라. 맨/XPN 바닥/NNG 에/JKB 들눕/VV-I 지/EC 말/VX 어라/EF ./SF 맨바닥에 드러눕지 마라.
|
||||
그 아지매 성미가 깨끔받아서 그 집에 가 보모 마리에 미검 하나 엄따. 그/MM 아지매__1/NNG 성미/NNG 가/JKS 깨끔받/VV 어서/EC 그/MM 집/NNG 에/JKB 가/VV 어/EC 보/VX 모/EC 마리__3/NNG 에/JKB 미검__1/NNG 하나/NR 엄__1/VA 따/EF ./SF 그 아주머니 성미가 깔끔해서 그 집에 가 보면 마루에 먼지 하나 없다.
|
||||
자가 떤진 돌뻬이가 발끈티이에 널찌 가 발텁뿌리에 시꺼머이 멍이 들었다. 자/NP 가/JKS 떤지/VV ᆫ/ETM 돌뻬이__1/NNG 가/JKS 발끈티이__1/NNG 에/JKB 널찌/VV 어/EC 가/VX 어/EC 발텁뿌리__1/NNG 에/JKB 시꺼멓/VA-I 이/EC 멍/NNG 이/JKS 들/VV 었/EP 다/EF ./SF 쟤가 던진 돌멩이가 발끝에 떨어져 가지고 속발톱에 시꺼멓게 멍이 들었다.
|
||||
요새는 사가 잘 안 보이더라. 요새/MAG 는/JX 사__68/NNG 가/JKS 잘/MAG 안/MAG 보이/VV 더라/EF ./SF 요새는 상어가 잘 안 보이더라.
|
||||
어릴 때 사고를 당해가 쩔록발이가 됐어도 힘 하나는 장사입니더. 어리/VA ᆯ/ETM 때/NNG 사고/NNG 를/JKO 당하/VV 어가/EC 쩔록발이__1/NNG 가/JKC 되/VV 었/EP 어도/EC 힘/NNG 하나/NR 는/JX 장사/NNG 이/VCP ᆸ니더/EF ./SF 어릴 때 사고를 당해서 절름발이가 됐어도 힘 하나는 장사입니다.
|
||||
칼 갈그로 숫둘 좀 찾아 온나. 칼/NNG 갈/VV 그로/EC 숫둘__1/NNG 좀/MAG 찾/VV 어/EC 오/VV ᆫ나/EF ./SF 칼 갈게 숫돌 좀 찾아 오너라.
|
||||
먼 일이 와 이리 많은지 해도 해도 끝이 없다. 먼__2/MM 일/NNG 이/JKS 와/MAG 이리/MAG 많/VA 은지/EC 하/VV 어도/EC 하/VV 어도/EC 끝/NNG 이/JKS 없/VA 다/EF ./SF 무슨 일이 왜 이리 많은지 해도 해도 끝이 없다.
|
||||
아까 아지베님이 다니가싰다. 아까/MAG 아지베님__1/NNG 이/JKS 다니/VV 어/EC 가/VX 시/EP 었/EP 다/EF ./SF 아까 아주버님이 다녀가셨다.
|
||||
옛날에 우리 할무이는 진짜로 꽃가매로 타고 시집왔다 카더라. 옛날/NNG 에/JKB 우리/NP 할무이__1/NNG 는/JX 진짜로/MAG 꽃가매__1/NNG 로/JKO 타/VV 고/EC 시집오/VV 었/EP 다고/EC 하/VV 더라/EF ./SF 옛날에 우리 할머니는 진짜로 꽃가마를 타고 시집왔다 하더라.
|
||||
올 가실에는 우리 어매 보약이나 한 재 딸이 디리마 좋겠심더. 올/MM 가실__5/NNG 에/JKB 는/JX 우리/NP 어매__2/NNG 보약/NNG 이나/JC 한/MM 재/NNB 딸이/VV 어/EC 디리__3/VV 마/EF 좋/VA 겠/EP 심더/EF ./SF 올 가을에는 우리 어머니 보약이나 한 재 달여 드리면 좋겠습니다.
|
||||
니는 우째 잠칭이같이 하루 종일 자노? 니__5/NP 는/JX 우째/MAG 잠칭이__1/NNG 같이/JKB 하루/NNG 종일/NNG 자/VV 노/EF ?/SF 너는 어째 잠꾸러기같이 하루 종일 자니?
|
||||
그케, 내 말도 쪼매 들었이머 좋왔을 긴데. 그케__1/IC ,/SP 나/NP 의/JKG 말/NNG 도/JX 쪼매__1/NNG 들/VV 었/EP 이머/EC 좋/VA 었/EP 을/ETM 기__76/NNB 이/VCP ᆫ데/EF ./SF 그러게, 내 말도 조금 들었으면 좋았을 건데.
|
||||
여그 까시밧을 싹 다 비 뿌맀네. 여그/NP 까시밧__1/NNG 을/JKO 싹/MAG 다/MAG 비__13/VV 어/EC 뿌리/VX 었/EP 네/EF ./SF 여기 가시밭을 모두 다 베어 버렸네.
|
||||
야는 댑대비 개덕시런 짓을 한다. 야/IC 는/JX 댑대비__2/MAG 개덕시럽/VA-I ᆫ/ETM 짓/NNG 을/JKO 하/VV ᆫ다/EF ./SF 얘는 가끔 변덕스러운 짓을 한다.
|
||||
참꽃이 참 삙어서 곱네예. 참꽃/NNG 이/JKS 참/MAG 삙/VA 어서/EC 곱/VA-I 네예/EF ./SF 참꽃이 참 빨개서 곱네요.
|
||||
소화가 안되머 아갈배 말린 거를 차로 마시라. 소화/NNG 가/JKS 안/MAG 되/VV 머/EC 아갈배__1/NNG 말리/VV ᆫ/ETM 거/NNB 를/JKO 차/NNG 로/JKB 마시/VV 라/EF ./SF 소화가 안되면 아가위 말린 것을 차로 마셔라.
|
||||
저 사람은 일 잘하는 땐땐바우라 카더라. 저/MM 사람/NNG 은/JX 일/NNG 잘/MAG 하/XSV 는/ETM 땐땐바우__1/NNG 이/VCP 라고/EC 하/VV 더라/EF ./SF 저 사람은 일 잘하는 차돌이라고 하더라.
|
||||
아들이 눈칭이 잡는다꼬 정시이 없제? 아__23/NNG 들/XSN 이/JKS 눈칭이__1/NNG 잡/VV-R 는다/EF 꼬/VV 정시/NNG 이/VCP 없/VA 제/EF ?/SF 아이들이 송사리 잡는다고 정신이 없지?
|
||||
가마이로 그리 늘석늘석하이 짜모 안 된다. 가마이/NNG 로/JKO 그리/MAG 늘석늘석하__1/VA 이/EC 짜/VV 모/EC 안/MAG 되/VV ᆫ다/EF ./SF 가마니를 그리 늘썽늘썽하게 짜면 안 된다.
|
||||
공빼기 좋아하면 머리 버진다 카드라. 공빼기__1/NNG 좋아하/VV 면/EC 머리/NNG 버지__3/VV ᆫ다고/EC 하/VV 드라/EF ./SF 공짜 좋아하면 머리 벗어진다고 하더라.
|
||||
질거리로 쫓기나 어더박씨매이로 살고 있디더. 질거리__1/NNG 로/JKB 쫓기나__1/VV 어/EC 어더박씨__1/NNG 매이로/JKB 살/VV 고/EC 있/VX 디더/EF ./SF 길거리로 쫓겨나 거지처럼 살고 있습디다.
|
||||
글키 모캐로 피아야 모구가 안 물때제. 글키__1/MAG 모캐__2/NNG 로/JKO 피우/VV 어야/EC 모구__1/NNG 가/JKS 안/MAG 물때/VV 제/EF ./SF 그러게 모깃불을 피워야 모기가 안 물어뜯지.
|
||||
저 사람은 없는 사람들 돈이나 띵구면서 다니는 사람이다. 저/MM 사람/NNG 은/JX 없/VA 는/ETM 사람/NNG 들/XSN 돈/NNG 이나/JX 띵구__1/VV 면서/EC 다니/VV 는/ETM 사람/NNG 이/VCP 다/EF ./SF 저 사람은 없는 사람들 돈이나 떼면서 다니는 사람이다.
|
||||
사가가 와 이리 시구롭노? 사가__15/NNG 가/JKS 와/MAG 이리/MAG 시구롭__1/VA 노/EF ?/SF 사과가 왜 이리 시니?
|
||||
오올 진짜 끌빨이 안 선다. 오올/MAG 진짜/MAG 끌빨__1/NNG 이/JKS 안/MAG 서/VV ᆫ다/EF ./SF 오늘 진짜 끗발이 안 선다.
|
||||
세상에는 날고띠는 놈이 많으니까 항상 자만하모 안 덴다. 세상/NNG 에/JKB 는/JX 날고띠__1/VV 는/ETM 놈/NNB 이/JKS 많/VA 으니까/EC 항상/MAG 자만/NNG 하/XSV 모/EC 안/MAG 데__5/VV ᆫ다/EF ./SF 세상에는 날고뛰는 놈이 많으니까 항상 자만하면 안 된다.
|
||||
가는 간띵이가 커가 잘해 낼 기야. 가/NP 는/JX 간띵이__1/NNG 가/JKS 크/VA 어가/EC 잘/MAG 하/VV 어/EC 내/VX ᆯ/ETM 기__76/NNB 이/VCP 야/EF ./SF 걔는 간덩이가 커서 잘해 낼 거야.
|
||||
저기 창고에 가가 수굼파 좀 가온니라. 저기/NP 창고/NNG 에/JKB 가/VV 어가/EC 수굼파__1/NNG 좀/MAG 가오/VV ᆫ니라/EF ./SF 저기 창고에 가서 삽 좀 가져오너라.
|
||||
나무에 송치이가 억수로 많다. 나무/NNG 에/JKB 송치이__1/NNG 가/JKS 억수로__1/MAG 많/VA 다/EF ./SF 나무에 송충이가 대단히 많다.
|
||||
우리 언니는 밥쟁이라서 밥 없으모 몬 산다. 우리/NP 언니/NNG 는/JX 밥쟁이__3/NNG 이/VCP 라서/EC 밥/NNG 없/VA 으모/EC 몬__3/MAG 살/VV ᆫ다/EF ./SF 우리 언니는 밥보라서 밥 없으면 못 산다.
|
||||
요 아래 모팅 돌아가민 마실이 또 하나 있거덩요. 요/MM 아래/NNG 모팅__1/NNG 돌/VV 어/EC 가/VX 민/EC 마실__2/NNG 이/JKS 또/MAG 하나/NR 있/VA 거덩요/EF ./SF 요 아래 모퉁이 돌아가면 마을이 또 하나 있거든요.
|
||||
아부지, 벨고 없이 잘 지내시지예? 아부지__2/NNG ,/SP 벨고__1/NNG 없이/MAG 잘/MAG 지내/VV 시/EP 지예/EF ?/SF 아버지, 별고 없이 잘 지내시지요?
|
||||
날이 덥으면 덥을씨록 매렁이 소리도 시끄럽어. 날/NNG 이/JKS 덥/VA-I 으면/EC 덥/VA-I 을씨록/EC 매렁이__1/NNG 소리/NNG 도/JX 시끄럽/VA-I 어/EF ./SF 날이 더우면 더울수록 매미 소리도 시끄러워.
|
||||
솥띠빙이가 너무 무겁어서 한 손으로 들지를 못하겄다. 솥띠빙이__1/NNG 가/JKS 너무/MAG 무겁/VA-I 어서/EC 한/MM 손/NNG 으로/JKB 들/VV 지/EC 를/JX 못/MAG 하/VV 겄/EP 다/EF ./SF 솥뚜껑이 너무 무거워서 한 손으로 들지를 못하겠다.
|
||||
쌀이 모자라니까네 보리고 수시고 갈조고 암 잡곡이나 섞아가 밥을 지았지. 쌀/NNG 이/JKS 모자라/VV 니까네/EC 보리/NNG 이/VCP 고/EC 수시__1/NNG 이/VCP 고/EC 갈조__2/NNG 이/VCP 고/EC 암__18/MM 잡곡/NNG 이나/JX 섞/VV 어가/EC 밥/NNG 을/JKO 짓/VV-I 었/EP 지/EF ./SF 쌀이 모자라니까 보리며 수수고 메조고 아무 잡곡이나 섞어서 밥을 지었지.
|
||||
애들이 사방을 어지레 놓은 걸 보면요, 엄청 부얘가 나니더. 애/NNG 들/XSN 이/JKS 사방/NNG 을/JKO 어지럽/VA 어/EC 놓/VV 은/ETM 거/NNB ᆯ/JKO 보/VV 면/EC 요/JX ,/SP 엄청/MAG 부얘__1/NNG 가/JKS 나/VV 니더/EF ./SF 애들이 사방을 어지럽혀 놓은 걸 보면요, 엄청 부아가 납니다.
|
||||
가는 얼굴에 까막딱지가 한 소쿠리나 있다. 가/NP 는/JX 얼굴/NNG 에/JKB 까막딱지/NNG 가/JKS 한/MM 소쿠리/NNG 나/JX 있/VV 다/EF ./SF 그 아이는 얼굴에 주근깨가 한 소쿠리나 있다.
|
||||
꼼도둑이 들어서 빼다미에 있던 내 시계로 훔치 가 삐맀다. 꼼도둑__1/NNG 이/JKS 들/VV 어서/EC 빼다미__1/NNG 에/JKB 있/VV 던/ETM 나/NP 의/JKG 시계/NNG 로/JKO 훔치/VV 어/EC 가/VX 어/EC 삐리/VX 었/EP 다/EF ./SF 좀도둑이 들어서 서랍에 있던 내 시계를 훔쳐 가 버렸다.
|
||||
그는 아부지를 닮아가 얼굴이 똘방하다. 그/NP 는/JX 아부지__2/NNG 를/JKO 닮/VV 어가/EC 얼굴/NNG 이/JKS 똘방하__1/VA 다/EF ./SF 그는 아버지를 닮아서 얼굴이 동그스름하다.
|
||||
어무이, 뻬떼기가 까덜까덜한 기 얼쭉 다 말랐네예. 어무이__2/NNG ,/SP 뻬떼기__1/NNG 가/JKS 까덜까덜__1/MAG 한/MM 기__76/NNB 이/JKS 얼쭉__1/MAG 다/MAG 마르/VV 었/EP 네예/EF ./SF 어머니, 절간고구마가 가닥가닥한 게 얼추 다 말랐네요.
|
||||
올개는 가뭄살 때미로 고우매 농사를 망치 삐맀어요. 올개__1/NNG 는/JX 가뭄살__1/NNG 때미/NNB 로/JKB 고우매__1/NNG 농사/NNG 를/JKO 망치/VV 어/EC 삐리/VX 었/EP 어요/EF ./SF 올해는 가뭄 때문에 고구마 농사를 망쳐 버렸어요.
|
||||
비빔 양님 우에다 깨솜을 솔솔 뿌리 넣어야 꼬소롬하이 맛이 나제. 비빔/NNG 양님__1/NNG 우/NNG 에다/JKB 깨솜__1/NNG 을/JKO 솔솔/MAG 뿌리/VV 어/EC 넣/VV 어야/EC 꼬소롬하__1/VA 이/EC 맛/NNG 이/JKS 나/VV 제/EF ./SF 비빔 양념 위에다 깨소금을 솔솔 뿌려 넣어야 고소하게 맛이 나지.
|
||||
가는 얼굴에 까막단지가 억시 많다. 가/NP 는/JX 얼굴/NNG 에/JKB 까막단지__1/NNG 가/JKS 억시__1/MAG 많/VA 다/EF ./SF 걔는 얼굴에 주근깨가 매우 많다.
|
||||
발을 잘못 디디서 수부렁에 빠지 가 신하고 옷이 엉망이 뎄다. 발/NNG 을/JKO 잘못/MAG 디디/VV 어서/EC 수부렁__1/NNG 에/JKB 빠지/VV 어/EC 가/VX 어/EC 신/NNG 하고/JKB 옷/NNG 이/JKS 엉망/NNG 이/JKS 데__5/VV 었/EP 다/EF ./SF 발을 잘못 디뎌서 수렁에 빠져 가지고 신하고 옷이 엉망이 됐다.
|
||||
아매이 맛도 모르고 묵었을 기다. 아매이__1/MAG 맛/NNG 도/JX 모르/VV 고/EC 묵__4/VV 었/EP 을/ETM 기__76/NNB 이/VCP 다/EF ./SF 아마 맛도 모르고 먹었을 것이다.
|
||||
나도 살고 한 개만 도. 나/NP 도/JX 살고__2/NNG 한/MM 개/NNB 만/JX 달/VV 오/EC ./SF 나도 살구 한 개만 줘.
|
||||
시냇가에 놀러가인께 자래가 한 마리 있어. 시냇가/NNG 에/JKB 놀/VV 러/EC 가/VV 인께/EC 자래__6/NNG 가/JKS 한/MM 마리/NNB 있/VV 어/EF ./SF 시냇가에 놀러가니까 자라가 한 마리 있어.
|
||||
병따까리로 잘 닫아 놔라. 병따까리__1/NNG 로/JKO 잘/MAG 닫/VV-R 어/EC 놓/VX 어라/EF ./SF 병뚜껑을 잘 닫아 놔라.
|
||||
달들 솔괭이가 안 물어 가그로 잘 살피라. 달__15/NNG 들/XSN 솔괭이__1/NNG 가/JKS 안/MAG 물/VV 어/EC 가/VX 그로/EC 잘/MAG 살피/VV 어라/EF ./SF 닭들 솔개가 안 물어 가게 잘 살펴라.
|
||||
나를 만이나 먹고도 그라고 있나. 나/NP 를/JKO 만/NR 이나/JX 먹/VV 고/EC 도/JX 그라/VV 고/EC 있/VX 나/EF ./SF 나이를 마흔이나 먹고도 그러고 있니.
|
||||
야야, 헝겊대이 좀 가온나. 야/NP 야/JKV ,/SP 헝겊대이__1/NNG 좀/MAG 가오/VV ᆫ나/EF ./SF 얘야, 헝겊 좀 가져오너라.
|
||||
꼬치친구끼리 숨길 기 머가 있노? 꼬치친구__1/NNG 끼리/XSN 숨기/VV ᆯ/ETM 기__76/NNB 이/JKS 머/NP 가/JKS 있/VV 노/EF ?/SF 불알친구끼리 숨길 것이 뭐가 있냐?
|
||||
딸아가 우째 가구쟁이를 떡 벌리고 앉아 있노? 딸아__1/NNG 가/JKS 우째/MAG 가구쟁이__1/NNG 를/JKO 떡/MAG 벌리/VV 고/EC 앉/VV 어/EC 있/VX 노/EF ?/SF 계집아이가 어째 가랑이를 떡 벌리고 앉아 있니?
|
||||
에린 기 어데서 눈을 더부렁거림서 어른한테 달기드노? 에리/VA ᆫ/ETM 기__76/NNB 이/JKS 어데__2/NP 서/JKB 눈/NNG 을/JKO 더부렁__1/MAG 거리/VV ᆷ서/EC 어른/NNG 한테/JKB 달기들/VV 노/EF ?/SF 어린 게 어디서 눈을 뒤룩거리면서 어른한테 달려드느냐?
|
||||
그 일은 아무 부도 엄껬구마는 와 한다 카노? 그/MM 일/NNG 은/JX 아무/MM 부__40/NNG 도/JX 엄__1/VA 껬/EP 구마는/EC 와/MAG 하/VV ᆫ다고/EC 하/VV 노/EF ?/SF 그 일은 아무 부수입도 없겠구만 왜 한다고 하니?
|
||||
안주 9월 초순인데 벌시러 선드거리하다. 안주__1/MAG 9/SN 월/NNB 초순/NNG 이/VCP ᆫ데/EC 벌시러__1/MAG 선드거리하__1/VA 다/EF ./SF 아직 9월 초순인데 벌써 선득하다.
|
||||
그 아재는 키가 껑충하기 커서 사램이 마이 모이 있어도 대벤에 알 수 있었어. 그/MM 아재/NNG 는/JX 키/NNG 가/JKS 껑충/XR 하/XSA 기/EC 크/VA 어서/EC 사램__1/NNG 이/JKS 마이__1/MAG 모이/VV 어/EC 있/VX 어도/EC 대벤에__1/MAG 알/VV ᆯ/ETM 수/NNB 있/VA 었/EP 어/EF ./SF 그 아재는 키가 껑충하게 커서 사람이 많이 모여 있어도 대번에 알 수 있었어.
|
||||
얼굴이 엄청 싸납게 생깄네. 얼굴/NNG 이/JKS 엄청/MAG 싸납__1/VA-I 게/EC 생깄네/NNG ./SF 얼굴이 매우 사납게 생겼네.
|
||||
손목때기가 아파가 아무것도 몬하고 이라고 있다. 손목때기__1/NNG 가/JKS 아프/VA 어가/EC 아무것/NNG 도/JX 몬하__1/VA 고/EC 이라__1/VV 고/EC 있/VX 다/EF ./SF 손모가지가 아파서 아무것도 못하고 이러고 있다.
|
||||
날이 덥은께네 천지에 파래이알이 실어 뿠네. 날/NNG 이/JKS 덥/VA-I 은께네/EC 천지/NNG 에/JKB 파래이알__1/NNG 이/NNG 실__4/VV 어/EC 뿌/VX 었/EP 네/EF ./SF 날이 더우니까 천지에 쉬가 슬어 버렸네.
|
||||
가는 눈굴떼기라서 눈이 굵고 예쁘대이. 가/NP 는/JX 눈굴떼기/NNG 이/VCP 라서/EC 눈/NNG 이/JKS 굵/VA 고/EC 예쁘/VA 대이/EF ./SF 걔는 눈이 큰 사람이라서 눈이 굵고 예쁘다.
|
||||
자꼬 소디빙이 열어 싸면 고기가 잘 안 익는대이. 자꼬__1/MAG 소디빙이__1/NNG 열/VV 어/EC 싸/VV 면/EC 고기/NNG 가/JKS 잘/MAG 안/MAG 익/VV 는대이/EF ./SF 자꾸 소댕 열어 대면 고기가 잘 안 익는다.
|
||||
글마 에상 안 갚은 기 안죽 남았드나? 그/MM 놈/NNG 아__23/NNG 에상__1/NNG 안/MAG 갚/VV 은/ETM 기__76/NNB 이/JKS 안죽__1/MAG 남/VV 었/EP 드나/EF ?/SF 그놈 외상 안 갚은 것이 아직 남았더냐?
|
||||
저짜 깻단 똥가리 서 있는 데가 우리 논이라예. 저짜__1/NP 깻단__2/NNG 똥가리__2/NNG 서/VV 어/EC 있/VX 는/ETM 데/NNB 가/JKS 우리/NP 논/NNG 이/JKS 라예/EF ./SF 저쪽 볏단 동가리 서 있는 데가 우리 논이에요.
|
||||
텃간에 가가 못하고 장도리 쫌 갖고 오이라. 텃간__1/NNG 에/JKB 가/VV 어가/EC 못/NNG 하고/JC 장도리/NNG 쫌/MAG 갖/VV 고/EC 오/VX 이라/EF ./SF 헛간에 가서 못하고 장도리 좀 갖고 오너라.
|
||||
기운 없일 때는 소꼬래이가 체고 아이가? 기운/NNG 없/VA 을/ETM 때/NNG 는/JX 소꼬래이/NNG 가/JKS 체고/NNG 아이__1/VA 가/EF ?/SF 기운 없을 때는 쇠꼬리가 최고 아니니?
|
||||
저 집은 밤에 기신 나오까 싶어가 무섭어예. 저/MM 집/NNG 은/JX 밤/NNG 에/JKB 기신__10/NNG 나오/VV 까/EF 싶/VX 어가/EC 무섭/VA-I 어예/EF ./SF 저 집은 밤에 귀신 나올까 싶어서 무서워요.
|
||||
소가 남으 곡석을 자꼬 뜯어 먹으께네 소꼬삐를 잘 잡고 가야 합니더. 소/NNG 가/JKS 남/NNG 으/JKG 곡석__1/NNG 을/JKO 자꼬__1/MAG 뜯/VV-R 어/EC 먹/VV 으께네/EC 소꼬삐__1/NNG 를/JKO 잘/MAG 잡/VV-R 고/EC 가/VV 어야/EC 하/VX ᆸ니더/EF ./SF 소가 남의 곡식을 자꾸 뜯어 먹으니까 소고삐를 잘 잡고 가야 합니다.
|
||||
구불어댕기지 말고 섰거라. 구불어댕기/VV 지/EC 말/VX 고/EC 서/VV 었/EP 거라/EF ./SF
|
||||
콩깍데이는 잘 말라가 불 때머 잘 타지. 콩깍데이__1/NNG 는/JX 잘/MAG 말리/VV 어가/EC 불/NNG 때/VV 머/EC 잘/MAG 타/VV 지/EF ./SF 콩깍지는 잘 말려서 불 때면 잘 타지.
|
||||
여 시숫대가 없네? 여/MM 시숫대__1/NNG 가/JKS 없/VA 네/EF ?/SF 여기 세숫대야가 없네?
|
||||
나도 돈에 한번 안 깝체고 살아 봤이머 좋겠다. 나/NP 도/JX 돈/NNG 에/JKB 한/MM 번/NNB 안/MAG 깝체__1/VV 고/EC 살/VV 어/EC 보/VX 었/EP 이머/EC 좋/VA 겠/EP 다/EF ./SF 나도 돈에 한번 안 쪼들리고 살아 봤으면 좋겠다.
|
||||
잘몬한 사람이 데시 썽을 내모 데나? 잘몬__1/NNG 하/XSV ᆫ/ETM 사람/NNG 이/JKS 데시__3/MAG 썽__1/NNG 을/JKO 내/VV 모/EC 데__5/VV 나/EC ?/SF 잘못한 사람이 도리어 성을 내면 되니?
|
||||
비가 안 와 가 논이 배짝 말랐네. 비/NNG 가/JKS 안/MAG 오/VV 어가/EC 논/NNG 이/JKS 배짝__2/MAG 마르/VV 었/EP 네/EF ./SF 비가 안 와 가지고 논이 바짝 말랐네.
|
||||
그놈이 얼매나 말을 안 듣고 고랑때를 믹이는지 골치가 아푸다. 그놈/NP 이/JKS 얼매나__1/MAG 말/NNG 을/JKO 안/MAG 듣/VV-I 고/EC 고랑때__1/NNG 를/JKO 믹이__1/VV 는지/EC 골치/NNG 가/JKS 아푸/VA 다/EF ./SF 그놈이 얼마나 말을 안 듣고 골탕을 먹이는지 골치가 아프다.
|
||||
두 손을 게드랑에 찌고 버팅기고 서 있니더. 두/MM 손/NNG 을/JKO 게드랑__1/NNG 에/JKB 찌__12/VV 고/EC 버팅기__1/VV 고/EC 서/VV 어/EC 있/VX 니더/EF ./SF 두 손을 겨드랑에 끼고 버티고 서 있습니다.
|
||||
가슬에 기염을 따서 항아리에 여서 저울 내내 삭화요. 가슬__1/NNG 에/JKB 기염__3/NNG 을/JKO 따/VV 어서/EC 항아리/NNG 에/JKB 이/VV 어서/EC 저울__4/NNG 내내/MAG 삭후__1/VV 어요/EF ./SF 가을에 고욤을 따서 항아리에 넣어서 겨울 내내 삭혀요.
|
||||
야야, 내일은 칩다 캉께네 옷을 땁뚜시리 챙기 입고 가거라. 야/NP 야/JKV ,/SP 내일/NNG 은/JX 칩__1/VA-I 다고/EC 하/VV ᆼ께네/EC 옷/NNG 을/JKO 땁뚜시리__1/MAG 챙기/VV 어/EC 입/VV-R 고/EC 가/VV 거라/EF ./SF 얘야, 내일은 춥다고 하니까 옷을 따뜻이 챙겨 입고 가거라.
|
||||
동네 얼라들이 빵께살이를 한다고 정신이 없다. 동네/NNG 얼라__1/NNG 들/XSN 이/JKS 빵께살이__1/NNG 를/JKO 하/VV ᆫ다고/EC 정신/NNG 이/JKS 없/VA 다/EF ./SF 동네 어린아이들이 소꿉놀이를 한다고 정신이 없다.
|
||||
개구영바치를 줏어다 키았다. 개구영바치__1/NNG 를/JKO 줏/VV-R 어다/EC 키우/VV 었/EP 다/EF ./SF 개구멍받이를 주워다 키웠다.
|
||||
옷감이 꼭 세터리맨치로 까실까실하네예. 옷감/NNG 이/JKS 꼭/MAG 세터리__1/NNG 맨치로/JKB 까실까실/MAG 하/XSA 네/EF 예/JX ./SF 옷감이 꼭 쇠털처럼 까슬까슬하네요.
|
||||
덜 익은 애애초는 새그랍다. 덜/MAG 익/VV 은/ETM 애애초__1/NNG 는/JX 새그랍__2/VA 다/EF ./SF 덜 익은 자두는 시다.
|
||||
솥뜨벵이가 깨지서 솥을 몬 쓰게 생깄네. 솥뜨벵이__1/NNG 가/JKS 깨지/VV 어서/EC 솥/NNG 을/JKO 몬__3/MAG 쓰/VV 게/EC 생기/VV 었/EP 네/EF ./SF 솥뚜껑이 깨져서 솥을 못 쓰게 생겼네.
|
||||
집 안에 밥 짓는 냄새가 상그리하다. 집/NNG 안/NNG 에/JKB 밥/NNG 짓/VV-I 는/ETM 냄새/NNG 가/JKS 상그리/XR 하/XSA 다/EF ./SF 집 안에 밥 짓는 냄새가 향긋하다.
|
||||
껌은 내일 다시 씹그러 벼르빡에 붙여 두어래이. 껌/NNG 은/JX 내일/NNG 다시/MAG 씹/VV-R 그러/EC 벼르빡__1/NNG 에/JKB 붙이/VV 어/EC 두/VX 어래이/EF ./SF 껌은 내일 다시 씹게 벽에 붙여 두어라.
|
||||
어릴 적에 동네 아들하고 꼬랑대기잡기로 마이 하고 놀았제. 어리/VA ᆯ/ETM 적/NNB 에/JKB 동네/NNG 아__23/NNG 들/XSN 하고/JKB 꼬랑대기잡기__1/NNG 로/JKO 마이__1/MAG 하/VV 고/EC 놀/VV 었/EP 제/EF ./SF 어릴 적에 동네 아이들하고 꼬리잡기를 많이 하고 놀았지.
|
||||
메칠 잠을 잘 몬 자서 그런지 얼굴이 꺼치리하다. 메칠__1/NNG 잠/NNG 을/JKO 잘/MAG 몬__3/MAG 자/VV 어서/EC 그렇/VA-I ᆫ지/EC 얼굴/NNG 이/JKS 꺼치리하__1/VA 다/EF ./SF 며칠 잠을 잘 못 자서 그런지 얼굴이 꺼칠하다.
|
||||
급한 대로 바닥에다가 글씨로 싰다. 급하/VA ᆫ/ETM 대로/NNB 바닥/NNG 에다가/JKB 글씨/NNG 로/JKO 시__4/VV 었/EP 다/EF ./SF 급한 대로 바닥에다가 글씨를 썼다.
|
||||
논일 매제기 잘하고 온나. 논/NNG 일/NNG 매제기__1/NNG 잘/MAG 하/XSV 고/EC 오/VV ᆫ나/EF ./SF 논일 마무리 잘하고 오너라.
|
||||
가시나로 우예 냄비처매만 입히가 키우노? 가시나/NNG 로/JKO 우예__1/MAG 냄비처매__1/NNG 만/JX 입히/VV 어가/EC 키우/VV 노/EF ?/SF 계집애를 어찌 홑치마만 입혀서 키우니?
|
||||
노리에 펜하기 살라 카모 젊을 때 아금바리기 살림을 해야 덴다. 노리__10/NNG 에/JKB 펜하__1/VA 기/EC 살/VV ᆯ라고/EC 하/VV 모/EC 젊/VA 을/ETM 때/NNG 아금바리__1/VA-R 기/EC 살림/NNG 을/JKO 하/VV 어야/EC 데__4/VV ᆫ다/EF ./SF 노래에 편하게 살려고 하면 젊을 때 아금받게 살림을 해야 된다.
|
||||
더부에 메칠 동안 씨달키더마 몰골이 억수로 안 좋네. 더부__2/NNG 에/JKB 메칠__1/NNG 동안/NNG 씨달키__1/VV 더마/EC 몰골/NNG 이/JKS 억수로__1/MAG 안/MAG 좋/VA 네/EF ./SF 더위에 며칠 동안 시달리더니 몰골이 대단히 안 좋네.
|
||||
요 앞에 가서 생갱 좀 사 온나. 요/MM 앞/NNG 에/JKB 가/VV 어서/EC 생갱__1/NNG 좀/MAG 사/VV 어/EC 오/VX ᆫ나/EF ./SF 요 앞에 가서 생강 좀 사 오너라.
|
||||
야가 키는 쪼맨해도 다구지서 넘한테 몸삼은 안 진다. 야/NP 가/JKS 키/NNG 는/JX 쪼맨하__1/VA 어도/EC 다구지__1/VA 어서/EC 넘__2/NNG 한테/JKB 몸삼__1/NNG 은/JX 안/MAG 지/VV ᆫ다/EF ./SF 얘가 키는 조그마해도 다부져서 남한테 몸싸움은 안 진다.
|
||||
고방 앞에 서 있이모 일꾼들이 나락섬을 딜놓을 때 걸거칭께네 한젙으로 비끼서라. 고방/NNG 앞/NNG 에/JKB 서/VV 어/EC 있/VX 으모/EC 일/NNG 꾼/XSN 들/XSN 이/JKS 나락섬__1/NNG 을/JKO 딜놓__1/VV 을/ETM 때/NNG 걸거치__1/VV ᆼ께네/EC 한젙__1/NNG 으로/JKB 비끼서__1/VV 어라/EF ./SF 고방 앞에 서 있으면 일꾼들이 볏섬을 들여놓을 때 거치적거리니까 한옆으로 비켜서라.
|
||||
마리가 삐그덕거리이 틈에다 보적을 찡가라. 마리__3/NNG 가/JKS 삐그덕/MAG 거리/XSV 이/EC 틈/NNG 에다/JKB 보적__1/NNG 을/JKO 찡구__1/VV 어라/EF ./SF 마루가 삐그덕거리니 틈에다 빔을 끼워라.
|
||||
양말도 다 집고 한 째기밖에 안 남았다. 양말/NNG 도/JX 다/MAG 집__5/VV-I 고/EC 한/MM 째기__1/NNG 밖에/JX 안/MAG 남/VV 었/EP 다/EF ./SF 양말도 다 깁고 한 짝밖에 안 남았다.
|
||||
가는 말하는 기 미까리시럽다. 가/NP 는/JX 말/NNG 하/XSV 는/ETM 기__2/NNG 미까리시럽__1/VA-I 다/EF ./SF 걔는 말하는 게 밉살스럽다.
|
||||
닼 자묵고 오리발 니민다 카디이 니가 딱 그렇네. 닼__1/NNG 자묵__1/VV 고/EC 오리발/NNG 니밀__1/VV ᆫ다고/EC 하/VV 디이/EC 니/NP 가/JKS 딱/MAG 그렇/VA-I 네/EF ./SF 닭 잡아먹고 오리발 내민다 하더니 네가 딱 그렇네.
|
||||
고놈 참 부랑타. 고놈/NP 참/MAG 부랑/NNG 하/XSA 다/EF ./SF 그놈 참 사납다.
|
||||
가는 허리가 짤룩허리라가 멀 입어도 태가 난다 아이가. 가/NP 는/JX 허리/NNG 가/JKS 짤룩허리__1/NNG 라가/EC 머/NP ᆯ/JKO 입/VV-R 어도/EC 태/NNG 가/JKS 나/VV ᆫ다/EC 아이/VCN 가/EF ./SF 걔는 허리가 잔허리라서 뭘 입어도 태가 나잖아.
|
||||
어데서 쑥앵구가 한 마리 집에 들어왔노? 어데__2/NP 서/JKB 쑥앵구__1/NNG 가/JKS 한/MM 마리/NNB 집/NNG 에/JKB 들어오/VV 었/EP 노/EF ?/SF 어디서 수고양이가 한 마리 집에 들어왔니?
|
||||
너그 집 개는 쑥거가? 너그__1/NP 집/NNG 개/NNG 는/JX 쑥거__1/NNG 이/VCP 가/EF ?/SF 너희 집 개는 수컷이니?
|
||||
쫑마리가 태나기 전에는 여서 안 살았었지. 쫑마리__1/NNG 가/JKS 태나__1/VV 기/ETN 전/NNG 에/JKB 는/JX 여/NP 서/JKB 안/MAG 살/VV 었었/EP 지/EF ./SF 막내가 태어나기 전에는 여기서 살지 않았었지.
|
||||
오늘 지녁은 쏭이 볶아서 묵자. 오늘/NNG 지녁__1/NNG 은/JX 쏭이__1/NNG 볶/VV 어서/EC 묵__4/VV 자/EF ./SF 오늘 저녁은 송이 볶아서 먹자.
|
||||
그 사람은 뿔툭골이 있어 탈이다. 그/MM 사람/NNG 은/JX 뿔툭골__1/NNG 이/JKS 있/VV 어/EC 탈/NNG 이/VCP 다/EF ./SF 그 사람은 불뚝성이 있어 탈이다.
|
||||
니캉 내캉 어불러가 사가 한 상자를 사자. 니__5/NP 캉/JC 나/NP 캉/JC 어부르__1/VV 어가/EC 사가__15/NNG 한/MM 상자/NNG 를/JKO 사/VV 자/EF ./SF 너랑 나랑 어울러서 사과 한 상자를 사자.
|
||||
머가 그리 불만이라가 소바알 툭툭 집어 던지고 앉아 있노? 머/NP 가/JKS 그리/MAG 불만/NNG 이/VCP 라가/EC 소바알__1/NNG 툭툭/MAG 집/VV-R 어/EC 던지/VV 고/EC 앉/VV 어/EC 있/VX 노/EF ?/SF 머가 그리 불만이라서 솔방울 툭툭 집어 던지고 앉아 있냐?
|
||||
우리 할배는 새복부텀 한밤중꺼정 꼼방대로 입에 물고 살았지예. 우리/NP 할배__1/NNG 는/JX 새복__1/NNG 부텀/JX 한/XPN 밤중/NNG 꺼정/JX 꼼방대__1/NNG 로/JKO 입/NNG 에/JKB 물/VV 고/EC 살/VV 었/EP 지/EF 예/JX ./SF 우리 할아버지는 새벽부터 한밤중까지 곰방대를 입에 물고 살았지요.
|
||||
손꺼시럼이 생기서 엄청시리 아퍼예. 손꺼시럼__1/NNG 이/JKS 생기/VV 어서/EC 엄청시리__1/MAG 아프/VA 어/EF 예/JX ./SF 손거스러미가 생겨서 엄청스레 아파요.
|
||||
이 길은 십 년 전이나 지금이나 벤암엄시 참 좋다, 그자? 이/MM 길/NNG 은/JX 십/NR 년/NNB 전/NNG 이나/JC 지금/NNG 이나/JX 벤암엄시__1/MAG 참/MAG 좋/VA 다/EC ,/SP 그자__3/IC ?/SF 이 길은 십 년 전이나 지금이나 변함없이 참 좋다, 그렇지?
|
||||
고싸리는 산으로 짚이 드가야 마이 있니더. 고싸리__1/NNG 는/JX 산/NNG 으로/JKB 짚이__1/NNG 드가__1/VV 어야/EC 마이__1/MAG 있/VA 니더/EF ./SF 고사리는 산으로 깊이 들어가야 많이 있습니다.
|
||||
노래를 밤새 불러 쌓아 갖고 아침에 일나니까 목이 콱 메친 기라. 노래/NNG 를/JKO 밤새/NNG 부르/VV 어/EC 쌓/VX 어/EC 갖/VX 고/EC 아침/NNG 에/JKB 일나__1/VV 니까/EC 목/NNG 이/JKS 콱/MAG 메치__2/VV ᆫ/ETM 기__76/NNB 이/VCP 라/EF ./SF 노래를 밤새 불러 대서 아침에 일어나니까 목이 콱 멘 것이야.
|
||||
어무이가 니 때무레 억수로 썽났다. 어무이__2/NNG 가/JKS 니__5/NP 때문/NNB 에/JKB 억수로__1/MAG 썽__1/NNG 나/VV 었/EP 다/EF ./SF 어머니가 너 때문에 대단히 성났다.
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
네 동미덜으느 어띠 다 밉은양하냐? 너/NP 의/JKG 동미__1/NNG 덜/XSN 으느/JX 어띠__1/MAG 다/MAG 밉은양하__1/VA-I 냐/EF ?/SF 네 동무들은 어찌 다 밉살스럽냐?
|
||||
붕어 홰가 화어 홰두 맛잇구 잉에두 홰를 맨들어 먹으무 맛이 잇습지. 붕어/NNG 홰/NNG 가/JKS 화어/NNG 홰/NNG 두/JC 맛있/VA 구/EC 잉에__2/NNG 두/JC 홰/NNG 를/JKO 맨들/VV 어/EC 먹/VV 으무/EC 맛/NNG 이/JKS 있/VV 습지/EF ./SF 붕어 회와 황어 회도 맛있고 잉어도 회를 만들어 먹으면 맛이 있지요.
|
||||
내 애끼두 헴우 잘 쳇습구마. 나/NP 의/JKG 애끼/NNG 도/JX 헴__6/NNG 우/JKO 잘/MAG 치/VV 엇/EP 습구마/EF ./SF 내 동생도 헤엄을 잘 쳤습니다.
|
||||
올채이 크무 메그락지 댑구마. 올채이__1/NNG 이/JKS 크/VV 무/EC 메그락지__1/NNG 이/JKC 대__22/VV ᆸ구마/EF ./SF 올챙이가 크면 개구리가 됩니다.
|
||||
이 짐이사 개가웁구 기래니 내 들구 가갯소. 이/MM 짐/NNG 이사/JX 개가웁__1/VA-I 구/EC 기렇/VA-I 어/EC 나/NP 이/JKS 들/VV 구/EC 가/VV 갯/EP 소/EC ./SF 이 짐이야 가볍고 그러니 내가 들고 가겠소.
|
||||
가비 얼매나 섧은지 나날이 웁구마. 가비__5/NNG 얼매나__1/MAG 섧/VA 은지/EC 나날이/MAG 울/VV ᆸ구마/EF ./SF 과부가 얼마나 설운지 나날이 웁니다.
|
||||
그거 어띃게 먹슴까? 그거/NP 어띃게__1/MAG 먹/VV 슴까/EF ?/SF 그거 어찌 먹습니까? 그거/NP 어찌/MAG 먹/VV 습니까/EF ?/SF
|
||||
영게 옥시끼 많이 있소. 영게__1/NP 옥시끼__1/NNG 이/JKS 많이/MAG 있/VA 소/EC ./SF 여기 옥수수가 많이 있소. 여기/NP 옥수수/NNG 가/JKS 많이/MAG 있/VV 소/EC ./SF
|
||||
아덜이 디렵다 달아간다. 아__23/NNG 덜/XSN 이/JKS 디렵다__1/MAG 달아가/VV ᆫ다/EF ./SF 아이들이 들입다 달려간다.
|
||||
아덜으느 꼼치울래기하구 놀다 나니 저골고롬이 잘 떨어디대니우? 아__23/NNG 덜/XSN 으느/JX 꼼치울래기/NNG 하/XSV 구/EC 놀/VV 다/EC 나/VX 니/EC 저골고롬/NNG 이/JKS 잘/MAG 떨어디/VV 디/EC 애니__1/VX 우/EF ?/SF 아이들은 숨바꼭질하고 놀다 보니 옷고름이 잘 떨어지지 않소?
|
||||
그 동미 간대사 나르 얼렛갯슴둥? 그/MM 동미__1/NNG 간대사__1/MAG 나/NP 르/JKO 얼리__9/VV 엇/EP 갯/EP 슴둥/EF ?/SF 그 동무가 설마 나를 속였겠습니까?
|
||||
지끔꺼지두 샐르 짐스으 잡소. 지끔__2/NNG 꺼지/JX 두/JX 새__26/NNG ᆯ르/JKB 짐스__1/NNG 으/JKO 잡/VV-R 소/EC ./SF 지금까지도 올가미로 짐승을 잡소.
|
||||
가꼴막에 낭그들이 가뜩하다. 가꼴막__1/NNG 에/JKB 낭그__1/NNG 들/XSN 이/JKS 가뜩/MAG 하/XSA 다/EF ./SF 언덕바지에 나무들이 가득하다.
|
||||
뇰으 주무 달기 닭으덩때에서 네레와서 인차 먹습구마. 뇰__1/NNG 으/JKO 주/VV 무/EC 달기__1/NNG 이/JKS 닭으덩때__1/NNG 에서/JKB 네리/VV 어/EC 오/VX 어서/EC 인차/MAG 먹/VV 습구마/EF ./SF 모이를 주면 닭이 홰에서 내려와서 이내 먹습니다.
|
||||
어제께 개굴에서 괴기잽이를 해 가미 놀앗습구마. 어제께/MAG 개굴/NNG 에서/JKB 괴기잽이__1/NNG 를/JKO 하/VV 어/EC 가/VX 미/EC 놀/VV 엇/EP 습구마/EF ./SF 어저께 개울에서 고기잡이를 해 가며 놀았습니다.
|
||||
할기 좋대니무 농새 잘 아이 뎁구마. 할기__2/NNG 이/JKS 좋/VA 디/EC 애니__1/VX 무/EC 농새/NNG 이/JKS 잘/MAG 아이__12/MAG 데__5/VV ᆸ구마/EF ./SF 흙이 좋지 않으면 농사가 잘 안 됩니다.
|
||||
저 동미느 제깍하무 다배집구마. 저/MM 동미__1/NNG 느/JX 제깍하무__1/MAG 다배지__3/VV ᆸ구마/EF ./SF 저 동무는 걸핏하면 자빠집니다.
|
||||
해르 바라본다구 하는 그 꽂이 바루 해가부리지. 해/NNG 르/JKO 바라보/VV ᆫ다구/EC 하/VV 는/ETM 그/MM 꽂__1/NNG 이/JKS 바루/MAG 해가부리__1/NNG 이/VCP 지/EF ./SF 해를 바라본다고 하는 그 꽃이 바로 해바라기지.
|
||||
우리 집 도티느 너무 때부시해서 걷지르 못합구마. 우리/NP 집/NNG 도티__1/NNG 느/JX 너무/MAG 때부시하__1/VV 어서/EC 걷/VV-I 지/EC 르/JX 못하/VX ᆸ구마/EF ./SF 우리 집 돼지는 너무 살쪄서 걷지를 못합니다.
|
||||
아르 녚구레 끼구 있습더구마. 아__23/NNG 르/JKO 녚구리/NNG 에/JKB 끼/VV 구/EC 있/VX 습더구마/EF ./SF 아이를 옆구리에 끼고 있더군요.
|
||||
명이 길댸닣구 따른 사름이 잇갯습지. 명/NNG 이/JKS 길/VA 디/EC 애닣__1/VX 구/EC 따르__1/VA ᆫ/ETM 사름__2/NNG 이/JKS 있/VA 갯/EP 습지/EF ./SF 명이 길지 않고 짧은 사람이 있겠지요.
|
||||
밭으르 나가 일으 하자무 헤미느 꼭 잇어야 합구마. 밭/NNG 으르/JKB 나가/VV 어/EC 일/NNG 으/JKO 하/VV 자무/EC 헤미__2/NNG 느/JX 꼭/MAG 있/VV 어야/EC 하/NNG ᆸ구마/EF ./SF 밭으로 나가 일을 하자면 호미는 꼭 있어야 합니다.
|
||||
헤때기 아프무 약으 바르구야 그 벼이 떨어집지. 헤때기__1/NNG 이/JKS 아프/VA 무/EC 약/NNG 으/JKO 바르/VV 구야/EC 그/MM 벼/NNG 이/JKS 떨어지/VV ᆸ지/EF ./SF 혀때기가 아프면 약을 발라야 그 병이 낫지요.
|
||||
어시게 불효햇다구 가깝은 친첵이 아들 빰나가지르 내갈겟습구마. 어시__1/NNG 이게/JKB 불효/NNG 하/XSV 엇/EP 다구/EC 가깝/VA-I 은/ETM 친척/NNG 이/JKS 아들/NNG 빰나가지__1/NNG 르/JKO 내갈기/VV 엇/EP 습구마/EF ./SF 어버이에게 불효했다고 가까운 친척이 아들 뺨따귀를 내갈겼습니다.
|
||||
쌈우 하무 치우라 이게라구 말합지. 쌈/NNG 우/JKO 하/VV 무/EC 치우__12/VV 라/EC 이게__1/VV 라구/EC 말/NNG 하/XSV ᆸ지/EF ./SF 쌈을 하면 반드시 이기라고 말하지요.
|
||||
엊저낙에 웨삼춘댁 상새 낫다구 전홰 왓습구마. 엊저냑/NNG 에/JKB 웨삼춘/NNG 댁/XSN 상새__1/NNG 나/VV 엇/EP 다구/EC 전화/NNG 이/JKS 오/VV 엇/EP 습구마/EF ./SF 엊저녁에 외삼촌댁 돌아가셨다고 전화가 왔습니다.
|
||||
우리 아들으느 핵교서 꼬래비만 함메. 우리/NP 아들/NNG 으느/JX 핵교__1/NNG 서/JKB 꼬래비__1/NNG 만/JX 하/VV ᆷ메/EF ./SF 우리 아들은 학교에서 꼴찌만 하네.
|
||||
아즈바니께 슈갑 빌게 디레라. 아즈바니__6/NNG 께/JKB 슈갑__1/NNG 빌기__1/VV 어/EC 디리__5/VX 어라/EF ./SF 고모부께 장갑 빌려 드려라.
|
||||
내게사 아들가 딸 둘 다 딱같은 자석입구마. 나/NP 에게/JKB 사/JX 아들/NNG 가/JC 딸/NNG 둘/NR 다/MAG 딱같__1/VA 은/ETM 자석/NNG 이/VCP ᆸ구마/EF ./SF 내게야 아들과 딸 둘 다 똑같은 자식입니다.
|
||||
도투 줴에다 굴에 옇어라. 도투__1/NNG 우/JKO 줴__1/VV 어다/EC 굴__10/NNG 에/JKB 옇__1/VV 어라/EF ./SF 돼지를 잡아다 우리에 넣어라.
|
||||
자는 어째서 뜬뜬해서 저러고 있슴메? 자/NP 는/JX 어째서/MAG 뜬뜬하__8/VA 어서/EC 저러/VV 고/EC 있/VX 슴메/EF ?/SF 쟤는 어째서 뚱해서 저러고 있는가?
|
||||
호분차 먹기 슳에서 시걱때두 밥으 잘 아이 먹엇습구마. 호분차__1/NNG 먹/VV 기/ETN 슳__1/VA 어서/JKB 시걱__1/NNG 때/NNG 에/JKB 두/JX 밥/NNG 으/JKO 잘/MAG 아이__12/MAG 먹/VV 었/EP 습구마/EF ./SF 혼자 먹기 싫어서 끼니때에도 밥을 잘 먹지 않았습니다.
|
||||
오쿠리메 댕기지 말구 가슴우 쭉 페구 댕게라. 오쿠리__1/VV 메/EC 댕기__2/VV 지/EC 말/VX 구/EC 가슴/NNG 우/JKO 쭉/MAG 페__3/VV 구/EC 댕기__2/VV 어라/EF ./SF 오그리며 다니지 말고 가슴을 쭉 펴고 다녀라.
|
||||
댜느 기애짓 아들 왜사춘이랍데. 댜/NP 느/JX 기애__4/NNG 집/NNG 아들/NNG 왜사춘__1/NNG 이/VCP 랍데/EF ./SF 저 애는 기와집 아들 외사촌이라데.
|
||||
개 세띨르 물으 핥아 먹습구마. 개/NNG 이/JKS 세띠__1/NNG ᆯ르/JKB 물/NNG 으/JKO 핥/VV 어/EC 먹/VV 습구마/EF ./SF 개가 혀로 물을 핥아 먹습니다.
|
||||
도투 잡우무 념티르 나르 주우. 도투__1/NNG 우/JKO 잡/VV-R 우무/EC 념티__1/NNG 르/JKO 나/NP 르/JKO 주/VV 우/EF ./SF 돼지를 잡으면 염통을 나를 주오.
|
||||
우리 집으르 하냥 같이 가기오. 우리/NP 집/NNG 으르/VV 하냥__3/MAG 같이/MAG 가/VV 기오/EF ./SF 우리 집으로 꼭 같이 가세.
|
||||
깔으 한 움쾜 줴 오오. 깔__3/NNG 으/JKO 한/MM 움쾜__1/NNB 줴/VV 어/EC 오/VX 오/EF ./SF 꼴을 한 움큼 쥐어 오오.
|
||||
아이구! 발에서 발똥쿠린내 나니까데 싹 싳어라. 아이구/IC !/SF 발/NNG 에서/JKB 발똥쿠린내__1/NNG 이/JKS 나/VV 니까데/EC 싹/MAG 싳__1/VV 어라/EF ./SF 아이고! 발에서 고린내가 나니까 싹 씻어라.
|
||||
낭그르 불러뜨려서 지팽이를 맨들었수다레. 낭그__1/NNG 르/JKO 불러뜨리__1/VV 어서/EC 지팡이/NNG 를/JKO 맨들/VV 엇/EP 수다레/EF ./SF 나무를 부러뜨려서 지팡이를 만들었습니다.
|
||||
저낙 먹을 때 됏는데 웨아즈바이느 안즉 아이 왓슴둥? 저낙__1/NNG 먹/VV 을/ETM 때/NNG 되/VV 엇/EP 는데/EC 웨아즈바이__1/NNG 느/JX 안즉__1/MAG 아이__12/MAG 오/VV 엇/EP 슴둥/EF ?/SF 저녁 먹을 때 됐는데 외삼촌은 아직 안 왔습니까?
|
||||
둥굴소르 가대기에 메와서 밭으 갈앗습지. 둥굴소__1/NNG 르/JKO 가대기/NNG 에/JKB 메우/VV 어서/EC 밭/NNG 으/JKO 갈/VV 었/EF 습지/EF ./SF 황소를 가대기에 메워서 밭을 갈았지요.
|
||||
댱기르 동생게 갲다 줘라. 댱기__1/NNG 르/JKO 동생/NNG 게/JKB 갲/VV 다/EC 주/VV 어라/EF ./SF 장구를 동생에게 갖다 줘라.
|
||||
돈으 쪼꼼이라두 해잴하무 안 된다. 돈/NNG 으/JKO 쪼꼼__1/NNG 이/VCP 라두/EC 해잴__1/NNG 하/XSV 무/EC 안/MAG 되/VV ᆫ다/EF ./SF 돈을 조금이라도 낭비하면 안 된다.
|
||||
아덜이 헤태르 내밀메 웃구 그러무 어시느 귀엽다구 그 아르 안아 줍구마. 아__23/NNG 덜/XSN 이/JKS 헤태__1/NNG 르/JKO 내밀/VV 메/EC 웃/VV-R 구/EC 그러/VV 무/EC 어시__1/NNG 느/JX 귀엽/VA-I 다구/EC 그/MM 아__23/NNG 르/JKO 안/VV 어/EC 주/VX ᆸ구마/EF ./SF 아이들이 혀를 내밀며 웃고 그러면 부모는 귀엽다고 그 아이를 안아 줍니다.
|
||||
우리 아느 새박부터 부지러이 배아리 들구 놀러 나갔소. 우리/NP 아__23/NNG 느/JX 새박__3/NNG 부터/JX 부지러이__1/MAG 배아리__2/NNG 들/VV 구/EC 놀/VV 러/EC 나가/VV 엇/EP 소/EF ./SF 우리 애는 새벽부터 부지런히 팽이 들고 놀러 나갔소.
|
||||
내 쓴 펜지에 홰답으 아이 주다 나니까데 서분합구마. 나/NP 이/JKS 쓰/VV ᆫ/ETM 펜지__1/NNG 에/JKB 홰답__1/NNG 으/JKO 아이__12/MAG 주/VV 다/EC 나/VX 니까데/EC 서분하__2/VV ᆸ구마/EF ./SF 내가 쓴 편지에 회답을 주지 않다 보니까 서운합니다.
|
||||
소낙 소리 쎄기 나는 게 인차 비 오갯습구마. 소낙__1/NNG 소리/NNG 쎄/VA 기/EC 나/VV 는/ETM 것/NNB 이/JKS 인차/MAG 비/NNG 오/VV 갯/EP 습구마/EF ./SF 우레 소리 세게 나는 게 이내 비 오겠습니다.
|
||||
우춧한 사름이사 세사에 많갯습지. 우춧하__1/VA ᆫ/ETM 사름__2/NNG 이사/JX 세상/NNG 에/JKB 많/VA 갯/EP 습지/EF ./SF 어리석은 사람이야 세상에 많겠지요.
|
||||
밭에 무끼가 배채르 세이 싱것습구마. 밭/NNG 에/JKB 무끼__1/NNG 가/JC 배채__1/NNG 르/JKO 세이__3/MAG 싱그__1/VV 엇/EP 습구마/EF ./SF 밭에 무와 배추를 많이 심었습니다.
|
||||
승겁운가 짭운가 맛으 보오. 승겁__1/VA 은가/EC 짭__1/VA 은가/EC 맛/NNG 으/JKO 보/VV 오/EF ./SF 싱거운가 짠가 맛을 보오.
|
||||
곤매시르 닦아 먹으무 과연 맛잇습지. 곤매시__1/NNG 르/JKO 닦/VV 어/EC 먹/VV 으무/EC 과연/MAG 맛잇/VA-R 습지/EF ./SF 호박을 볶아 먹으면 정말 맛있지요.
|
||||
저 아느 제 어시 말으 통 듣댸이쿠 펀한 짓만 하구 댕긴다구 합구마. 저/MM 아__23/NNG 느/JX 저/NP 의/JKG 어시__1/NNG 말/NNG 으/JKO 통/MAG 듣/VV-I 디/EC 애잏__1/VX 구/EC 펀하__1/VA ᆫ/ETM 짓/NNG 만/JX 하/VV 구/EC 댕기/VV ᆫ다구/EF 하/VV ᆸ구마/EF ./SF 저 아이는 제 부모 말을 통 듣지 않고 멍청한 짓만 하고 다닌다고 합니다.
|
||||
핵교서 아덜 배와주는 선생님덜 보무 바쁜 가툴합구마. 핵교/NNG 서/JKB 아__23/NNG 덜/XSN 배와주__1/VV 는/ETM 선생/NNG 님/XSN 덜/XSN 보/VV 무/EC 바쁘__7/VA ᆫ/ETM 가툴하__1/VA ᆸ구마/EF ./SF 학교에서 아이들 가르치는 선생님들 보면 어려운 것 같습니다.
|
||||
당신이 그래셔 나두 그 사람이 쇠겡이인 줄로만 알았습구마. 당신/NP 이/JKS 그렇/VA-I 어셔/EC 나/NP 두/JX 그/MM 사람/NNG 이/JKS 쇠겡이__1/NNG 이/VCP ᆫ/ETM 줄/NNB 로/JKB 만/JX 알/VV 엇/EP 습구마/EF ./SF 당신이 그래서 나도 그 사람이 소경인 줄로만 알았습니다.
|
||||
내 고향 경흥가 저짝 단천 말테 땁구마. 나/NP 의/JKG 고향/NNG 경흥/NNP 가/JC 저짝__1/NP 단천/NP 말테__1/NNG 이/JKS 따__17/VA ᆸ구마/EF ./SF 내 고향 경흥과 저쪽 단천 말투가 다릅니다.
|
||||
일으 많이 하다 나니 오분몸이 다 아파서 못 살갯습구마. 일/NNG 으/JKO 많이/MAG 하/VV 다/EC 나/VX 니/EC 오분몸__1/NNG 이/JKS 다/MAG 아프/VA 어서/EC 못/MAG 살/VV 갯/EP 습구마/EF ./SF 일을 많이 하다 보니 온몸이 다 아파서 못 살겠습니다.
|
||||
아바이, 소곰쟁이 잡지 맙소. 아바이/NNP ,/SP 소곰쟁이__1/NNG 잡/VV-R 지/EC 말/VX ᆸ소/EF ./SF 아버지, 잠자리 잡지 마십시오.
|
||||
영겔르 가찹이 오나라. 영게__1/NP ᆯ르/JKB 가찹이__2/MAG 오/VV 나라/EF ./SF 여기로 가까이 오너라.
|
||||
배고푸무 부수깨서 다웅치 가졔가서 먹어라. 배고푸__1/VA 무/EC 부수깨__1/NNG 에서/JKB 다웅치__1/NNG 가지/VV 어/EC 가/VX 어서/EC 먹/VV 어라/EF ./SF 배고프면 부엌에서 누룽지 가져가서 먹어라.
|
||||
아 들어서무 입스레미르 합지. 아__23/NNG 들어서/VV 무/EC 입스레미__1/NNG 르/JKO 하/VV ᆸ지/EF ./SF 아이가 들어서면 입덧을 하지요.
|
||||
내 조꼼할 적에느 키 작앗습구마. 나/NP 이/JKS 조꼼/NNG 하/XSV ᆯ/ETM 적/NNB 에/JKB 느/JX 키/NNG 이/JKS 작/VA 엇/EP 습구마/EF ./SF 내 조끄마할 적에는 키가 작았습니다.
|
||||
상년 동삼에 옝기르 바람에 싹 날기구 고사아 했습지. 상년/NNG 동삼/NNG 에/JKB 옝기__1/NNG 르/JKO 바람/NNG 에/JKB 싹/MAG 날기__1/VV 구/EC 고상__1/NNG 으/JKO 하/XSV 엇/EP 습지/EF ./SF 상년 겨울에 이엉을 바람에 싹 날리고 고생을 했지요.
|
||||
내 아주바이느 젊어실 적에 고사아 많이 햇습구마. 나/NP 의/JKG 아주바이__3/NNG 느/JX 젊/VA 엇/EP ᆯ/ETM 적/NNB 에/JKB 고상__1/NNG 으/JKO 많이/MAG 하/VV 엇/EP 습구마/EF ./SF 내 형부는 젊었을 적에 고생을 많이 했습니다.
|
||||
하불에미나 하불애비나 살기느 바쁩지. 하불에미__1/NNG 나/JC 하불애비/NNG 나/JC 살/VV 기/ETN 느/JX 바쁘__7/VA ᆸ지/EF ./SF 홀어미나 홀아비나 살기는 힘들지요.
|
||||
봄에 피는 꽂 중에서 하불에미고장으느 자디색이 납지. 봄/NNG 에/JKB 피/VV 는/ETM 꽂__1/NNG 중/NNB 에서/JKB 하불에미고장__1/NNG 으느/JX 자디색__1/NNG 이/JKS 나/VV ᆸ지/EF ./SF 봄에 피는 꽃 중에서 할미꽃은 자주색이 나지요.
|
||||
우리 클아반으느 오래 앉앗습구마. 우리/NP 클아반__1/NNG 으느/JX 오래/MAG 앉/VV 엇/EF 습구마/EF ./SF 우리 할아버지는 오래 사셨습니다.
|
||||
시금 아덜이사 우리 세는 멩실이 무시긴지 잘 모릅구마. 시금__8/NNG 아__23/NNG 덜/XSN 이사/JX 우리/NP 세__21/VV 는/ETM 멩실/NNG 이/JKS 무시기/NP 이/VCP ᆫ지/EC 잘/MAG 모르/VV ᆸ구마/EF ./SF 지금 아이들이야 우리가 쇠는 명절이 무엇인지 잘 모릅니다.
|
||||
식귀 여서히 살무 시끄럽어서 내느 아니 둏아합구마. 식귀__1/NNG 이/JKS 여서히__1/NNG 이/JKS 살/VV 무/EC 시끄럽/VA-I 어서/EC 내/NP 느/JX 아니/MAG 둏__1/VA 어/EC 하/NNG ᆸ구마/EF ./SF 식구가 여럿이 살면 시끄러워서 나는 안 좋아합니다.
|
||||
그 짓 녕감가 노친 모두 일없습더구마. 그/MM 집/NNG 녕감__1/NNG 가/JC 노친/NNG 모두/MAG 일/NNG 없/VA 습더구마/EF ./SF 그 집 영감님과 노친 모두 괜찮으셨습니다.
|
||||
시방으느 기름우 얻자구 해자부리두 많이 싱구오. 시방/NNG 으느/JX 기름/NNG 우/JKO 얻/VV-R 자구/EC 해자부리__1/NNG 두/JX 많이/MAG 싱구__1/VV 오/EF ./SF 시방은 기름을 얻자고 해바라기도 많이 심으오.
|
||||
붕혜가 저약에느 어디메 있니? 붕혜__1/NNG 가/JKS 저약__1/NNG 에/JKB 느/JX 어디메__1/NP 있/VV 니/EF ?/SF 부엉이가 저녁에는 어디 있니?
|
||||
사름덜 다치니까데 뎡게 웅데이르 잘 메꿔라. 사름__2/NNG 덜/XSN 다치/VV 니까데/EC 뎡게__1/NP 웅데이__3/NNG 르/JKO 잘/MAG 메꾸/VV 어라/EF ./SF 사람들이 다치니까 저기 웅덩이를 잘 메워라.
|
||||
그 무티를 가제와 놔라. 그/MM 무티__1/NNG 를/JKO 가지/VV 어/EC 오/VX 어/EC 놓/VX 어라/EF ./SF 그 나무를 가져와 놓아라.
|
||||
정재시리서 가재미 굽어 먹었슴메. 정재시리__1/NNG 서/JKB 가재미/NNG 굽/VA-R 어/EC 먹/VV 었/EP 슴메/EF ./SF 정주에서 가자미 구워 먹었소.
|
||||
아가 오마니 우티 끝자라기르 잡구 있습메. 아__23/NNG 가/JKS 오마니__1/NNG 우티__1/NNG 끝자라기__1/NNG 르/JKO 잡/VV-R 구/EC 있/VX 습메/EF ./SF 아이가 어머니 옷 끝자락을 잡고 있네.
|
||||
네 함벌로 말으 하무 내 가만히 아이 잇갯다. 너/NP 이/JKS 함벌로__1/MAG 말/NNG 으/JKO 하/VV 무/EC 나/NP 이/JKS 가만히/MAG 아이/MAG 있/VV 갯/EP 다/EF ./SF 네가 함부로 말을 하면 내가 가만히 있지 않겠다.
|
||||
바쁘기 빳빳이 살구 기래다 나니 이래 나아 먹엇습구마. 바쁘__7/VA 기/EC 빳빳이__6/MAG 살/VV 구/EC 기렇/VA-I 어다/EC 나/VX 니/EC 이렇/VA-I 어/EC 나이/NNG 으/JKO 먹/VV 엇/EP 습구마/EF ./SF 힘들게 빠듯이 살고 그러다 보니 이리 나이를 먹었습니다.
|
||||
허더칸에 쟁기구 무슨 냉기구 다 딜에놓소. 허더칸__1/NNG 에/JKB 쟁기/NNG 이/VCP 구/EC 무슨/MM 냉기__2/NNG 이/VCP 구/EC 다/MAG 딜이__1/VV 어/EC 놓/VV 소/EF ./SF 헛간에 농기구고 무슨 나무고 다 들여놓소.
|
||||
내 새끼소꾸락이 요즘 아풉구마. 나/NP 의/JKG 새끼소꾸락__1/NNG 이/JKS 요즘/NNG 아푸/VA ᆸ구마/EF ./SF 내 새끼손가락이 요즘 아픕니다.
|
||||
우리 어마니 애끼 남편이무 아즈바니라 하오. 우리/NP 어마니/NNG 애끼__1/NNG 남편/NNG 이/VCP 무/EC 아즈바니__3/NNG 이/VCP 라/EC 하/VV 오/EF ./SF 우리 어머니 아우의 남편이면 이모부라 하오.
|
||||
뽕여르매 열겟으무 따 오나라. 뽕여르매__1/NNG 열기__1/VV 엇/EP 으무/EC 따/VV 어/EC 오/VX 나라/EF ./SF 오디가 열렸으면 따 오너라.
|
||||
꼬부대기 심바람으 갓다 온나라. 꼬부대기__1/MAG 심바람__1/NNG 으/JKO 가/VV 엇/EP 다/EC 오/VV ᆫ나라/EF ./SF 부지런히 심부름을 갔다 오너라.
|
||||
마른 검블으 모아셔 불으 지펬다. 마르/VV ᆫ/ETM 검블__1/NNG 으/JKO 모으/VV 어셔/EC 불/NNG 으/JKO 지피/VV 었/EP 다/EF ./SF 마른 검불을 모아서 불을 지폈다.
|
||||
자식덜이 다 서방가구 시집가구 기래구 안까니두 상새 나서 없구 집에 내 하분자 잇으니 늘상 헝둥하오. 자식/NNG 덜/XSN 이/JKS 다/MAG 서방/NNG 가/XSV 구/EC 시집/NNG 가/XSV 구/EC 기렇/VA-I 어구/EC 안까니__1/NNG 두/JX 상/NNG 새/NNG 나/VV 어서/EC 없/VA 구/EC 집/NNG 에/JKB 나/NP 이/JKS 하/NNG 분자/NNG 있/VA 으니/EC 늘상/MAG 헝둥하__1/VA 오/EF ./SF 자식들이 다 장가가고 시집가고 그리고 부인도 죽어서 없고 집에 내가 혼자 있으니 늘상 허전하오.
|
||||
그른 말 아이 씀다. 그른__1/MM 말/NNG 아이__12/MAG 쓰/VV ᆷ다/EF ./SF 그런 말 아니 씁니다.
|
||||
네 어드메르 가나? 너/NP 이/JKS 어드메/NP 르/JKO 가/VV 나/EF ?/SF 너 어디를 가니?
|
||||
장에 가서 염쉐르 싸 오너라. 장/NNG 에/JKB 가/VV 어서/EC 염쉐__1/NNG 르/NNG 싸__21/VV 오/VV 너라/EF ./SF 장에 가서 염소를 사 오너라.
|
||||
어레실 적 일으 해상하무 즐겁습구마. 어리/VA 엇/EP ᆯ/ETM 적/NNB 일/NNG 으/JKO 해상하__2/VV 무/EC 즐겁/VA-I 습구마/EF ./SF 어렸을 적 일을 회상하면 즐겁습니다.
|
||||
아덜으느 소압을 줏으러 산지슭을르 갔다. 아__23/NNG 덜/XSN 으느/JX 소압__1/NNG 을/JKO 줏/VV-R 으러/EC 산지슭__1/NNG 을르/JKB 가/VV 었/EP 다/EF ./SF 아이들은 솔가지를 주우러 산기슭으로 갔다.
|
||||
영게 옥시두 많이 있습구마. 영게__1/NP 옥시__1/NNG 두/JX 많이/MAG 있/VA 습구마/EF ./SF 여기 옥수수도 많이 있습니다.
|
||||
영게서 새채할 생각 말구 얼른 재비 집으르 가서 눕어 자오. 영게__1/NP 서/JKB 새채하__1/VV ᆯ/ETM 생각/NNG 말/VV 구/EC 얼른/MAG 재비__4/MAG 집/NNG 으르/JKB 가/VV 어서/EC 눕/VV-I 어/EC 자/VV 오/EF ./SF 여기서 유숙할 생각 말고 얼른 자기 집으로 가서 누워 자오.
|
||||
그 담엔 제 쌀이 나오게끔 돼구 게 나간 건 나백게 나간단 말이오. 그/MM 담/NNG 에/JKB ᆫ/JX 저/NP 의/JKG 쌀/NNG 이/JKS 나오/VV 게끔/EC 돼__1/VV 구/EC 게__6/NNG 이/JKS 나가/VV ᆫ/ETM 거/NNB ᆫ/JX 나백게__1/NNG 이/JKS 나가/VV ᆫ단/ETM 말/NNG 이/VCP 오/EF ./SF 그 다음엔 제 쌀이 나오게끔 되고 겨가 나간 것은 쌀겨가 나간단 말이오.
|
||||
가매뜨베르 생질르 잘 닦아라. 가매뜨베__1/NNG 르/JKO 생지__2/NNG ᆯ르/JKB 잘/MAG 닦/VV 어라/EF ./SF 솥뚜껑을 행주로 잘 닦아라.
|
||||
솔냉기처리 상낭구두 오래 사는 냉기입구마. 솔냉기__1/NNG 처르__1/JKB 상낭구__1/NNG 두/JX 오래/MAG 사/VV 는/ETM 냉기__2/NNG 이/VCP ᆸ구마/EF ./SF 소나무처럼 향나무도 오래 사는 나무입니다.
|
||||
도독 한 놈은 경찰덜게 붙들기우구 둘은 달아낫습구마. 도독__12/NNG 한/MM 놈/NNB 은/JX 경찰/NNG 덜/XSN 게/JKB 붙들기우__1/VV 구/EC 둘/NR 은/JX 달아나/VV 엇/EP 습구마/EF ./SF 도둑 한 놈은 경찰들에게 붙들리고 둘은 달아났습니다.
|
||||
모딘 낭기 많다 나니 땔낭그 걱정이사 없엇습구마. 모디__3/VA ᆫ/ETM 낭기__1/NNG 이/JKS 많/VA 다/EC 나/VX 니/EC 땔낭그__1/NNG 걱정/NNG 이사/JX 없/VA 엇/EP 습구마/EF ./SF 굵은 나무가 많다 보니 땔나무 걱정이야 없었습니다.
|
||||
사등이에 뻬가 탁 부러뎃단 말이오. 사등이__1/NNG 에/JKB 뻬__1/NNG 가/JKS 탁/MAG 부러디__1/VV 엇/EP 단/ETM 말/NNG 이/VCP 오/EF ./SF 등에 뼈가 탁 부러졌다는 말이오.
|
||||
세때기에 쓸이 돋으무 통세 나서 임셕으 먹지 못하오. 세때기__1/NNG 에/JKB 쓸/NNG 이/JKS 돋/VV-R 으무/EC 통세/NNG 나/VV 어서/EC 임석__4/NNG 으/JKO 먹/VV 지/EC 못하/VX 오/EF ./SF 혀때기에 혓바늘이 돋으면 통세가 있어서 음식을 먹지 못하오.
|
||||
야 웨컬아배 올해 야든이 넘었는데 정정합메다. 야/NP 웨컬아배__1/NNG 이/JKS 올해/NNG 야든__1/NR 이/JKS 넘/VV 었/EP 는데/EC 정정/NNG 하/XSA ᆸ메다/EF ./SF 얘 외할아버지 올해 여든이 넘었는데 정정합니다.
|
||||
내기 심심하다 나이 자주루 하페미르 합지. 내기/NNG 이/JKS 심심/XR 하/XSA 다/EC 나이/EC 자주/MAG 루/JKB 하페미__1/NNG 르/JKO 하/VV ᆸ지/EF ./SF 얘기가 심심하다 보니 자주 하품을 하지요.
|
||||
우리 동네에 입따개 한내 잇는데 마음이 곱은 사름입구마. 우리/NP 동네/NNG 에/JKB 입따개__1/NNG 한내__2/NR 있/VA 는데/EC 마음/NNG 이/JKS 곱/VA-I 은/ETM 사름__2/NNG 이/VCP ᆸ구마/EF ./SF 우리 동네에 언청이 하나가 있는데 마음이 고운 사람입니다.
|
||||
어마네, 왜큰아매 오셋습구마. 어마네/NNG ,/SP 왜큰아매/NNG 오/VV 시/EP 엇/EP 습구마/EF ./SF 어머니, 외할머니 오셨습니다.
|
||||
밖이 칩운데 팔뱅애 입구 나가라. 밖/NNG 이/JKS 칩__1/VA-I 은데/EC 팔뱅애__1/NNG 입/VV-R 구/EC 나가/VV 라/EF ./SF 밖이 추운데 마고자 입고 나가라.
|
||||
제 이림이 무스검둥? 저/NP 의/JKG 이림__1/NNG 이/JKS 무스거__1/NP 이/VCP ᆷ둥/EF ?/SF 당신 이름이 무엇입니까?
|
||||
노인덜이 하는 니애기느 다 넷말이라구 아덜이 웃는단 말이오. 노인/NNG 덜/XSN 이/JKS 하/VV 는/ETM 니애기__1/NNG 는/JX 다/MAG 넷말__1/NNG 이/VCP 라구/EC 아__23/NNG 덜/XSN 이/JKS 웃/VV-R 는단/ETM 말/NNG 이/VCP 오/EF ./SF 노인들이 하는 얘기는 다 옛말이라고 아이들이 웃는단 말이오.
|
||||
물으 길어 와서 항사례 물으 까뜩 채와라. 물/NNG 으/JKO 긷/VV-I 어/EC 오/VX 어서/EC 항사리__1/NNG 에/JKB 물/NNG 으/JKO 까뜩__1/MAG 채우/VV 어라/EF ./SF 물을 길어 와서 항아리에 물을 가뜩 채워라.
|
||||
갸느 핵교서두 글으 이르구 집에서두 글으 이르구 정말 기찹구마. 갸/NP 느/JX 핵교__1/NNG 서/JKB 두/JX 글/NNG 으/JKO 이르__10/VV-R 구/EC 집/NNG 에서/JKB 두/JX 글/NNG 으/JKO 이르__10/VV-R 구/EC 정말/MAG 기차/VA ᆸ구마/EF ./SF 그 아이는 학교에서도 공부를 하고 집에서도 공부를 하고 정말 기찹니다.
|
||||
남물 담글 때 말임까? 남물__2/NNG 담그/VV ᆯ/ETM 때/NNG 말/NNG 이/VCP ᆷ까/EF ?/SF 김치 담글 때 말입니까?
|
||||
메사기르 꿉어서 부르쌈에다가 싸 먹으문 좋지비. 메사기__1/NNG 르/JKO 꿉__1/VV-I 어서/EC 부르쌈__1/NNG 에다가/JKB 싸/VV 어/EC 먹/VV 으문/EC 좋/VA 지비/EF ./SF 메기를 구워서 상추쌈에다 싸 먹으면 좋지.
|
||||
잰내비르 본내는 사름두 잇습구마. 잰내비__1/NNG 르/JKO 본내__1/VV 는/ETM 사름__2/NNG 두/JX 있/VA 습구마/EF ./SF 원숭이를 흉내질하는 사람도 있습니다.
|
||||
정게 사는 하불아비르 내 이따가 보자구 하는데, 내가 같이 가갯소? 정게__2/NP 사/VV 는/ETM 하불아비__1/NNG 르/JKO 나/NP 이/JKS 이따가/MAG 보/VV 자구/EC 하/VX 는데/EC ,/SP 나/NP 가/JKB 같이/MAG 가/VV 갯/EP 소/EF ?/SF 저기 사는 홀아비를 내가 이따가 보려고 하는데, 나와 같이 가겠소?
|
||||
일하는 게 서거푸대닣구 일으 일씨 합구마. 일/NNG 하/XSV 는/ETM 것/NNB 이/JKS 서거프__1/VA 디/EC 애닣__1/VX 구/EC 일/NNG 으/JKO 일씨__1/MAG 하/VV ᆸ구마/EF ./SF 일하는 게 서투르지 않고 일을 제법 합니다.
|
||||
오놀 간거리는 무꾸다. 오놀__2/MAG 간거리__2/NNG 는/JX 무꾸__1/NNG 이/VCP 다/EF ./SF 오늘 반찬거리는 무다.
|
||||
잇검에 가시 끼웟으니 가시르 뽑아야 하오. 잇검__1/NNG 에/JKB 가시/NNG 이/JKS 끼우__4/VV 엇/EP 으니/EC 가시/NNG 르/JKO 뽑/VV-R 어야/EC 하/VX 오/EF ./SF 잇몸에 가시가 끼었으니 가시를 뽑아야 하오.
|
||||
어제 숨우 쉬는데 불세르 허피 아팟습지. 어제/MAG 숨/NNG 우/JKO 쉬/VV 는데/EC 불세르/MAG 허피__1/NNG 아프/VA 엇/EP 습지/EF ./SF 어제 숨을 쉬는데 갑자기 허파가 아팠지요.
|
||||
저냑에는 불그르 싸 먹었습구마. 저냑__1/NNG 에/JKB 는/JX 불그__1/NNG 르/JKO 싸/VV 어/EC 먹/VV 었/EP 습구마/EF ./SF 저녁에는 상추를 싸 먹었습니다.
|
||||
사양해서 잡은 산즘승의 서구레를 뻣긴다. 사양__1/NNG 하/XSV 어서/EC 잡/VV-R 은/ETM 산즘승/NNG 의/JKG 서구레__1/NNG 를/JKO 뻣기__1/VV ᆫ다/EF ./SF 사냥해서 잡은 산짐승의 가죽을 벗긴다.
|
||||
물외는 잘 싳어셔 겁지리르 뻿게셔 먹는다. 물외__1/NNG 는/JX 잘/MAG 싳__1/VV 어셔/EC 겁지리__1/NNG 르/JKO 뻿기__1/VV 어셔/EC 먹/VV 는다/EF ./SF 오이는 잘 씻어서 껍질을 벗겨서 먹는다.
|
||||
갠으 가무 올채 많구 메구락지두 많습구마. 갠__1/NNG 으/JKO 가/VV 무/EC 올채__1/NNG 이/JKS 많/VA 구/EC 메구락지__1/NNG 두/JX 많/VA 습구마/EF ./SF 내를 가면 올챙이가 많고 개구리도 많습니다.
|
||||
개지 머거리르 고내 앗아빼구 잇습구마. 개지__3/NNG 머거리__5/NNG 르/JKO 고내__4/NNG 이/JKS 앗아빼__1/VV-R 구/EC 잇/VX 습구마/EF ./SF 강아지 먹이를 고양이가 빼앗고 있습니다.
|
||||
사녕꾼이 몽노이가 차끼르 놓았다. 사녕/NNG 꾼/XSN 이/JKS 몽노이__1/NNG 가/JC 차끼__1/NNG 르/JKO 놓/VV 었/EP 다/EF ./SF 사냥꾼이 올가미와 덫을 놓았다.
|
||||
아들게 심바람 시길 때 헛눈팔지 말구 집으루 고도시 오라구 합지. 아들/NNG 게/JKB 심바람__1/NNG 시기__1/VV ᆯ/ETM 때/NNG 헛눈팔__1/VV 지/EC 말/VX 구/EC 집/NNG 으루/JKB 고도시/MAG 오/VV 라구/EC 하/VV ᆸ지/EF ./SF 아들에게 심부름 시킬 때 한눈팔지 말고 집으로 곧바로 오라고 하지요.
|
||||
입슌두 얍다샇구 나치두 곱아서 그 새애기 메누리 삼구 싶습구마. 입슌__1/NNG 두/MM 얍다샇/VA 구/EC 나치/NNG 두/JX 곱/VA-I 어서/EC 그/MM 새애기/NNG 메누리/NNG 삼/VV 구/EC 싶/VX 습구마/EF ./SF 입술도 얄따랗고 낯도 고와서 그 처녀를 며느리로 삼고 싶습니다.
|
||||
그 집우 규수가 괜채잏더라. 그/MM 집/NNG 우/JKO 규수/NNG 가/JKS 괜채잏__1/VA 더라/EF ./SF 그 집의 규수가 괜찮더라.
|
||||
붺에 가서 당쉬밥 좀 멕여 봐라. 붺__1/NNG 에/JKB 가/VV 어서/EC 당쉬밥__1/NNG 좀/MAG 멕이/VV 어/EC 보/VX 어라/EF ./SF 붴에 가서 눌은밥 좀 먹여 봐라.
|
||||
쬐곰하드문 돌에 걸게서 둘르 번제질 뻔햇소. 쬐곰하드문__1/MAG 돌/NNG 에/JKB 걸기__1/VV 어서/EC 두__3/NNG ᆯ르/JKB 번제지__1/VV ᆯ/ETM 뻔/NNB 하/XSA 엇/EP 소/EC ./SF 하마터면 돌에 걸려서 뒤로 넘어질 뻔했소.
|
||||
동삼에 솜눈이 네리무 아덜이 바긑으르 나가 둏다구 놀구 그리합구마. 동삼/NNG 에/JKB 솜눈__1/NNG 이/JKS 네리/VV 무/EC 아__23/NNG 덜/XSN 이/JKS 바긑__1/NNG 으르/JKB 나가/VV 어/EC 둏__1/VA 다구/EC 놀/VV 구/EC 그리/MAG 하/VV ᆸ구마/EF ./SF 겨울에 함박눈이 내리면 아이들이 바깥으로 나가 좋다고 놀고 그리합니다.
|
||||
구차하게 살다가 이쎄 제구나 살 만합구마. 구차/NNG 하/XSA 게/EC 살/VV 다가/EC 이쎄__1/NNG 제구나__1/MAG 살/VV ᆯ/ETM 만/NNB 하/XSA ᆸ구마/EF ./SF 구차하게 살다가 요사이 겨우 살 만합니다.
|
||||
이 문제느 풀기 바쁩구마. 이/MM 문제/NNG 느/JX 풀/VV 기/ETN 바쁘__7/VA ᆸ구마/EF ./SF 이 문제는 풀기 어렵습니다.
|
||||
동삼에 강이 얼무 겅게서 강판쇄기르 하구 기랫습구마. 동삼/NNG 에/JKB 강/NNG 이/JKS 얼/VV 무/EC 겅게__1/NP 서/JKB 강판쇄기__1/NNG 르/JKO 하/VV 구/EC 기렇/VA-I 었/EP 습구마/EF ./SF 동삼에 강이 얼면 거기서 얼음지치기를 하고 그랬습니다.
|
||||
아덜 멫으 더부리구 시장에 물건 사러 갓습구마. 아__23/NNG 덜/XSN 멫__1/NR 으/JKO 더부리__1/VV 구/EC 시장/NNG 에/JKB 물건/NNG 사/VV 러/EC 가/VV 엇/EP 습구마/EF ./SF 아이들 몇을 데리고 시장에 물건 사러 갔습니다.
|
||||
이 강에느 짜작돌이 많소. 이/MM 강/NNG 에/JKB 느/JX 짜작돌__1/NNG 이/JKS 많/VA 소/EC ./SF 이 강에는 자갈이 많소.
|
||||
내 안깐이 생전해 잇을 적에 제일 좋아햇던 꽂이 해갸부리엿습구마. 나/NP 의/JKG 안깐이__1/NNG 이/JKS 생전/NNG 하/VV 어/EC 잇/VX-R 을/ETM 적/NNB 에/JKB 제일/MAG 좋아하/VV 엇/EP 던/ETM 꽂__1/NNG 이/JKS 해갸부리__1/NNG 이/VCP 엇/EP 습구마/EF ./SF 내 아내가 생존해 있을 적에 제일 좋아했던 꽃이 해바라기였습니다.
|
||||
파이나서 궁기 난 우티두 다 깁어서 입습구마. 파이나__1/VV 어서/EC 궁기__3/NNG 이/JKS 나/VV ᆫ/ETM 우티__1/NNG 두/JX 다/MAG 깁/VV-I 어서/EC 입/VV-R 습구마/EF ./SF 해져서 구멍이 난 옷도 다 기워서 입습니다.
|
||||
정게 학교에 글으 니르러 가는 학재르 보니 아들이 생각납구마. 정게/NP 학교/NNG 에/JKB 글/NNG 으/JKO 니르__1/VV 러/EC 가/VV 는/ETM 학재/NNG 르/JKO 보/VV 니/EC 아들/NNG 이/JKS 생각나/VV ᆸ구마/EF ./SF 저기 학교에 공부하러 가는 학생을 보니 아들이 생각납니다.
|
||||
우리 아부지느 이쎄 까딱하문 홰르 쓰읍구마. 우리/NP 아부지__2/NNG 느/JX 이쎄/NNG 까딱하문__1/MAG 홰__6/NNG 르/JKO 쓰/VV ᆸ구마/EF ./SF 우리 아버지는 요즈음 까딱하면 화를 냅니다.
|
||||
눈멀댕이 혼재서 그 많은 일으 다 하란 말이오? 눈멀댕이__1/NNG 혼재__1/NNG 서/JKS 그/MM 많/VA 은/ETM 일/NNG 으/JKO 다/MAG 하/VV 란/ETM 말/NNG 이/VCP 오/EF ?/SF 맹인 혼자서 그 많은 일을 다 하란 말이오?
|
||||
나느 가슬이무 칩어서 하부옷을 애이 입습구마. 나/NP 느/JX 가슬__1/NNG 이/VCP 무/EC 칩__1/VA-I 어서/EC 하부옷__1/NNG 을/JKO 애이/MAG 입/VV-R 습구마/EF ./SF 나는 가을이면 추워서 홑옷을 안 입습니다.
|
||||
한국에서두 나아 뉵십 먹으무 한갑사아 받소? 한국/NNP 에서/JKB 두/JX 나__2/NNG 아/JKO 뉵십__1/NR 먹/VV 으무/EC 한갑/NNG 사/NNG 아/JKO 받/VV-R 소/EC ?/SF 한국에서도 나이를 육십 먹으면 환갑상을 받소?
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
길이 개패로우니 노냥 올라가라야. 길/NNG 이/JKS 개패롭__1/VA-I 으니/EC 노냥__2/MAG 올라가/VV 어라야/EF./SF 길이 가파르니 천천히 올라가라.
|
||||
쌀이 없어서나리 쌀쉬수루 죽얼 낋였다. 쌀/NNG 이/JKS 없/VA 어서나리/EC 쌀쉬수__1/NNG 루/JKB 죽/NNG 얼/JKO 낋이__1/VV 었/EP 다/EF ./SF 쌀이 없어서 쌀수수로 죽을 끓였다.
|
||||
당신 돈얼 흐프게 쓰지 마시라오. 당신/NP 돈/NNG 얼/JKO 흐프__1/VA 게/EC 쓰/VV 지/EC 말/VX 시/EP 라오/EF ./SF 당신 돈을 헤프게 쓰지 마시오.
|
||||
그 아는 세날 꿈꾸막스럽다. 그/MM 아__23/NNG 는/JX 세날__1/NNG 꿈꾸막스럽__1/VA-I 다/EF ./SF 그 아이는 조금 엉뚱스럽다.
|
||||
아덜이 할마께 쉰사 드린다. 아/NNG 덜/XSN 이/JKS 할마__1/NNG 께/JKB 쉰사/XR 드리/VV ᆫ다/EF ./SF 아이들이 할머니께 수인사 드린다.
|
||||
뒤꺼럽던 밖이 쌸 조용해졌다. 뒤꺼럽__1/VA-I 던/ETM 밖/NNG 이/JKS 쌸__2/MAG 조용/XR 하/XSA 어/EC 지/VX 었/EP 다/EF ./SF 시끄럽던 밖이 조금 조용해졌다.
|
||||
몬지가 바람에 날아갔다. 몬지__1/NNG 가/JKS 바람/NNG 에/JKB 날아가/VV 었/EP 다/EF ./SF 먼지가 바람에 날아갔다.
|
||||
쥐럴 잡으려구 방마당 쥐창애럴 놓았다. 쥐/VV 럴/JKO 잡/VV-R 으려구/EC 방/NNG 마당/JX 쥐창애__1/NNG 럴/JKO 놓/VV 었/EP 다/EF ./SF 쥐를 잡으려고 방마다 쥐덫을 놓았다.
|
||||
쌍두이라 닮았다. 쌍두이__1/NNG 이/VCP 라/EC 닮/VV 었/EP 다/EF ./SF 쌍둥이라 닮았다.
|
||||
우티 꼬매 줄게 바너질당지 가졔오나라. 우티__1/NNG 꼬매__1/VV 어/EC 주/VX ᆯ게/EF 바너질당지__1/NNG 가지/VV 어/EC 오/VX 나라/EF ./SF 옷 꿰매 줄게 바느질고리 가져오너라.
|
||||
날이 풀렸으니까니 가럼우티 한 벌 사 주라요. 날/NNG 이/JKS 풀리/VV 었/EP 으니까니/EC 가럼우티__1/NNG 한/MM 벌/NNB 사/VV 어/EC 주/VX 라요/EF ./SF 날이 풀렸으니까 나들이옷 한 벌 사 줘요.
|
||||
오마이는 즘생얼 집이 들이는 것얼 진한한다. 오마이__1/NNG 는/JX 즘생__1/NNG 얼/JKO 집/NNG 이/JKB 들이/VV 는/ETM 것/NNB 얼/JKO 진한하__2/VV ᆫ다/EF ./SF 어머니는 짐승을 집에 들이는 것을 싫어한다.
|
||||
그 집으느 오래됐으니깨니 지두가 성치 않은 것이우. 그/MM 집/NNG 으느/JX 오래/MAG 되/VV 었/EP 으니깨니/EC 지두__5/NNG 가/JKS 성/NNG 하/XSV 지/EC 않/VX 은/ETM 것/NNB 이/VCP 우/EF ./SF 그 집은 오래됐으니까 기둥이 성치 않은 것이오.
|
||||
아덜이 뒤꺼럽게 과서 혼달궜다. 아__23/NNG 덜/XSN 이/JKS 뒤꺼럽__1/VA-I 게/EC 고__5/VV 어서/EC 혼달구__1/VV 었/EP 다/EF ./SF 아이들이 시끄럽게 떠들어서 혼냈다.
|
||||
오마니는 온할레 벜이서 일하곤 했수다레. 오마니__1/NNG 는/JX 온할레__1/NNG 벜__2/NNG 이서/JKB 일/NNG 하/XSV 곤/EC 하/VX 었/EP 수다레/EF ./SF 어머니는 온종일 부엌에서 일하곤 했습니다.
|
||||
고구마를 따설라무니 대리찌에다 담는다. 고구마/NNG 를/JKO 따/VV 어서/EC ᆯ라무니/EC 대리찌__1/NNG 에다/JKB 담/VV 는다/EF ./SF 고구마를 따서 다래끼에다 담는다.
|
||||
물이 차거우니 다구운 물얼 더 부어라. 물/NNG 이/JKS 차겁/VA-I 으니/EC 다굽/VA-I 은/ETM 물/NNG 얼/JKO 더/MAG 붓/VV-I 어라/EF ./SF 물이 차가우니 뜨거운 물을 더 부어라.
|
||||
갑재기 무루가 쏟아져 복숭애가 다 떨어졌습니다레. 갑재기/MAG 무루__8/NNG 가/JKS 쏟아지/VV 어/EC 복숭애__1/NNG 가/JKS 다/MAG 떨어지/VV 었/EP 습니다레/EF ./SF 갑자기 우박이 쏟아져 복숭아가 다 떨어졌습니다.
|
||||
그는 혐이 쉽기 합격했다. 그/NP 는/JX 혐__1/NNG 이/JKB 쉽/VA-I 기/EC 합격/NNG 하/XSV 었/EP 다/EF ./SF 그는 시험에 쉽게 합격했다.
|
||||
성이 내 돈얼 뚜꺼먹고 주지럴 않는다. 성__5/NNG 이/JKS 나/NP 의/JKG 돈/NNG 얼/JKO 뚜꺼먹__2/VV 고/EC 주/VV 지/EC 럴/JKO 않/VX 는다/EF ./SF 형이 내 돈을 떼어먹고 주지를 않는다.
|
||||
얘야, 새질거리지 말구 얌전히 있어라야. 얘/NP 야/JKV ,/SP 새질거리__1/VV 지/EC 말/VX 구/EC 얌전히/MAG 있/VV 어라야/EF ./SF 얘야, 새실거리지 말고 얌전히 있어라.
|
||||
저번에 싱군 밤에 더금잎이 났다. 저번/NNG 에/JKB 싱구__1/VV ᆫ/ETM 밤/NNG 에/JKB 더금잎__1/NNG 이/JKS 나/VV 었/EP 다/EF ./SF 저번에 심은 밤에 떡잎이 났다.
|
||||
핵교 끝나무 꼬장 오나라. 핵교/NNG 끝나/VV 무/EC 꼬장__3/MAG 오/VV 나라/EF ./SF 학교 끝나면 곧장 오너라.
|
||||
동상이 성버담 더 키두 크구 머굽다. 동상__1/NNG 이/JKS 성__5/NNG 버담/JKB 더/MAG 키/NNG 두/JX 크/VA 구/EC 머굽__1/VA-I 다/EF ./SF 동생이 형보다 더 키도 크고 무겁다.
|
||||
다리 아프이 놀면 가자마. 다리/NNG 아프/VA 이/EC 놀면__2/MAG 가/VV 자마/EF ./SF 다리 아프니 천천히 가자.
|
||||
그 아는 지는 것얼 아즌 틀려한다. 그/MM 아__23/NNG 는/JX 지/VV 는/ETM 것/NNB 얼/JKO 아즌/MAG 틀려하__1/VV ᆫ다/EF ./SF 그 아이는 지는 것을 아주 싫어한다.
|
||||
가마니떼기에 쌀이 샬도 없수다레. 가마니떼기/NNG 에/JKB 쌀/NNG 이/JKS 샬__2/NNG 도/JX 없/VA 수다레/EF ./SF 가마니에 쌀이 조금도 없습니다.
|
||||
너 왜 꼭박이다가 밥얼 먹네? 너/NP 왜/MAG 꼭박__1/NNG 이다가/JKB 밥/NNG 얼/JKO 먹/VV 네/EF ?/SF 너 왜 쪽박에다가 밥을 먹니?
|
||||
오널 저냑에는 먹대 넣구 지지개럴 낋였다. 오널__1/NNG 저냑__1/NNG 에/JKB 는/JX 먹대__2/NNG 넣/VV 구/EC 지지개/NNG 럴/JKO 낋이__1/VV 었/EP 다/EF ./SF 오늘 저녁에는 오징어 넣고 찌개를 끓였다.
|
||||
얘, 옆집 아자씨럴 등꼽재이라구 놀리문 안 된다. 얘/IC ,/SP 옆집/NNG 아자씨__1/NNG 럴/JKO 등꼽재이__1/NNG 이/VCP 라구/EC 놀리/VV 문/EC 안/MAG 되/VV ᆫ다/EF ./SF 얘, 옆집 아저씨를 꼽추라고 놀리면 안 된다.
|
||||
아주마이가 바금태기럴 옆구리에 낑기구 걸어간다. 아주마이__1/NNG 가/JKS 바금태기__1/NNG 럴/JKO 옆구리/NNG 에/JKB 낑기__1/VV 구/EC 걸어가/VV ᆫ다/EF ./SF 아주머니가 바구니를 옆구리에 끼우고 걸어간다.
|
||||
바당에 떨어진 갈루럴 빗잘루루 쓴다. 바당__1/NNG 에/JKB 떨어지/VV ᆫ/ETM 갈루__1/NNG 럴/JKO 빗잘루__1/NNG 루/JKB 쓸/VV ᆫ다/EF ./SF 바닥에 떨어진 가루를 빗자루로 쓴다.
|
||||
갓난아이가 오널 돌돌이럴 간다. 갓난아이/NNG 가/JKS 오널__1/NNG 돌돌이__1/NNG 럴/JKO 가/VV ᆫ다/EF ./SF 갓난아이가 오늘 첫나들이를 간다.
|
||||
동무콰 싸우구 오두니 기분이 터지건한가 보다. 동무/NNG 콰/JC 싸우/VV 구/EC 오/VV 두니/EC 기분/NNG 이/JKS 터지건하__1/VA ᆫ가/EC 보/VX 다/EF ./SF 동무와 싸우고 오더니 기분이 트적지근한가 보다.
|
||||
나물얼 물에 담가 씬맛얼 없애자마. 나물/NNG 얼/JKO 물/NNG 에/JKB 담그/VV 어/EC 씬맛__1/NNG 얼/JKO 없애/VV 자마/EF ./SF 나물을 물에 담가 쓴맛을 없애자.
|
||||
그는 기대감으루 가심이 죄릿하였다. 그/NP 는/JX 기대감/NNG 으루/JKB 가심__5/NNG 이/JKS 죄릿하__1/VA 었/EP 다/EF ./SF 그는 기대감으로 가슴이 자릿하였다.
|
||||
그것은 저기 갱사리게 가져다 놓으러마. 그것/NP 은/JX 저기/NP 갱사리__1/NNG 게/JKB 가지/VV 어다/EC 놓/VX 으러마/EF ./SF 그것은 저기 가장자리에 가져다 놓으려무나.
|
||||
아들이 풀콰 돌망구럴 가지구 바깜살이럴 하구 있다. 아__23/NNG 들/XSN 이/JKS 풀/NNG 콰/JC 돌망구__1/NNG 럴/JKO 가지/VV 구/EC 바깜살이__1/NNG 럴/JKO 하/VV 구/EC 있/VX 다/EF ./SF 아이들이 풀과 돌멩이를 가지고 소꿉놀이를 하고 있다.
|
||||
버래에다 남은 쌀얼 담아 놓으러마. 버래__1/NNG 에다/JKB 남/VV 은/ETM 쌀/NNG 얼/JKO 담/VV 어/EC 놓/VX 으러마/EF ./SF 버치에다 남은 쌀을 담아 놓으려무나.
|
||||
짼지럴 칼돔배기에다 놓구 썰었다. 짼지__1/NNG 럴/JKO 칼돔배기__1/NNG 에다/JKB 놓/VV 구/EC 썰/VV 었/EP 다/EF ./SF 짠지를 칼도마에다 놓고 썰었다.
|
||||
동상은 동무와 행께 놀루 나갔다. 동상__1/NNG 은/JX 동무/NNG 와/JKB 행께__1/MAG 놀/VV 루/EC 나가/VV 었/EP 다/EF ./SF 동생은 동무와 함께 놀러 나갔다.
|
||||
뒤르박으루 물얼 길어설라무니 단지에 채워 놓으러마. 뒤르박__1/NNG 으루/JKB 물/NNG 얼/JKO 긷/VV-I 어서/EC ᆯ라무니/EC 단지/NNG 에/JKB 채우/VV 어/EC 놓/VX 으러마/EF ./SF 두레박으로 물을 길어서 단지에 채워 놓으려무나.
|
||||
큰방이 가서나리 옷당보럴 걷어 오나라. 큰방/NNG 이/JKB 가/VV 어서나리/EC 옷당보__1/NNG 럴/JKO 걷/VV-R 어/EC 오/VV 나라/EF ./SF 큰방에 가서 횃댓보를 걷어 오너라.
|
||||
머리에 끼낙지럴 깍 동여맸다. 머리/NNG 에/JKB 끼낙지__1/NNG 럴/JKO 깍__7/MAG 동여매/VV 었/EP 다/EF ./SF 머리에 끈을 꼭 동여맸다.
|
||||
저기 저 볏단얼 매끈으루 묶자요. 저기/NP 저/MM 볏단/NNG 얼/JKO 매끈__2/NNG 으루/JKB 묶/VV 자요/EF ./SF 저기 저 볏단을 매끼로 묶읍시다.
|
||||
콩묵 마이 넣구 지짐이 끓이자이. 콩묵__1/NNG 마이/NNP 넣/VV 구/EC 지짐이/NNG 끓이/VV 자이/EF ./SF 두부 많이 넣고 지짐이 끓이자.
|
||||
아가 돌팡매럴 맞아설라무니 다쳤댜. 아__23/NNG 가/JKS 돌팡매__1/NNG 럴/JKO 맞/VV 어서/EC ᆯ라무니/EC 다치/VV 었/EP 댜/EF ./SF 아이가 돌팔매를 맞아서 다쳤대.
|
||||
저냑꺼정 지벅지에다 물얼 다 채워 놓으러마. 저냑__1/NNG 꺼정/JX 지벅지__1/NNG 에다/JKB 물/NNG 얼/JKO 다/MAG 채우/VV 어/EC 놓/VX 으러마/EF ./SF 저녁까지 물독에다 물을 다 채워 놓으려무나.
|
||||
그 깍다시느 잘 먹지두 않두나. 그/MM 깍다시__1/NNG 느/JX 잘/MAG 먹/VV 지/EC 두/JX 않/VX 두나/EF ./SF 그 말라깽이는 잘 먹지도 않더구나.
|
||||
돈은 개벽이다가 잘 넣으러마. 돈/NNG 은/JX 개벽__6/NNG 이다가/JKB 잘/MAG 넣/VV 으러마/EF ./SF 돈은 주머니에다가 잘 넣으려무나.
|
||||
강아지럴 혼달궜두니 구석이 숨어 베렸다. 강아지/NNG 럴/JKO 혼달구__1/VV 었/EP 두니/EC 구석/NNG 이/JKB 숨/VV 어/EC 베리__1/VX 었/EP 다/EF ./SF 강아지를 혼냈더니 구석에 숨어 버렸다.
|
||||
으른덜 충고럴 잘 예겨들어라. 으른/NNG 덜/XSN 충고/NNG 럴/JKO 잘/MAG 예기__1/VV 어/EC 듣/VV-I 어라/EF ./SF 어른들 충고를 잘 여겨들어라.
|
||||
그 아는 생김새는 안 그란데 하넌 짓이 별랗다. 그/MM 아__23/NNG 는/JX 생김새/NNG 는/JX 안/MAG 그랗/VA ᆫ데/EC 하/VV 넌/ETM 짓/NNG 이/JKS 별랗/VA-I 다/EF ./SF 그 아이는 생김새는 안 그런데 하는 짓이 별나다.
|
||||
암탈기가 펭아리럴 품구 있다. 암탈기__1/NNG 가/JKS 펭아리__1/NNG 럴/JKO 품/VV 구/EC 있/VX 다/EF ./SF 암탉이 병아리를 품고 있다.
|
||||
동상이 성 패이럴 쑝톨했다. 동상__/NNG 이/JKS 성__5/NNG 패이__1/NNG 럴/JKO 쑝톨하__1/VV 었/EP 다/EF ./SF 동생이 형 팽이를 훔쳤다.
|
||||
국마룩만 먹지 말구 군덕지두 좀 먹으러마. 국마룩__1/NNG 만/JX 먹/VV 지/EC 말/VX 구/EC 군덕지__1/NNG 두/JX 좀/MAG 먹/VV 으러마/EF ./SF 국물만 먹지 말고 건더기도 좀 먹으려무나.
|
||||
아들은 온할레럴 배깥서 보낸다. 아들/NNG 은/JX 온할레__1/NNG 럴/JKO 배깥__1/NNG 서/JKB 보내/VV ᆫ다/EF ./SF 아이들은 온종일을 바깥에서 보낸다.
|
||||
나는 식성이 패로워서나무리 국수만 잘 묵는다. 나/NP 는/JX 식성/NNG 이/JKS 패롭__1/VA-I 어서/EC 나무리/EC 국수/NNG 만/JX 잘/MAG 묵__4/VV 는다/EF ./SF 나는 식성이 까다로워서 국수만 잘 먹는다.
|
||||
밭에 나가 풀얼 변다. 밭/NNG 에/JKB 나가/VV 어/EC 풀/NNG 얼/JKO 벼__1/VV ᆫ다/EF ./SF 밭에 나가 풀을 벤다.
|
||||
나는 갭차기서 굠얼 꺼내 동상한데 주었다. 나/NP 는/JX 갭차기__1/NNG 서/JKB 굠__1/NNG 얼/JKO 꺼내/VV 어/EC 동상__1/NNG 한데/JKB 주/VV 었/EP 다/EF ./SF 나는 주머니에서 고욤을 꺼내 동생한테 주었다.
|
||||
그 사램이 내 주머니럴 쏭해서 달아났다. 그/MM 사램__1/NNG 이/JKS 나/NP 의/JKG 주머니/NNG 럴/JKO 쏭하__1/VV 어서/EC 달아나/VV 었/EP 다/EF ./SF 그 사람이 내 주머니를 훔쳐서 달아났다.
|
||||
방이 돼지우랑치럼 찌끈하다. 방/NNG 이/JKS 돼지우랑__1/NNG 치럼/JKB 찌끈하__4/VA-I 다/EF ./SF 방이 돼지우리처럼 더럽다.
|
||||
넘얼 욕하는 말언 아씨 무시하러마. 넘__2/NNG 얼/JKO 욕하/VV 는/ETM 말/NNG 언/JX 아씨__2/MAG 무시/NNG 하/XSV 러마/EF ./SF 남을 욕하는 말은 아예 무시하려무나.
|
||||
아는 바금태기럴 팡갈해 두구 밖으루 놀러 나갔다. 아__23/NNG 는/JX 바금태기__1/NNG 럴/JKO 팡갈하__1/VV 어/EC 두/VX 구/EC 밖/NNG 으루/JKB 놀/VV 러/EC 나가/VV 었/EP 다/EF ./SF 아이는 바구니를 팽개쳐 두고 밖으로 놀러 나갔다.
|
||||
비가 오두니 강냉이래 게유 한 뼘 자랐다. 비/NNG 가/JKS 오/VV 두니/EC 강냉__1/NNG 이래/JKS 게유__2/MAG 한/MM 뼘/NNB 자라/VV 었/EP 다/EF ./SF 비가 오더니 옥수수가 겨우 한 뼘 자랐다.
|
||||
불 때는 아궁이에 구들장 놓고 헉으로 발르구. 불/NNG 때/VV 는/ETM 아궁이/NNG 에/JKB 구들장/NNG 놓/VV 고/EC 헉__4/NNG 으로/JKB 발르__1/VV 구/EF ./SF 불 때는 아궁이에 구들장 놓고 흙으로 바르구.
|
||||
오늘 저냑에는 쑥갇얼 넣구 국마룩얼 낋여 먹었수다레. 오늘/NNG 저냑__1/NNG 에/JKB 는/JX 쑥갇__1/NNG 얼/JKO 넣/VV 구/EC 국마룩__1/NNG 얼/JKO 낋이/VV 어/EC 먹/VV 었/EP 수다레/EF ./SF 오늘 저녁에는 쑥갓을 넣고 국을 끓여 먹었습니다.
|
||||
건거이가 샬 맹태다. 건거이/NNG 가/JKS 샬__2/NNG 맹태__1/VA-I 다/EF ./SF 반찬이 조금 싱겁다.
|
||||
동상이 성에게 감재럴 뺏걸렸다. 동상__1/NNG 이/JKS 성__5/NNG 에게/JKB 감재__1/NNG 럴/JKO 뺏걸리__1/VV 었/EP 다/EF ./SF 동생이 형에게 감자를 빼앗겼다.
|
||||
그 아는 실수 한 번우루 넘으 입지가리에 오르내렸다. 그/MM 아__23/NNG 는/JX 실수/NNG 한/MM 번/NNB 우루/JKB 넘__2/NNG 으/EC 입지가리__1/NNG 에/JKB 오르내리/VV 었/EP 다/EF ./SF 그 아이는 실수 한 번으로 남의 입길에 오르내렸다.
|
||||
식량이 세날밖이 없으니까니 애껴 묵어야 한다. 식량/NNG 이/JKS 세날__1/NNG 밖/NNG 이/JKB 없/VA 으니까니/EC 애끼__1/VV 어/EC 묵__4/VV 어야/EC 하/VX ᆫ다/EF ./SF 식량이 조금밖에 없으니까 아껴 먹어야 한다.
|
||||
아가 장헉으루 인형얼 맨든다. 아__23/NNG 가/JKS 장헉__1/NNG 으루/JKB 인형/NNG 얼/JKO 맨들__3/VV ᆫ다/EF ./SF 아이가 찰흙으로 인형을 만든다.
|
||||
겹우테만 입었데니 으슬으슬하다. 겹우테__1/NNG 만/JX 입/VV-R 었/EP 데니/EC 으슬으슬/MAG 하/XSA 다/EF ./SF 겹옷만 입었더니 으슬으슬하다.
|
||||
비가 오니까니 아덜은 인침 집이루 돌아왔다. 비/NNG 가/JKS 오/VV 니까니/EC 아__23/NNG 덜/XSN 은/JX 인침__3/MAG 집/NNG 이루/JKB 돌아오/VV 었/EP 다/EF ./SF 비가 오니까 아이들은 이내 집으로 돌아왔다.
|
||||
날이 풀리이 논이서 먹자구리가 시끄럽게 운다. 날/NNG 이/JKS 풀리/VV 이/EC 논/NNG 이서/JKB 먹자구리__1/NNG 가/JKS 시끄럽/VA-I 게/EC 울/VV ᆫ다/EF ./SF 날이 풀리니 논에서 개구리가 시끄럽게 운다.
|
||||
아덜이 개골이서 진채비럴 잡구 있수다레. 아__23/NNG 덜/XSN 이/JKS 개골__3/NNG 이서/JKB 진채비__1/NNG 럴/JKO 잡/VV-R 구/EC 있/VX 수다레/EF ./SF 아이들이 개울에서 잔고기를 잡고 있습니다.
|
||||
내 셈으루 이 바우는 들지 못한다. 나/NP 의/JKG 셈__13/NNG 으루/JKB 이/MM 바우__1/NNG 는/JX 들/VV 지/EC 못하/VX ᆫ다/EF ./SF 내 힘으로 이 바위는 들지 못한다.
|
||||
밭일 시딱 끝내구 밥 묵자야. 밭일/NNG 시딱__1/MAG 끝내/VV 구/EC 밥/NNG 묵__4/VV 자/EF 이/VCP 야/EF ./SF 밭일 후딱 끝내고 밥 먹자.
|
||||
아가 팔꼬배럴 괴구 앉았다. 아__23/NNG 가/JKS 팔꼬배__1/NNG 럴/JKO 괴/VV 구/EC 앉/VV 었/EP 다/EF ./SF 아이가 팔꿈치를 괴고 앉았다.
|
||||
그는 괴기럴 집쑷고는 인침 샘키었다. 그/NP 는/JX 괴기__6/NNG 럴/JKO 집쑷__1/VV-R 고/EC 는/JX 인침__3/MAG 샘키/VV 었/EP 다/EF ./SF 그는 고기를 짓씹고는 이내 삼키었다.
|
||||
난 동구막질하고 싶은 마엄이 쌸도 없어야. 나/NP ᆫ/JX 동구막질__1/NNG 하/XSV 고/EC 싶/VX 은/ETM 마엄/NNG 이/JKS 쌸__1/NNG 도/JX 없/VA 어야/EF ./SF 난 소꿉놀이하고 싶은 마음이 조금도 없어.
|
||||
이 무느 턱장없이 비싸두나. 이/MM 무/NNG 느/JX 턱장없이__1/MAG 비싸/VA 두나/EF ./SF 이 무는 턱없이 비싸더구나.
|
||||
우리 동네 아이들이 숨귀박질얼 헌다. 우리/NP 동네/NNG 아이/NNG 들/XSN 이/JKS 숨귀박질__1/NNG 얼/JKO 허/VV ᆫ다/EF ./SF 우리 동네 아이들이 숨바꼭질을 한다.
|
||||
뙹그만 거 먹는 게, 우려서 아린 맛이야 덜하갓지. 뙹그마__1/VA ᆫ/ETM 거/NNB 먹/VV 는/ETM 것/NNB 이/JKS ,/SP 우리/VV 어서/EC 아리/VA ᆫ/ETM 맛/NNG 이야/JX 덜/MAG 하/VV 갓/EP 지/EF ./SF 똥그란 거 먹는 게, 우려서 아린 맛이야 덜하겠지.
|
||||
나는 그 녀자의 우티가 발가웠다. 나/NP 는/JX 그/MM 녀자/NNG 의/JKG 우티__1/NNG 가/JKS 발갑__1/VA-I 었/EP 다/EF ./SF 나는 그 여자의 옷이 부러웠다.
|
||||
이자 쌀쉬수도 세날 남았수다레. 이자__1/MAG 쌀쉬수__1/NNG 도/JX 세날__1/NNG 남/VV 었/EP 수다레/EF ./SF 이제 쌀수수도 조금 남았습니다.
|
||||
배깥이 마이 취우니 나가지 말래라. 배깥__1/NNG 이/JKS 마이__1/MAG 췹__1/VA-I 으니/EC 나가/VV 지/EC 말/VX 래라/EF ./SF 바깥이 많이 추우니 나가지 말라고 해라.
|
||||
저냑이 되어 동구막질은 허지부지 끝났다. 저냑__1/NNG 이/JKC 되/VV 어/EC 동구막질__1/NNG 은/JX 허지부지__1/MAG 끝나/VV 었/EP 다/EF ./SF 저녁이 되어 소꿉놀이는 흐지부지 끝났다.
|
||||
한냠은 열여섯에 우리 아바니럴 낳았다. 한냠__1/NNG 은/NNG 열/NR 여섯/NR 에/JKB 우리/NP 아바니__1/NNG 럴/JKO 낳/VV 었/EP 다/EF ./SF 할머니는 열여섯에 우리 아버지를 낳았다.
|
||||
아는 오마니 앞이서 책얼 줄줄 외었다. 아__23/NNG 는/JX 오마니__1/NNG 앞/NNG 이서/JKB 책/NNG 얼/JKO 줄줄/MAG 외우/VV 었/EP 다/EF ./SF 아이는 어머니 앞에서 책을 줄줄 외웠다.
|
||||
짐치가 맹태니까니 샤우젇얼 더 넣으러마. 짐치__1/NNG 가/JKS 맹태__1/VA 니까니/EC 샤우젇__1/NNG 얼/JKO 더/MAG 넣/VV 으러마/EF ./SF 김치가 싱거우니까 새우젓을 더 넣으려무나.
|
||||
그 아자씨는 우리 집이서 허푸살이럴 하든 사람이었다. 그/MM 아자씨__1/NNG 는/JX 우리/NP 집/NNG 이서/JKB 허푸살이__1/NNG 럴/JKO 하/VV 든/ETM 사람/NNG 이/VCP 었/EP 다/EF ./SF 그 아저씨는 우리 집에서 머슴살이를 하던 사람이었다.
|
||||
밤얼 꼬똑 새서나리 바느질얼 했다. 밤/NNG 얼/JKO 꼬똑__1/MAG 새/VV 어서나리/EC 바느질/NNG 얼/JKO 하/VV 었/EP 다/EF ./SF 밤을 꼬박 새서 바느질을 했다.
|
||||
여태끈 집이 안 가구 뭐 하네? 여태끈__1/MAG 집/NNG 이/JKB 안/MAG 가/VV 구/EC 뭐/NP 하/VV 네/EF ?/SF 여태껏 집에 안 가고 뭐 하니?
|
||||
국마락이 맹태니까니 소곰얼 타서 먹으러마. 국마락__1/NNG 이/JKS 맹태__1/VA 니까니/EC 소곰__3/NNG 얼/JKO 타/VV 어서/EC 먹/VV 으러마/EF ./SF 국물이 싱거우니까 소금을 타서 먹으려무나.
|
||||
아바니는 떠락지에 장재기럴 쌓아 두었다. 아바니__1/NNG 는/JX 떠락지__1/NNG 에/JKB 장재기__1/NNG 럴/JKO 쌓/VV 어/EC 두/VX 었/EP 다/EF ./SF 아버지는 뜨락에 장작을 쌓아 두었다.
|
||||
얻어먹기 트사스러워서 기냥 안 먹는다. 얻어먹/VV 기/ETN 트사스럽__1/VA-I 어서/EC 기냥__1/MAG 안/MAG 먹/VV 는다/EF ./SF 얻어먹기 치사스러워서 그냥 안 먹는다.
|
||||
아가 놀래서나리 묵던 것얼 꼴뚝 넘겼다. 아__23/NNG 가/JKS 놀래/VV 어서나리/EC 묵__4/VV 던/ETM 것/NNB 얼/JKO 꼴뚝__1/MAG 넘기/VV 었/EP 다/EF ./SF 아이가 놀래서 먹던 것을 꼴깍 넘겼다.
|
||||
코찔찔이가 그 길자럴 어찌 알갔니? 코찔찔이__1/NNG 가/JKS 그/MM 길자__1/NNG 럴/JKO 어찌/MAG 알/VV 갔/EP 니/EF ?/SF 코흘리개가 그 글자를 어찌 알겠니?
|
||||
바즈래기 넣구 뜨더국 낋여 줄게. 바즈래기__1/NNG 넣/VV 구/EC 뜨더국/NNG 낋이__1/VV 어/EC 주/VX ᆯ게/EF ./SF 바지락 넣고 수제비 끓여 줄게.
|
||||
불얼 오래 피웠드니 피겁다. 불/NNG 얼/JKO 오래/MAG 피우/VV 었/EP 드니/EC 피겁__1/VA-R 다/EF ./SF 불을 오래 피웠더니 냅다.
|
||||
구뚜막에 노그제럴 잘 닦아 놓으러마. 구뚜막__1/NNG 에/JKB 노그제__1/NNG 럴/JKO 잘/MAG 닦/VV 어/EC 놓/VX 으러마/EF ./SF 부뚜막에 가마솥을 잘 닦아 놓으려무나.
|
||||
서두르디 말구 노낭 오나라. 서두르/VV 디/EC 말/VV 구/EC 노낭__1/MAG 오/VV 나라/EF ./SF 서두르지 말고 천천히 오너라.
|
||||
여기서는 다 품깝 받는다고 해. 여기/NP 서/JKB 는/JX 다/MAG 품깝__1/NNG 받/VV-R 는다고/EC 하/VV 어/EF ./SF 여기서는 다 품값 받는다고 해.
|
||||
사가 사구 서파 잘 챙겨 오나라. 사가__15/NNG 사/VV 구/EC 서파__4/NNG 잘/MAG 챙기/VV 어/EC 오/VV 나라/EF ./SF 사과 사고 거스름 잘 챙겨 오너라.
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
집이 가글랑 펜지 자직 헤라. 집/NNG 이/JKB 가/VV 글랑/EC 펜지__1/NNG 자직__1/MAG ᄒᆞ/VV 어라/EF ./SF 집에 가거든 편지 자주 해라.
|
||||
벳복지를 두드리는 거 보난 하영 먹어진 셍이라. 벳복지__1/NNG 를/JKO 두드리/VV 는/ETM 거/NNB 보/VV 난/EC 하영__1/MAG 먹/VV 어/EC 지/VX ᆫ/ETM 셍__2/NNB 이/VCP 라/EF ./SF 배때기를 두드리는 것을 보니 많이 먹은 모양이야.
|
||||
약주 ᄒᆞᆫ잔 드셧수과? 얼굴이 발강헷수다. 약주/NNG ᄒᆞᆫ/MM 잔/NNB 드시/VV 엇/EP 수과/EF ?/SF 얼굴/NNG 이/JKS 발강하__1/VA 엇/EP 수다/EF ./SF 약주 한잔 드셨습니까? 얼굴이 발갛습니다.
|
||||
회사에서 어떵 ᄒᆞᆫ 자리라도 올라부터 보젠 아부를 ᄒᆞ는 셍이라. 회사/NNG 에서/JKB 어떵/MAG ᄒᆞᆫ/MM 자리/NNG 라도/JX 오르/VV 어/EC 붙/VV 어/EC 보/VX 젠/EC 아부/NNG 를/JKO ᄒᆞ/VV 는/ETM 셍__2/NNB 이/VCP 라/EF ./SF 회사에서 어떻게든 한 자리라도 승진해 보려고 아부를 하는 모양이야.
|
||||
아방이 버을이가 씨원치 안ᄒᆞ영 매날 걱정이 이만저만이 아니란게. 아방__2/NNG 이/JKS 버을이__1/NNG 가/JKS 씨원/XR 하/XSA 지/EC 안/MAG ᄒᆞ/VX 엉/EC 매__30/MM 날/NNG 걱정/NNG 이/JKS 이만저만/NNG 이/JKC 아니/VCN 란게/EF ./SF 아버지가 벌이가 시원치 않아서 맨날 걱정이 이만저만이 아니더라.
|
||||
질에염에 이신 창고는 강쳉이에도 갖아마씸. 질에염__1/NNG 에/JKB 잇__7/VV-R ᆫ/ETM 창고/NNG 는/JX 강쳉이/NNG 에/JKB 도/JX 갖__15/VA 아/EF 마씸/JX ./SF 길옆에 있는 창고는 갑자기 이는 바람에도 말짱해요.
|
||||
돗통시에 강 일 보젠 ᄒᆞ민 ᄒᆞᆫ착 손에 낭대기 심엉 뒈야지 다울리멍 헤낫저. 돗통시__1/NNG 에/JKB 가/VV 엉/EC 일/NNG 보/VV 젠/EC ᄒᆞ/VV 민/EC ᄒᆞᆫ착/NNG 손/NNG 에/JKB 낭대기__1/NNG 심__6/VV 엉/EC 뒈야지__1/NNG 다울리__1/VV 멍/EC ᄒᆞ/VV 어낫/EP 저/EF ./SF 돼지우리에 가서 일을 보려고 하면 한쪽 손에 막대기 들고 돼지 쫓으면서 했었어.
|
||||
자오를 말라. 자오__5/NNG 를/JKO 말/VV 라/EF ./SF 자랑을 마라.
|
||||
비제기떡이나 부쳔 쏘주나 한잔헙주예. 비제기떡__1/NNG 이나/JX 부치/VV 언/EC 쏘주/NNG 나/JX 한/MM 잔/NNG ᄒᆞ/VV ᆸ주/EF 예/JX ./SF 비지떡이나 부쳐서 소주나 한잔합시다.
|
||||
부체님안티 빌엉 난 아덜이여. 부체님__1/NNG 안티/JKB 빌/VV 엉/EC 낳/VV ᆫ/ETM 아덜__1/NNG 이/VCP 여/EF ./SF 부처님한테 빌어서 낳은 아들이다.
|
||||
우리 아덜은 난 보난 배안엣머리가 거멍케 낫어라. 우리/NP 아덜__1/NNG 은/JX 낳/VV ᆫ/ETM 보/VX 난/EC 배안엣머리__1/NNG 가/JKS 거멍하/VA 게/EC 나/VV 엇/EP 어라/EF ./SF 우리 아들은 낳고 보니 배냇머리가 꺼멓게 났더라.
|
||||
아기 날 때 아기가 허연 가루 썽 나온덴 만삭 땐 가를음식 먹지 말렌 허지. 아기/NNG 낳/VV ᆯ/ETM 때/NNG 아기/NNG 가/JKS 허옇/VA-I ᆫ/ETM 가루/NNG 쓰/VV 엉/EC 나오/VV ᆫ덴/EC 만삭/NNG 때/NNG ᆫ/JX 가를음식__1/NNG 먹/VV 지/EC 말/VX 렌/EC 허/VV 지/EF ./SF 아기 낳을 때 아기가 하얀 가루를 쓰고 나온다고 만삭 땐 가루음식 먹지 말라고 하지.
|
||||
옛날사 우물통에 강 물 질어당 먹엇주마는 지금사 무사 심들어? 옛날/NNG 사/JX 우물통__2/NNG 에/JKB 가/VV 엉/EC 물/NNG 질/VV 어당/EC 먹/VV 엇/EP 주마는/EC 지금/MAG 사/JX 무사__1/MAG 심들/VA 어/EF ?/SF 옛날이야 박우물에 가서 물 길어다 먹었지만 지금이야 왜 힘들어?
|
||||
아으덜이 폭낭에서 올락나력 정신엇이 놀암서라. 아으__3/NNG 덜/XSN 이/JKS 폭낭__1/NNG 에서/JKB 올락나력__1/MAG 정신/NNG 엇__2/VA 이/EC 놀/VV 어ᇝ/EP 어라/EF ./SF 아이들이 팽나무에서 오르락내리락 정신없이 놀고 있더라.
|
||||
올레 신 복송게낭에 올린 멧 개 안 열앗어라. 올레/NNG 싯__1/VV ᆫ/ETM 복송게낭__1/NNG 에/JKB 올리__2/NNG ᆫ/JX 멧/NR 개/NNB 안/MAG 열/NNG 엇/EP 어라/EF ./SF 집 앞 골목에 있는 복숭아나무에 올해는 몇 개 안 열렸더라.
|
||||
쉐 질메 놓젠 ᄒᆞ민 배때기보단 가슴이 둘레가 족으난 그딜 오량으로 고정시키는 거라게. 쉐__4/NNG 질메__1/NNG 놓/VV 젠/EC ᄒᆞ/VX 민/EC 배때기/NNG 보다/JKB ᆫ/JX 가슴/NNG 이/JKS 둘레/NNG 가/JKS 족__1/VA 으난/EC 그디__2/NP ᆯ/JKO 오량__2/NNG 으로/JKB 고정/NNG 시키/XSV 는/ETM 거/NNB 이/VCP 라게/EF ./SF 소에 길마 얹으려고 하면 배보다 가슴이 둘레가 작으니까 거기를 뱃대끈으로 고정시키는 거야.
|
||||
그레 안즈지 말앙 이레 오라. 그레/MAG 안즈__1/VV 지/EC 말/VX 엉/EC 이레__3/MAG 오/VV 라/EF ./SF 거기에 앉지 말고 이리로 오너라.
|
||||
껏버렝이처룩 ᄉᆞᆷ은 북각신을 신엄직도 ᄒᆞ다. 껏버렝이/NNG 처룩/JKB ᄉᆞᆷ/VV 은/ETM 북각신__1/NNG 을/JKO 신/VV 엄직/EC 도/JX ᄒᆞ/VV 다/EF ./SF 껍질을 벗지 않은 벌레처럼 삼은 털신을 신을 만도 하다.
|
||||
그디서 과짝 올라오는 길이 가차웁지. 그디__2/NP 서/JKB 과짝__1/MAG 올라오/VV 는/ETM 길/NNG 이/JKS 가차웁__1/VA-I 지/EF ./SF 거기서 똑바로 올라오는 길이 가깝지.
|
||||
늙은 호박으로 국이라도 헹 먹젠 ᄒᆞ민 먼처 어울을 긁어내사지. 늙/VV 은/ETM 호박/NNG 으로/JKB 국/NNG 이/VCP 라도/EC ᄒᆞ/VV 엉/EC 먹/VV 젠/EC ᄒᆞ/VX 민/EC 먼처__2/MAG 어울__1/NNG 을/JKO 긁어내/VV 어사지/EF ./SF 늙은 호박으로 국이라도 해서 먹으려고 하면 먼저 속을 긁어내야지.
|
||||
옷을 판찍 입엉 갓어. 옷/NNG 을/JKO 판찍__1/MAG 입/VV-R 엉/EC 가/VV 엇/EP 어/EF ./SF 옷을 말끔히 입고서 갔어.
|
||||
이 바당궤기가 덜 쫍지롱헤시믄 좋키여. 이/MM 바당궤기__1/NNG 가/JKS 덜/MAG 쫍지롱/XR ᄒᆞ/XSV 엇/EP 으믄/EC 좋/VA 크/EP 어/EF ./SF 이 바닷고기가 덜 짭짜랬으면 좋겠다.
|
||||
무사 경 부에 낭 밍겡이헴시니? 무사__1/MAG 경__1/MAG 부에__5/NNG 나/VV 엉/EC 밍겡이/NNG ᄒᆞ/XSV 어ᇝ/EP 으니/EF ?/SF 왜 그리 부아가 나서 트집하느냐?
|
||||
항에 물 거둑고 ᄒᆞ영 지뻐 감쭈. 항__5/NNG 에/JKB 물/NNG 거둑__1/VV 고/EC ᄒᆞ/VX 엉/EC 지쁘__1/VA 어/EC 가/VV 어ᇝ/EP 주/EF ./SF 항아리에 물 차고 해서 기뻐서 가지요.
|
||||
나 머린 멘들멘들 깎인 거마씨. 나/NP 머리/NNG ᆫ/JX 멘들멘들__2/MAG 깎이/VV ᆫ/ETM 거/NNB 마씨/JX ./SF 내 머리는 매끈매끈 깎인 것입니다.
|
||||
가네 둘은 심이 가르닥하주. 가/NP 네/XSN 둘/NR 은/JX 심__3/NNG 이/JKS 가르닥하__1/VA 주/EF ./SF 걔네 둘은 힘이 팽팽하지.
|
||||
이건 먹구실낭 아니우꽈? 이거/NP ᆫ/JX 먹구실낭__1/NNG 아니/VCN 우꽈/EF ?/SF 이것은 멀구슬나무 아닙니까?
|
||||
나는 그 음식을 음작음작 먹엇주. 나/NP 는/JX 그/MM 음식/NNG 을/JKO 음작음작__1/MAG 먹/VV 엇/EP 주/EF ./SF 나는 그 음식을 우물우물 먹었지.
|
||||
작년에 입어난 바진디 오돌랑한 거 보난 지레가 하영 큰 셍이라. 작년/NNG 에/JKB 입/VV-R 어나/EP ᆫ/ETM 바지/NNG 이/VCP ᆫ디/EC 오돌랑하__1/VA ᆫ/ETM 거/NNB 보/VV 난/EC 지레__3/NNG 가/JKS 하영__1/MAG 크/VV ᆫ/ETM 셍__2/NNB 이/VCP 라/EF ./SF 작년에 입었던 바지인데 껑충한 것을 보니 키가 많이 큰 모양이야.
|
||||
낭이 잘 자라젠 ᄒᆞ민 알거시려 줘사주게. 낭__2/NNG 이/JKS 잘/MAG 자라/VV 젠/EC ᄒᆞ/VX 민/EC 알거시리__1/VV 어/EC 주/VX 어사/EC 주/EF 게/EF ./SF 나무가 잘 자라려고 하면 가지치기해 줘야지.
|
||||
보릿낭을 긏앙 입에 대영 불민 소리가 나는디 걸 보리피리렌 ᄀᆞᆮ주. 보릿낭__1/NNG 을/JKO 긏/VV 엉/EC 입/NNG 에/JKB 대/VV 엉/EC 불/VV 민/EC 소리/NNG 가/JKS 나/VV 는디/EC 거/NP ᆯ/JKO 보리피리/NNG 이/VCP 렌/EC ᄀᆞᆮ/VV-I 주/EF ./SF 보릿짚을 잘라서 입에 대고 불면 소리가 나는데 그걸 보리피리라고 말하지.
|
||||
부리땡이에 데나네 조심허라. 부리땡이__1/NNG 에/JKB 데/VV 나네/EC 조심/NNG ᄒᆞ/XSV 어라/EF ./SF 부지깽이에 데니까 조심해라.
|
||||
친구덜끼리 모연 춤추곡 놀레 부르곡 잠베질하곡 놀앗주게. 친구/NNG 덜/XSN 끼리/XSN 모이/VV 언/EC 춤추/VV 곡/EC 놀래__1/NNG 부르/VV 곡/EC 잠베질하__1/VV 곡/EC 놀/VV 엇/EP 주/EF 게/EF ./SF 친구들끼리 모여서 춤추고 노래하고 재잘거리고 놀았지요.
|
||||
보리 ᄀᆞᆯ앙 보리ᄊᆞᆯ은 사름 먹곡 보리체는 쉐나 뒈지 것으로 주곡 헷엇지. 보리/NNG ᄀᆞᆯ__2/VV 엉/EC 보리/NNG ᄊᆞᆯ/NNG 은/JX 사름__2/NNG 먹/VV 곡/EC 보리/NNG 체/NNG 는/JX 쉐__4/NNG 나/JC 뒈지__1/NNG 것__7/NNG 으로/JKB 주/VV 곡/EC ᄒᆞ/VX 엇엇/EP 지/EF ./SF 보리 갈아서 보리쌀은 사람 먹고 보리체는 소나 돼지 먹이로 주고 했었지.
|
||||
이제 그 일을 건장하여사키여. 이제/MAG 그/MM 일/NNG 을/JKO 건장하__2/VV 어사/EC 크/EP 어/EF ./SF 이제 그 일을 그만두어야겠다.
|
||||
웃드르 ᄌᆞᆨ은집 할망은 성질머리가 궤약하주게. 웃드르__1/NNG ᄌᆞᆨ/VA 은/ETM 집/NNG 할망__1/NNG 은/JX 성질/NNG 머리/NNG 가/JKS 궤약하__1/VA 주/EF 게/EF ./SF 윗마을 작은집 할머니는 성질이 고약하다.
|
||||
ᄒᆞᄊᆞᆯ 싱거우난 소금 아쓱만 뿌려 불라. ᄒᆞᄊᆞᆯ/MAG 싱겁/VA-I 으난/EC 소금/NNG 아쓱__2/MAG 만/JX 뿌리/VV 어/EC 불__11/VX 라/EF ./SF 조금 싱거우니 소금 조금만 뿌려 버려라.
|
||||
새각시덜은 고부랑건지허곡 가메 탕 잔칫날 아칙이 신랑집이 갓어. 새각시__1/NNG 덜/XSN 은/JX 고부랑건지__1/NNG ᄒᆞ/XSV 곡/EC 가메__2/NNG 타/VV 엉/EC 잔칫날/NNG 아칙__1/NNG 이/JKB 신랑/NNG 집/NNG 이/JKB 가/VV 엇/EP 어/EF ./SF 새색시는 얹은머리하고 가마 타고 잔칫날 아침에 신랑집에 갔어.
|
||||
요새사 역불로 벨을 보레 어디 가곡 헴쭈만은 옛날사 경헐 저르도 엇을뿐더러 마당에만 사도 봐졋주. 요새/NNG 사/JX 역불로__1/MAG 벨__9/NNG 을/JKO 보/VV 레/EC 어디/NP 가/VV 곡/EC ᄒᆞ/XSV 어ᇝ/EP 주만/EC 은/JX 옛날/NNG 사/JX 경ᄒᆞ/VA ᆯ/ETM 저르__1/NNB 도/JX 엇__2/VA 을/ETM 뿐/NNB 더러/JKB 마당/NNG 에/JKB 만/JX 사__8/VV 도/EC 보/VV 어/EC 지/VX 엇/EP 주/EF ./SF 요새야 일부러 별을 보러 어디 가고 하지만 옛날이야 그렇게 할 겨를도 없을뿐더러 마당에만 서도 볼 수 있었지.
|
||||
우리 손지 너미 받앙 키와부난 버렁거지가 엇덴 욕 들엄실지도 몰르크라. 우리/NP 손지__4/NNG 너미__3/MAG 받/VV-R 엉/EC 키와__1/VV 어/EC 불__11/VX 난/EC 버렁거지__1/NNG 가/JKS 엇__2/VA 덴/EC 욕/NNG 들/VV 어ᇝ/EP 을지/EC 도/JX 몰르__2/VV 크/EP 라/EF ./SF 우리 손자 너무 받아 주며 키워서 버릇이 없다고 욕 듣고 있을지도 모르겠다.
|
||||
올금년은 삼재 들어시메 하간 것에 다 멩심헤사 뒈여. 올금년__1/NNG 은/JX 삼재/NNG 들/VV 엇/EP 으메/EC 하간__2/MM 것/NNB 에/JKB 다/MAG 멩심__1/NNG ᄒᆞ/XSV 어사/EC 뒈__3/VV 어/EF ./SF 금년은 삼재 들었으니 모든 것에 다 조심해야 돼.
|
||||
그 집이 아덜 지 ᄆᆞᆷ에 든 거 가지지 못 하난 악살하멍 장난 아닙디다. 그/MM 집/NNG 이/JKG 아덜__1/NNG 지__50/NP ᄆᆞᆷ/NNG 에/JKB 들/VV ᆫ/ETM 거/NNB 가지/VV 지/EC 못/MAG 하/VV 난/EC 악살하__1/VV 멍/EC 장난/NNG 아니/VCN ᆸ디다/EF ./SF 그 집의 아들 자기 마음에 든 거 가지지 못 하니까 앙탈하며 장난 아니던데요.
|
||||
멩심ᄒᆞ민 멩심 덕이 싯다. 멩심__1/NNG ᄒᆞ/XSV 민/EC 멩심__1/NNG 덕/NNG 이/JKS 싯__1/VV-R 다/EF ./SF 명심하면 명심 덕이 있다.
|
||||
경 가로상 이시민 쉐가 찔른다. 경__1/MAG 가로사__1/VV 엉/EC 잇__7/VV-R 으민/EC 쉐__4/NNG 가/JKS 찔르__1/VV ᆫ다/EF ./SF 그렇게 길을 가로막고 서 있으면 소가 찌른다.
|
||||
ᄀᆞ치덜 음식을 먹어 놓고 어떤 사름은 두드러기가 나곡 어떤 사름은 펜지롱 잠만 잘 잤주. ᄀᆞ치/MAG 덜/XSN 음식/NNG 을/JKO 먹/VV 어/EC 놓/VX 고/EC 어떤/MM 사름__2/NNG 은/JX 두드러기/NNG 가/JKS 나/VV 곡/EC 어떤/MM 사름__2/NNG 은/JX 펜지롱__1/MAG 잠/NNG 만/JX 잘/MAG 자/VV 었/EP 주/EF ./SF 같이들 음식을 먹어 놓고 어떤 사람은 두드러기가 나고 어떤 사람은 말짱히 잠만 잘 잤지.
|
||||
미깡 하영 욜앙 낭가쟁이 칮어지켜. 미깡__1/NNG 하영__1/MAG 욜__1/VV 엉/EC 낭가쟁이__1/NNG 칮어지__1/VV 크/EP 어/EF ./SF 귤이 많이 열려서 나뭇가지가 찢어지겠다.
|
||||
게메마시, 모리 날쎄가 좋을지 몰르쿠다. 게메마시__1/IC ,/SP 모리__15/NNG 날쎄__1/NNG 가/JKS 좋/VA 을지/EC 몰르__2/VV 크/EP 우다/EF ./SF 글쎄요, 모레 날씨가 좋을지 모르겠습니다.
|
||||
게난 이제 젊은 사름덜 그 한북 입젠 허민 다림 칠 줄 몰르난 단추 달안 나왓는디. 게난/MAJ 이제/MAG 젊/VA 은/ETM 사름__2/NNG 덜/XSN 그/MM 한북/NNG 입/VV-R 젠/EC ᄒᆞ/VX 민/EC 다림__4/NNG 치/VV ᆯ/ETM 줄/NNB 몰르__2/VV 난/EC 단추/NNG 달/VV 안/EC 나오/VV 엇/EP 는디/EF ./SF 그러니까 이제 젊은 사람들 그 한복 입으려고 하면 대님 맬 줄 모르니까 단추 달아서 나왔는데.
|
||||
우리 아덜이 베염옷 벗듯이 옷 벗엉 방에 나둿어라. 우리/NP 아덜__1/NNG 이/JKS 베염옷__1/NNG 벗/VV-R 듯이/EC 옷/NNG 벗/VV-R 엉/EC 방/NNG 에/JKB 나두__1/VV 엇/EP 어라/EF ./SF 우리 아들이 사퇴 벗듯이 옷을 벗어서 방에 놔두었더라.
|
||||
어른들이 제 보레 왓당 혼이라도 냇는 생이주. 어른/NNG 들/XSN 이/JKS 제/NNG 보/VV 레/EC 오/VX 엇/EP 당/EC 혼/NNG 이/VCP 라도/EC 내/VV 엇/EP 는/ETM 생__21/NNG 이/VCP 주/EF ./SF 어른들이 제사 지내러 왔다가 혼이라도 냈는 모양이지.
|
||||
바금지에 는쟁이떡 담앙 가곡 헷주. 바금지__1/NNG 에/JKB 는쟁이떡__1/NNG 담/VV 엉/EC 가/VX 곡/EC ᄒᆞ/VV 엇/EP 주/EF ./SF 바구니에 나깨떡 담아 가고 했지.
|
||||
엿날사 옷이영 뭐영 몬딱 바눙질로 멘들아낫주만 이제사 허여게? 엿날__1/NNG 사/JX 옷/NNG 이영/JC 뭐/NP 영/JC 몬딱__1/MAG 바눙질__1/NNG 로/JKB 멘들__1/VV 어낫/EP 주만/EC 이제사__1/MAG ᄒᆞ/VV 어/EC 게/EF ?/SF 옛날이야 옷이랑 뭐랑 모두 바느질로 만들었지만 이제야 하느냐?
|
||||
마작쿨 말륜 것이 오줌 잘 못 싸는 애들한티 조아마씨. 마작쿨__1/NNG 말류__1/VV ᆫ/ETM 것/NNB 이/JKS 오줌/NNG 잘/MAG 못/MAG 싸/VV 는/ETM 애/NNG 들/XSN 한티/JKB 좋/VA 어/EF 마씨/JX ./SF 마디풀 말린 것이 오줌 잘 못 싸는 애들한테 좋아요.
|
||||
땅 빌엉 용시 졍 그 밧디서 나온 거 반은 밧 주인신디 주는 것이 벵작이주게. 땅/NNG 빌/VV 엉/EC 용시__1/NNG 지/VV 엉/EC 그/MM 밧__2/NNG 이서/JKB 나오/VV ᆫ/ETM 거/NNB 반/NNG 은/JX 밧__2/NNG 주인/NNG 신디__1/JKB 주/VV 는/ETM 것/NNB 이/JKS 벵작__1/NNG 이/VCP 주/EF 게/EF ./SF 땅을 빌려서 농사를 져서 그 밭에서 나온 것 반은 밭 주인에게 주는 것이 병작이지.
|
||||
방주리에 떡 당앙 들렁 식게칩이 가곡 헷주. 방주리__1/NNG 에/JKB 떡/NNG 당/VV 엉/EC 들/VV 엉/EC 식게__1/NNG 집/NNG 이/JKB 가/VV 곡/EC ᄒᆞ/VV 엇/EP 주/EF ./SF 바구니에 떡 담아서 들고 제사 있는 집에 가고 했지.
|
||||
곤 까르는 상웨고 두 번차 까르는 줴기떡 맨들아 먹국 다 그추룩 헤십주게. 곱/VA-I ᆫ/ETM 까르__1/NNG 는/JX 상웨/NNG 이/VCP 고/EC 두/MM 번/NNB 차/NNB 까르__1/NNG 는/JX 줴기/NNG 떡/NNG 맨들__3/VV 어/EC 먹/VV 국/EC 다/MAG 그추룩__1/MAG ᄒᆞ/XSV 엇/EP ᆸ주/EF 게/EF ./SF 부드러운 가루는 상화떡이고 두 번째 가루는 줴기떡 만들어 먹고 다 그렇게 했죠.
|
||||
질에 돌도 연분이 잇어사 찬다. 질__4/NNG 에/JKB 돌/NNG 도/JX 연분/NNG 이/JKS 잇__7/VV-R 어사/EC 차/VV ᆫ다/EF ./SF 길에 있는 돌도 연분이 있어야 찬다.
|
||||
미깡낭에 미깡이 지락지락 욜앗주게. 미깡낭__1/NNG 에/JKB 미깡__1/NNG 이/JKS 지락지락__1/MAG 욜__1/VV 엇/EP 주/EF 게/EF ./SF 귤나무에 귤이 주렁주렁 열었지요.
|
||||
자이 자빠졍 밀어먹엇언게 숭나지 아녀게 약 잘 ᄇᆞᆯ라 줘불라. 자/NP 이/JKS 자빠지/VV 엉/EC 밀어먹__1/VV 엇/EP 언/EC 게/EC 숭나__1/VV 지/EC 아니/VCN 어게/EC 약/NNG 잘/MAG ᄇᆞᆯ르/VV 어/EC 주/VX 어/EC 불__11/VX 라/EF ./SF 쟤가 자빠져서 긁혔던데 덧나지 않게 약 잘 발라 줘라.
|
||||
집이 찾아오는 거렁벵이라도 박접하민 안 뒈여. 집/NNG 이/JKB 찾/VV 어/EC 오/VX 는/ETM 거렁벵이__1/NNG 이/VCP 라도/EC 박접하__1/VV 민/EC 안/MAG 뒈/VV 어/EF ./SF 집에 찾아오는 거지라도 박대하면 안 돼.
|
||||
질이 이디서 가렷저. 질__4/NNG 이/JKS 이디__1/NP 서/JKB 가리__17/VV 엇/EP 저/EF ./SF 길이 여기에서 갈렸다.
|
||||
무사 경 드러앚앙 울엄서? 무사__1/MAG 경__1/MAG 드러앚__1/VV 엉/EC 울/VV 어ᇝ/EP 어/EF ?/SF 왜 그렇게 주저앉아 울고 있니?
|
||||
경 어숙미숙 잇지 말앙 이레 오랑 앚이라. 경__1/MAG 어숙미숙__1/MAG 잇__7/VV-R 지/EC 말/VX 엉/EC 이레__3/MAG 오/VV 엉/EC 앚__2/VV 으라/EF ./SF 그렇게 머뭇머뭇 있지 말고 이리로 와서 앉아라.
|
||||
낭가젱이 오도독이 꺾어지는 소리가 났다. 낭가젱이__1/NNG 이/JKS 오도독이__1/MAG 꺾어지/VV 는/ETM 소리/NNG 가/JKS 나/VV 었/EP 다/EF ./SF 나뭇가지가 오도독 꺾어지는 소리가 났다.
|
||||
손 가모까신가 보다. 손이 아판. 손/NNG 가모끄__1/VV 엇/EP ᆫ가/EC 보/VX 다/EF ./SF 손/NNG 이/JKS 아프/VA 언/EF ./SF 손 삐었나 보다, 손이 아파.
|
||||
빙나도 옛날사 벵원이 셔시카, 약이 졸바로 셔시카, 그냥 ᄎᆞᆷ앙 전뎌낫주. 빙나__1/VV 도/EC 옛날/NNG 사/JX 벵원__1/NNG 이/JKS 싯__1/VV-R 엇/EP 으카/EF ,/SP 약/NNG 이/JKS 졸바로__1/MAG 싯__1/VV-R 엇/EP 으카/EF ,/SP 그냥/MAG ᄎᆞᆷ/VV 엉/EC 전디__1/VV 어낫/EC 주/EF ./SF 병나도 옛날이야 병원이 있었을까, 약이 제대로 있었을까, 그냥 참고 견뎠었지.
|
||||
그 친군 말을 잘ᄀᆞᆯ으난 ᄒᆞᆨ교 댕길 때 벨멩이 ‘떠버리’라낫어. 그/MM 친구/NNG ᆫ/JX 말/NNG 을/JKO 잘/MAG ᄀᆞᆮ/VV-I 으난/EC ᄒᆞᆨ교/NNG 댕기__2/VV ᆯ/ETM 때/NNG 벨멩__1/NNG 이/JKS ‘/SSO 떠버리/NNP ’/SSC 이/VCP 어낫/EP 어/EF ./SF 그 친구는 말을 잘하니까 학교 다닐 때 별명이 ‘떠버리’였어.
|
||||
요 메역 멘질락하영 잘 못 심으켜. 요/MM 메역__1/NNG 멘질락/XR 하/XSV 엉/EC 잘/MAG 못/MAG 심__6/VV-R 으크/EP 어/EF ./SF 이 미역 매끄러워서 잘 못 잡겠다.
|
||||
베가 골짝해연 잘 못 걸으키여. 베__7/NNG 가/JKS 골짝/XR 하/XSV 언/EC 잘/MAG 못/MAG 걷/VV-I 으크/EP 어/EF ./SF 배가 곯아서 잘 못 걷겠다.
|
||||
싸는 물 시민 드는 물 시는 법이주. 싸/VV 는/ETM 물/NNG 싯__1/VV-R 으민/EC 들/VV 는/ETM 물/NNG 싯__1/VV-R 는/ETM 법/NNB 이/VCP 주/EF ./SF 써는 물 있으면 드는 물 있는 법이지.
|
||||
고말엔 말지름 발르믄 좋아. 고말__2/NNG 에/JKB ᆫ/JX 말/NNG 지름__4/NNG 발르__1/VV 믄/EC 좋/VA 어/EF ./SF 화상엔 말기름 바르면 좋아.
|
||||
돗통은 정제 조꼼 멀찌겡이 헤야 좋주. 돗통__1/NNG 은/JX 정지__1/NNG 에/JKB 조꼼__2/MAG 멀찌겡이__1/MAG ᄒᆞ/VV 어야/EC 좋/VA 주/EF ./SF 돼지우리는 부엌에서 조금 멀찍이 해야 좋지.
|
||||
영 추운디 옷 벳경 내조친 건 ᄒᆞ꼼 심헷저. 영__6/MAG 춥/VA-I 은데/EC 옷/NNG 벳기__1/VV 엉/EC 내조치__1/VV ᆫ/ETM 거/NNB ᆫ/JX ᄒᆞ꼼__3/MAG 심ᄒᆞ/VA 엇/EP 저/EF ./SF 이렇게 추운데 옷 벗겨서 내쫓은 것은 조금 심했어.
|
||||
이 자룩은 끗이 빨아젼 쓰지 못ᄒᆞ키어. 이/MM 자룩__1/NNG 은/JX 끗__5/NNG 이/JKS 빨__4/VV 어/EC 지/VX 언/EC 쓰/VV 지/EC 못/MAG ᄒᆞ/VV 키어/EF ./SF 이 자루는 끝이 점차 가늘고 날카로워서 쓰지 못하겠다.
|
||||
지넹이가 죽은 거 닮은디 자꾸 가들락가들락헴쩌. 지넹이__1/NNG 가/JKS 죽/VV 은/ETM 거/NNB 닮/VV 은디/EC 자꾸/MAG 가들락가들락/MAG ᄒᆞ/XSV 어ᇝ/EP 저/EF ./SF 지네가 죽은 것 같은데 자꾸 꿈틀꿈틀하네.
|
||||
큰일 쳐난 집 저냑가슴 싯곡, 큰굿 해난 집 저냑가슴 읏나. 큰일/NNG 치/VV 어나/EP ᆫ/ETM 집/NNG 저냑가슴__1/NNG 싯__1/VV-R 곡/EC ,/SP 큰굿/NNG ᄒᆞ/VV 어나/EP ᆫ/ETM 집/NNG 저냑가슴__1/NNG 읏__1/VA 나/EC ./SF 큰일을 치렀던 집은 저녁거리가 있고, 큰굿을 했던 집은 저녁거리가 없다.
|
||||
털채로 몬지 다 털어 둬그네 벡 ᄇᆞ르주. 털채__1/NNG 로/JKB 몬지__1/NNG 다/MAG 털/VV 어/EC 두/VX 어/EC 그네/EC 벡__1/NNG ᄇᆞ르/VV 주/EF ./SF 먼지떨이로 먼지 다 털어 두고서 벽 바르지.
|
||||
ᄂᆞᆷ덜 앞이서도 경 떠둥걸민 너 ᄄᆞᆯ라불메. ᄂᆞᆷ/NNG 덜/XSN 앞/NNG 이서/JKB 도/JX 경__1/MAG 떠둥걸__1/VV 민/EC 너/NP ᄄᆞᆯ르__1/VV 어/EC 불__11/VX 메/EF ./SF 남들 앞에서도 그렇게 떠죽거리면 너 따돌림 당한다.
|
||||
옷에 가시가 들어신구라 깍깍 찔러비염쩌. 옷/NNG 에/JKB 가시/NNG 가/JKS 들/VV 엇/EP ᆫ구라/EC 깍깍__4/MAG 찌르/VV 어/EC 비__14/VX 어ᇝ/EP 저/EF ./SF 옷에 가시가 들어갔는지 따끔따끔하게 찌르고 있네.
|
||||
아이덜신디 밥 ᄒᆞ꼼 줄 때도 가지깽이에 떵 주민 안 뒈여. 아이/NNG 덜/XSN 신디__1/JKB 밥/NNG ᄒᆞ꼼__3/MAG 주/VV ᆯ/ETM 때/NNG 도/JX 가지깽이__1/NNG 에/JKB 뜨/VV 엉/EC 주/VX 민/EC 안/MAG 뒈__3/VV 어/EF ./SF 아이들에게 밥 조금 줄 때도 바리뚜껑에 떠서 주면 안 돼.
|
||||
옛날엔 배 골르지 아녀게 지내민 것으로 뒈엇엇주. 옛날/NNG 에/JKB ᆫ/JX 배/NNG 골르__4/VV 지/EC 아니/VCN 어게/EC 지내/VV 민/EC 것__9/NP 으로/JKB 뒈__3/VV 엇엇/EP 주/EF ./SF 옛날엔 배를 곯지 않게 지내면 그것으로 되었었지.
|
||||
여이난 씨언한 물 좀 줍서. 여이__2/VV 난/EC 씨언하__1/VA ᆫ/ETM 물/NNG 좀/MAG 주/VV ᆸ서/EF ./SF 목마르니 시원한 물 좀 주세요.
|
||||
ᄒᆞ꼼허민 벨착벨착, 그 성질머리부터 고쳐사 헤. ᄒᆞ꼼__3/MAG ᄒᆞ/VV 민/EC 벨착벨착__1/MAG ,/SP 그/MM 성질/NNG 머리/NNG 부터/JX 고치/VV 어사/EC ᄒᆞ/VX 어/EF ./SF 툭하면 발끈발끈, 그 성질부터 고쳐야 해.
|
||||
체허영 소화 안 뒈곡 헐 때 바농땡이로 손 따민 내려가메. 체/NNG ᄒᆞ/XSV 엉/EC 소화/NNG 안/MAG 뒈__3/VV 곡/EC ᄒᆞ/VV ᆯ/ETM 때/NNG 바농땡이__1/NNG 로/JKB 손/NNG 따/VV 민/EC 내려가/VV 메/EF ./SF 체해서 소화 안 되고 할 때 바늘로 손을 따면 내려가지.
|
||||
그 사름은 경 심보가 나쁘난 일찍 뒈여졋주. 그/MM 사름__2/NNG 은/JX 경__1/MAG 심보/NNG 가/JKS 나쁘/VA 난/EC 일찍/MAG 뒈여지__1/VV 엇/EP 주/EF ./SF 그 사람은 그리 심보가 나쁘니까 일찍 죽었지.
|
||||
밥맛도 엇고 ᄒᆞ영 그냥 물에 잠아먹엇주게. 밥맛/NNG 도/JX 엇__2/VA 고/EC ᄒᆞ/VX 엉/EC 그냥/MAG 물/NNG 에/JKB 잠아먹__1/VV 엇/EP 주/EF 게/EF ./SF 밥맛도 없고 해서 그냥 물에 말아먹었지요.
|
||||
내일 시험 보레 가는 사름신디 방장맞은 소리 ᄒᆞ지 말라. 내일/NNG 시험/NNG 보/VV 레/EC 가/VV 는/ETM 사름__2/NNG 신디/JKB 방장맞__1/VA 은/ETM 소리/NNG ᄒᆞ/VV 지/EC 말/VX 라/EF ./SF 내일 시험 보러 가는 사람에게 방정맞은 소리 하지 마라.
|
||||
그 사름은 심술궂이난 일찍 뒈싸졋주. 그/MM 사름__2/NNG 은/JX 심술궂/VA 으난/EC 일찍/MAG 뒈싸지__3/VV 엇/EP 주/EF ./SF 그 사람은 심술궂으니까 일찍 뒈졌지.
|
||||
내와든 돈은 집어 놓앙 ᄀᆞ만히 앚앙 이시라. 내와드__2/VV ᆫ/ETM 돈/NNG 은/JX 집/VV-R 어/EC 놓/VX 엉/EC ᄀᆞ만히/MAG 앚__2/VV 엉/EC 잇__7/VV-R 으라/EF ./SF 내놓은 돈을 집어 놓고 가만히 앉아 있어라.
|
||||
전쟁에 나간 아들이 다치카 부네 다른 집 아들 소식만 들어도 주막주막헷주. 전쟁/NNG 에/JKB 나가/VV ᆫ/ETM 아들/NNG 이/JKS 다치/VV 카/EC 불__11/VX 네/EC 다른/MM 집/NNG 아들/NNG 소식/NNG 만/JX 듣/VV-I 어도/EC 주막주막/XR ᄒᆞ/XSV 엇/EP 주/EF ./SF 전쟁에 나간 아들이 다칠까 봐 다른 집 아들 소식만 들어도 조마조마했지.
|
||||
지사 때 물에 미왑 자므난 엇인 부모 셍각이 납디다게. 지사__15/NNG 때/NNG 물/NNG 에/JKB 미왑__1/NNG 잠__1/VV 으난/EC 엇__2/VA ᆫ/ETM 부모/NNG 생각/NNG 이/JKS 나/VV ᆸ디다/EF 게/EF ./SF 제사 때 물에 쌀밥 마니까 없는 부모 생각이 나더군요.
|
||||
왓다 갓다 헐 때 소리 나렌 강셍이 목에 방올을 ᄃᆞᆯ지. 오/VV 엇/EP 다/EC 가/VV 엇/EP 다/EC ᄒᆞ/VX ᆯ/ETM 때/NNG 소리/NNG 나/VV 렌/EC 강생이/NNG 목/NNG 에/JKB 방올__2/NNG 을/JKO ᄃᆞᆯ/VV 지/EF ./SF 왔다 갔다 할 때 소리 나라고 강아지 목에 방울을 달지.
|
||||
소나의놈 둘 이신디, 어떵 버련한지 정신 엇어마씸. 소나의놈__1/NNG 둘/NR 잇__7/VV-R 은디/EC ,/SP 어떵__1/MAG 버련하/VA ᆫ지/EC 정신/NNG 엇__2/VA 어/EF 마씸/JX ./SF 사내아이 둘이 있는데, 어찌 산만한지 정신이 없어요.
|
||||
그디 귀경 못 간 게 너미 아꼽다. 그디__2/NP 귀경__7/NNG 못/MAG 가/VV ᆫ/ETM 것/NNB 이/JKS 너미__3/MAG 아꼽__1/VA-I 다/EF ./SF 거기 구경 못 간 게 너무 아깝다.
|
||||
고지 가민 가시덤벌 덤방헌 딜 곶자왈이옌 ᄒᆞ주게. 고지__7/NNG 가/VV 민/EC 가시덤벌__1/NNG 덤방/XR ᄒᆞ/XSA ᆫ/ETM 디/NNB ᆯ/JKO 곶자왈/NNP 이/VCP 엔/EC ᄒᆞ/VV 주/EF 게/EF ./SF 숲에 가면 가시덤불 무성한 데를 곶자왈이라고 하지.
|
||||
엿날은 상점이 엇어나난 도비상기덜이 ᄆᆞ슬마다 돌아뎅겻지. 엿날__1/NNG 은/JX 상점/NNG 이/JKS 엇__2/VA 어나/EP 난/EC 도비상기__1/NNG 덜/XSN 이/JKS ᄆᆞ슬/NNG 마다/JX 돌아댕기/VV 엇/EP 지/EF ./SF 옛날은 상점이 없었으니까 도붓장수들이 마을마다 돌아다녔지.
|
||||
우리 가뜬 무삼자는 무신 날에 태어나든 무신 상관이예? 우리/NP 가뜨__1/VA ᆫ/ETM 무삼자__1/NNG 는/JX 무신__8/MM 날/NNG 에/JKB 태어나/VV 든/EC 무신__8/MM 상관/NNG 이/VCP 예/JX ?/SF 우리 같은 무산자는 무슨 날에 태어나든 무슨 상관이요?
|
||||
뒈야지궤기 ᄉᆞᆱ아난 국물에 둥갈둥갈 떠 잇는 지름 걷어 뒁 ᄆᆞᆷ 넣어 불라. 뒈야지궤기__1/NNG ᄉᆞᆱ/VV 아나/EP ᆫ/ETM 국물/NNG 에/JKB 둥갈둥갈__1/MAG 뜨/VV 어/EC 잇__7/VV-R 는/ETM 지름__4/NNG 걷/VV-R 어/EC 두/VX 엉/EC ᄆᆞᆷ/NNG 넣/VV 어/EC 불__11/VX 라/EF ./SF 돼지고기를 삶았던 국물에 둥둥 떠 있는 기름을 걷어 두고 모자반을 넣어라.
|
||||
온 사름이 요남은은 넘어라. 온/MM 사름__2/NNG 이/VCP 요남은__1/XR 은/JX 넘/VV 어라/EF ./SF 온 사람이 여남은은 넘더라.
|
||||
허벅지에 듼그르 큰 거 잇어. 허벅지/NNG 에/JKB 듼그르__1/NNG 크/VA ᆫ/ETM 거/NNB 잇__7/VV-R 어/EF ./SF 허벅지에 화상 큰 거 있어.
|
||||
도껭이주제가 가고 나난 호꼼 시언하다. 도껭이주제__1/NNG 가/JKS 가/VV 고/EC 나/VX 난__13/EC 호꼼__3/MAG 시언하__1/VA 다/EF ./SF 회오리바람이 가고 나니 조금 시원하다.
|
||||
허영ᄒᆞ게 정갱이가 낀 거 보난 오줌항 헤난 건 셍이여. 허영ᄒᆞ__3/VA 게/EC 정갱이__2/NNG 가/JKS 끼/VV ᆫ/ETM 거/NNB 보/VV 난__13/EC 오줌/NNG 항__5/NNG ᄒᆞ/VV 어나/EP ᆫ/ETM 거/NNB 이/VCP ᆫ/ETM 셍__2/NNB 이/VCP 여/EF ./SF 허옇게 버캐가 낀 것을 보니 오줌 항아리 했던 것인 모양이다.
|
||||
쳇날은 젯 안 물린다. 쳇날__1/NNG 은/JX 젯__1/NNG 안/MAG 물리/VV ᆫ다/EF ./SF 첫날은 젖 안 물린다.
|
||||
잔칠 넴기젠 하민 도감이 ᄒᆞᆫ 끼에 궤기를 얼마썩 쓸 건지 잘 여산하여사주. 잔치/NNG ᆯ/JKO 넴기__1/VV 젠/EC 하/VX 민/EC 도감/NNG 이/JKS ᄒᆞᆫ/MM 끼/NNG 에/JKB 궤기__2/NNG 를/JKO 얼마/NNG 썩__7/XSN 쓰/VV ᆯ/ETM 거/NNB 이/VCP ᆫ지/EC 잘/MAG 여산__3/NNG 하/XSV 어사/EC 주/EF ./SF 잔치를 넘기려고 하면 도감이 한 끼에 고기를 얼마씩 쓸 건지 잘 계획해야지.
|
||||
몸이 나랏나랏하연 정신이 엇다. 몸/NNG 이/JKS 나랏나랏__1/MAG 하/XSV 언/EC 정신/NNG 이/JKS 엇__2/VA 다/EF ./SF 몸이 나른해서 정신이 없다.
|
||||
아미영 헤도 오널은 못 갈 거 닮수다. 아미영__1/MAG ᄒᆞ/VV 어도/EC 오널__1/NNG 은/JX 못/MAG 가/VV ᆯ/ETM 거/NNB 닮/VV 수다/EF ./SF 아무리 해도 오늘은 못 갈 것 같아요.
|
||||
가이만 똘라 불지 말앙 사이좋게 놀라. 가이/NNP 만/JX 똘르__1/VV 어/EC 불__11/VX 지/EC 말/VX 엉/EC 사이좋/VA 게/EC 놀/VV 라/EF ./SF 걔만 따돌려 버리지 말고 사이좋게 놀아라.
|
||||
우리 메누리 고멩딸이옌 친정에서 일 ᄒᆞ나도 안 시겨난 셍이라. 우리/NP 메누리__1/NNG 고멩딸__1/NNG 이/VCP 엔/EC 친정/NNG 에서/JKB 일/MM ᄒᆞ나/NR 도/JX 안/MAG 시기__2/VV 어나/EP ᆫ/ETM 셍__2/NNB 이/VCP 라/EF ./SF 우리 며느리 고명딸이라고 친정에서 일 하나도 안 시켰던 모양이야.
|
||||
남방에 닮은 건 가운디 돌 박아진 뱅잇혹을 쳐사 뒈는 거라. 남방에__1/NNG 닮/VV 은/ETM 거/NNB ᆫ/JX 가운디__1/NNG 돌/NNG 박/VV 어/EC 지/VX ᆫ/ETM 뱅잇혹__1/NNG 을/JKO 치/VV 어사/EC 뒈__3/VV 는/ETM 거/NNB 이/VCP 라/EF ./SF 나무절구 같은 것은 가운데 돌이 박힌 방아확을 쳐야 되는 거야.
|
||||
나이가 들어시난 밧일도 이제 에잉간하민 그만ᄒᆞᆸ서. 나이/NNG 가/JKS 들/VV 엇/EP 으난/EC 밧__2/NNG 일/NNG 도/JX 이제/MAG 에잉간하__1/VA 민/EC 그만/MAG ᄒᆞ/VV ᆸ서/EF ./SF 나이가 들었으니 밭일도 이제 어지간하면 그만하세요.
|
||||
어멍 죽으민 아덜 상제는 머귀낭 몽뎅이를 헷덴 헙디다. 어멍__1/NNG 죽/VV 으민/EC 아덜__1/NNG 상제/NNG 는/JX 머귀낭__1/NNG 몽뎅이/NNG 를/JKO ᄒᆞ/XSV 엇/EP 덴/EC 허/VV ᆸ디다/EF ./SF 어머니 죽으면 아들 상제는 머귀나무 막대기를 했다고 합디다.
|
||||
베가 골락하연 잘 못 걸으키여. 베__7/NNG 가/JKS 골락하__1/VV 언/EC 잘/MAG 못/MAG 걷/VV-I 으크/EP 어/EF ./SF 배가 곯아서 잘 못 걷겠다.
|
||||
집 짓을 때 퉤기 얽어놩 양착으로 개벡하영 그 우틔 종이 부쪄사지. 집/NNG 짓/VV-I 을/ETM 때/NNG 퉤기__1/NNG 얽/VV 어/EC 놓/VX 엉/EC 양착__3/NNG 으로/JKB 개벡하__1/VV 엉/EC 그/MM 우틔/NNG 종이/NNG 부찌__1/VV 어사지/EF ./SF 집 지을 때 외 얽어놓고 양쪽으로 새벽하고 그 위에 종이를 붙여야지.
|
||||
이제 곧 정월이난 오널 장은 막 부끌 거주. 이제/MAG 곧/MAG 정월/NNG 이/VCP 난/EC 오널__1/NNG 장/NNG 은/JX 막__21/MAG 부끄__4/VV ᆯ/ETM 거/NNB 이/VCP 주/EF ./SF 이제 곧 정월이니까 오늘 장은 아주 붐빌 것이다.
|
||||
돈을 엇이대기지 말앙 모아사 집도 사곡 땅도 사곡 헐 거 아니라. 돈/NNG 을/JKO 엇이대기__1/VV 지/EC 말/VX 엉/EC 모으/VV 어사/EC 집/NNG 도/JX 사/VV 곡/EC 땅/NNG 도/JX 사/VV 곡/EC 허/VV ᆯ/ETM 거/NNB 아니/VCN 라/EF ./SF 돈을 낭비하지 말고 모아야 집도 사고 땅도 사고 할 게 아니냐.
|
||||
쪼끼차기는 이젠 잘 아이 차주. 쪼끼차기__1/NNG 는/JX 이제/NNG ᆫ/JX 잘/MAG 아이__12/MAG 차/VV 주/EF ./SF 제기차기는 이젠 잘 아니 차지.
|
||||
떡 먹으크넨 들으곤데 어디 십디가 ᄒᆞ멍 어가라 먹엇주. 떡/NNG 먹/VV 으크/EP 넨/EC 듣__11/VV-I 으곤데/EC 어디/NP 십/NR 디/NNG 가/JKS ᄒᆞ/VV 멍/EC 어가라__1/MAG 먹/VV 엇/EP 주/EF ./SF 떡 먹겠냐고 묻기에 어디 있냐고 하면서 곧 먹었지.
|
||||
아이고, 가렛좆둥이 몽글앙 안 뒈키여. 아이고/IC ,/SP 가렛좆둥이__1/NNG 몽글__4/VV 엉/EC 안/MAG 뒈__3/VV 으크/EP 어/EF ./SF 아이고, 맷수쇠 몽그라져서 안 되겠다.
|
||||
미깡낭 가지에 미깡이 자락 욜안 거들거들. 미깡낭__1/NNG 가지/NNG 에/JKB 미깡__1/NNG 이/JKS 자락__14/MAG 욜__1/VV 언/EC 거들거들__2/MAG ./SF 밀감나무 가지에 밀감이 잔뜩 열어서 열매가 흔들흔들.
|
||||
막 급허게 오단 보난 사나의상제신딘 인사도 못 헹 와졋저. 막__21/MAG 급허게/NNG 오/VV 단/EC 보/VX 난/EC 사나의상제__1/NNG 신디/JKB ᆫ/JX 인사/NNG 도/JX 못/MAG ᄒᆞ/VV 엉/EC 오/VV 어/EC 지/VX 엇/EP 저/EF ./SF 아주 급하게 오다 보니 바깥상제에게는 인사도 못 하고 왔다.
|
||||
솟덕에 솟을 앚졍 밥을 헤 나민 솟강알에 거멩이가 안 셍길 수가 엇어. 솟덕__1/NNG 에/JKB 솟__2/NNG 을/JKO 앚지__1/VV 엉/EC 밥/NNG 을/JKO ᄒᆞ/VV 어/EC 나/VX 민/EC 솟강알__1/NNG 에/JKB 거멩이__1/NNG 가/JKS 안/MAG 셍기/VV ᆯ/ETM 수/NNB 가/JKS 엇__2/VA 어/EF ./SF 봇돌에 솥을 안쳐서 밥을 하고 나면 아궁이에 검댕이 안 생길 수가 없어.
|
||||
좁은 목에 사름들이 메와들멍 떠들고 햇주게. 좁/VA-R 은/ETM 목/NNG 에/JKB 사름__2/NNG 들/XSN 이/JKS 메와들__1/VV 멍/EC 떠들/VV 고/EC 하/VX 엇/EP 주/EF 게/EF ./SF 좁은 목에 사람들이 모여들며 떠들고 했습니다.
|
||||
ᄉᆞ답 널어 논 거 쏘나기에 발락 젖엇수다. ᄉᆞ답/NNG 널/VV 어/EC 놓/VV ᆫ/ETM 거/NNB 쏘나기__1/NNG 에/JKB 발락__3/MAG 젖/VV 엇/EP 수다/EF ./SF 세답 널어 놓은 거 소나기에 흠뻑 젖었어요.
|
||||
이 낭은 가늘고 고짝하연 깃대로 써지키여. 이/MM 낭__2/NNG 은/JX 가늘/VA 고/EC 고짝/MAG 하/XSV 언/EC 깃대/NNG 로/JKB 쓰/VV 어/EC 지/VX 크/EP 어/EF ./SF 이 나무는 가늘고 곧아서 깃대로 쓸 수 있겠다.
|
||||
일이 바쁜데 수눌꾼은 불러와시냐? 일/NNG 이/JKS 바쁘/VA ᆫ데/EC 수눌꾼__1/NNG 은/JX 불러오/VV 엇/EP 으냐/EF ?/SF 일이 바쁜데 품앗이꾼은 불러왔느냐?
|
||||
경 나얼르지 말라. 경__1/MAG 나얼르__1/VV 지/EC 말/VX 라/EF ./SF 그렇게 나다니지 마라.
|
||||
모밀을 가ᄅᆞ 내영으네 모밀처바기를 해 먹곡 살앗주. 모밀__2/NNG 을/JKO 가ᄅᆞ/NNG 내/VV 엉/EC 으네/EC 모밀처바기__1/NNG 를/JKO 하/VV 어/EC 먹/VX 곡/EC 살/VV 엇/EF 주/EF ./SF 메밀을 가루 내서는 메밀수제비를 해 먹고 살았지요.
|
||||
연애할 때사게 오소록한 딜로 역불 찾앙가곡 허주. 연애/NNG 하/XSV ᆯ/ETM 때/NNG 사/JX 게/JX 오소록/XR 하/XSA ᆫ/ETM 디/NNB ᆯ로/JKB 역불__1/MAG 찾/VV 앙/EC 가/VV 곡/EC ᄒᆞ/VV 주/EF ./SF 연애할 때야 으슥한 데로 일부러 찾아가고 하지.
|
||||
과자 사 ᄃᆞ렌 앙주끄지 말앙 저레 가라. 과자/NNG 사/VV 어/EC ᄃᆞ/VX 렌/EC 앙주끄__1/VV 지/EC 말/VX 엉/EC 저레__2/MAG 가/VV 어라/EF ./SF 과자 사 달라고 앙앙하지 말고 저리 가라.
|
||||
그 사름은 술만 먹으민 개차반지주. 그/MM 사름__2/NNG 은/JX 술/NNG 만/JX 먹/VV 으민/EC 개차반지__1/NNG 이/VCP 주/EF ./SF 그 사람은 술만 먹으면 개차반이지.
|
||||
갑은 아모마니라도 궨찮수다. 갑__17/NNG 은/JX 아모마니__1/NNG 이/VCP 라도/EC 궨찮/VA 수다/EF ./SF 값은 암만이라도 괜찮습니다.
|
||||
벨일 엇이민 그디서 ᄒᆞ꼼만 기다렴시라. 벨__10/MM 일/NNG 엇__2/VA 으민/EC 그디__2/NP 서/JKB ᄒᆞ꼼__3/MAG 만/JX 기다리/VV 어ᇝ/EP 으라/EF ./SF 별일 없으면 거기서 조금만 기다리고 있어라.
|
||||
서울레 장기하레 가는 건 대단헌 일입주게. 서울/NNP 에/JKB 장기/NNG 하/XSV 레__5/EC 가/VV 는/ETM 거/NNB ᆫ/JX 대단/XR 허/XSA ᆫ/ETM 일/NNB 이/VCP ᆸ주/EF 게/EF ./SF 서울로 장계하러 가는 건 대단한 일이지요.
|
||||
바늘질사 예펜덜은 몬 허는 거주게. 바늘질__1/NNG 사/JX 예펜__1/NNG 덜/XSN 은/JX 몬/MAG 허/VV 는/ETM 거/NNB 이/VCP 주/EF 게/EF ./SF 바느질이야 부녀자들은 모두 하는 거지.
|
||||
그 사름은 성질이 깨꼬라지주. 그/MM 사름__2/NNG 은/JX 성질/NNG 이/JKS 깨꼬라지__1/VA 주/EF ./SF 그 사람은 성질이 괴팍하지.
|
||||
자네는 심이 고르닥하다. 자/NP 네/XSN 는/JX 심__3/NNG 이/JKS 고르닥하__1/VA 다/EF ./SF 쟤네는 힘이 팽팽하다.
|
||||
경 뭉부린다고 아방이 허락할 리 엇저. 경__1/MAG 뭉부리__1/VV ᆫ다고/EC 아방__2/NNG 이/JKS 허락/NNG 하/XSV ᆯ/ETM 리/NNB 엇__2/VA 저/EF ./SF 그리 떼쓴다고 아버지가 허락할 리 없다.
|
||||
물도 잘못 먹으민 각긴다. 물/NNG 도/JX 잘/MAG 못/MAG 먹/VV 으민/EC 각기__2/VV ᆫ다/EF ./SF 물도 잘못 먹으면 사레들린다.
|
||||
가게비가 자꾸 우는 거 보난, 비가 옴 직허다. 가게비__1/NNG 가/JKS 자꾸/MAG 울/VV 는/ETM 거/NNB 보/VV 난/EC ,/SP 비/NNG 가/JKS 오/VV ᆷ직/EC ᄒᆞ/VX 다/EF ./SF 개구리가 자꾸 우는 것을 보니, 비가 올 듯하다.
|
||||
돈 엇인 줄 알아신디 밧 사는 거 보난 여부록소부록 모앙 놔둔 셍이라. 돈/NNG 엇__2/VA 은/ETM 줄/NNB 알/VV 엇/EP ᆫ디/EC 밧__2/NNG 사/VV 는/ETM 거/NNB 보/VV 난/EC 여부록소부록__1/MAG 모으/VV 엉/EC 놓/VX 어/EC 두/VX ᆫ/ETM 셍__2/NNB 이/VCP 라/EF ./SF 돈 없는 줄 알았는데 밭을 사는 것 보니 구메구메 모아 둔 모양이야.
|
||||
|
|
@ -1,140 +0,0 @@
|
|||
너한질라 못마땅허다고 구느름만 허먼 어쩌냐? 너/NP 한질라/JX 못/MAG 마땅/XR 허/XSA 다고/EC 구느름__1/NNG 만/JX 허/VV 먼/EC 어쩌/VV 냐/EF ?/SF 너까지 못마땅하다고 군말만 하면 어쩌냐?
|
||||
애기가 틀분 것이 낼 비가 올랑갑다. 애기/NNG 가/JKS 틀불__1/VV ᆫ/ETM 것/NNB 이/JKS 낼/NNG 비/NNG 가/JKS 오/VV ᆯ랑가/EC ᆸ다/EF ./SF 아기가 투레질하는 것이 낼 비가 오려나 보다.
|
||||
우는 애기는 살살 얼려야제 소릴 친다고 울음을 그치간디? 울/VV 는/ETM 애기/NNG 는/JX 살살/MAG 얼리__10/VV 어야제/EF 소리/NNG ᆯ/JKO 치/VV ᆫ다고/EC 울음/NNG 을/JKO 그치/VV 간디/EF ?/SF 우는 아기는 살살 얼러야지 소리를 친다고 울음을 그치겠어?
|
||||
어지께 닥이 흑을 헤번지르고 구녁을 파드랑께. 어지께__1/NNG 닥__6/NNG 이/JKS 흑__5/NNG 을/JKO 헤번지르__1/VV 고/EC 구녁__1/NNG 을/JKO 파/VV 드랑께/EF ./SF 어저께 닭이 흙을 헤치고 구멍을 파더라니까.
|
||||
그 무건 동우를 머리 욱에 살폿 영거 놓제. 그/MM 무겁/VA-I 은/ETM 동우__2/NNG 를/JKO 머리/NNG 욱__5/NNG 에/JKB 살폿/MAG 영그__1/VV 어/EC 놓/VX 제/EF ./SF 그 무거운 동이를 머리 위에 사포시 얹어 놓지.
|
||||
쪼락데기가 따라진디 애기들이 얻서 노니라고 집에 안 온다냐. 쪼락데기__1/NNG 가/JKS 따라지__1/VV ᆫ디/EC 애기/NNG 들/XSN 이/JKS 얻서/NNP 놀/VV 니라고/EC 집/NNG 에/JKB 안/MAG 오/VV ᆫ다냐/EF ./SF 폭우가 세차게 퍼붓는데 아이들이 어디서 노느라고 집에 안 온다니.
|
||||
쩌 영감님이 기우도 높고 재산도 무지 만해라우. 쩌__3/MM 영감/NNG 님/XSN 이/JKS 기우__17/NNG 도/JX 높/VA 고/EC 재산/NNG 도/JX 무지/MAG 만허__1/VA 어라우/EF ./SF 저 영감님이 지위도 높고 재산도 무지 많아요.
|
||||
올 가물에 콩잎이 다 곱송그리져 갖고 큰일이시. 올/NNG 가물/NNG 에/JKB 콩/NNG 잎/NNG 이/JKS 다/MAG 곱송그리지__1/VV 어/EC 갖/VX 고/EC 큰일/NNG 이/VCP 시/EF ./SF 올 가물에 콩잎이 다 오그라져 가지고 큰일일세.
|
||||
화분에 물을 호복허니 줘라. 화분/NNG 에/JKB 물/NNG 을/JKO 호복허__1/VA 니/EC 주/VV 어라/EF ./SF 화분에 물을 넉넉하게 줘라.
|
||||
그 집은 엊그저께 아들 장개보냈는디 겔혼식 날 봉께 잔체를 참 뻑적지근허게 헙디다. 그/MM 집/NNG 은/JX 엊그저께/MAG 아들/NNG 장개__2/NNG 보내/VV 었/EP 는디/EC 겔혼식__1/NNG 날/NNG 보/VV ᆼ께/EC 잔체__2/NNG 를/JKO 참/MAG 뻑적지근허__1/VA 게/EC 허/VV ᆸ디다/EF ./SF 그 집은 엊그저께 아들 장가보냈는데 결혼식 날 보니까 잔치를 참 요란하게 합디다.
|
||||
햇짐에 욕을 허고 그러먼 쓰겄냐? 햇짐__1/NNG 에/JKB 욕/NNG 을/JKO 허/VV 고/EC 그러/VV 먼/EC 쓰/VV 겄/EP 냐/EF ?/SF 홧김에 욕을 하고 그러면 되겠니?
|
||||
고추를 빼싹 몰료야 되는디 이 비란 놈이 계속 온다니께. 고추/NNG 를/JKO 빼싹__1/MAG 몰료__1/VV 어야/EC 되/VV 는디/EC 이/MM 비/NNG 이/VCP 란/ETM 놈/NNB 이/JKS 계속/MAG 오/VV ᆫ다니께/EF ./SF 고추를 바싹 말려야 되는데 이 비란 놈이 계속 온다니까.
|
||||
생선 눈이 히렌 거 봉게 벨로 물이 안 좋은디라우. 생선/NNG 눈/NNG 이/JKS 히레__1/VA ᆫ/ETM 거/NNB 보/VV ᆼ게/EC 벨로__1/MAG 물/NNG 이/JKS 안/MAG 좋/VA 은디라우/EF ./SF 생선 눈이 흐린 거 보니까 별로 물이 안 좋은데요.F
|
||||
우리 아부지가 핵교는 안 댕겼어도 하야간 아는 거이 만허시당께. 우리/NP 아부지__2/NNG 가/JKS 핵교__1/NNG 는/JX 안/MAG 댕기/VV 었/EP 어도/EC 하야간__1/MAG 알/VV 는/ETM 거/NNB 이/VCP 만허__1/VA 시/VA 당께/EF ./SF 우리 아버지가 학교는 안 다녔어도 하여간 아는 게 많으시다니까.
|
||||
가실에 짐장을 하면 시안내 먹었어라우. 가실__5/NNG 에/JKB 짐장__1/NNG 을/JKO 하/VV 면/EC 시안내__1/MAG 먹/VV 었/EP 어라우/EF ./SF 가을에 김장을 하면 겨우내 먹었어요.
|
||||
디제기가 밧을 디지먼 땅이 욱으로 솟아올라 와. 디제기__1/NNG 가/JKS 밧__2/NNG 을/JKO 디지__2/VV 먼/EC 땅/NNG 이/JKS 욱__5/NNG 으로/JKB 솟/VV-R 어/EC 오르/VV 어/EC 오/VX 어/EF ./SF 두더지가 밭을 뒤지면 땅이 위로 솟아올라 와.
|
||||
갯비트리와 소롱이 독바우에 양심 붙어 있어라우. 갯비트리__2/NNG 와/JC 소롱__2/NNG 이/JKS 독바우__1/NNG 에/JKB 양심__6/MAG 붙/VV 어/EC 있/VX 어라우/EF ./SF 갯고둥과 소라가 바위에 잔뜩 붙어 있어요.
|
||||
얼매큼 묵어야 배가 불를란고? 얼매큼__1/MAG 묵__4/VV 어야/EC 배/NNG 가/JKS 불르__2/VA ᆯ란고/EF ?/SF 얼마큼 먹어야 배가 부르려나?
|
||||
눈질에 미끄러져 깨골창에 처백혀 부렀어. 눈질__2/NNG 에/JKB 미끄러지/VV 어/EC 깨골창__1/NNG 에/JKB 처백히__1/VV 어/EC 부리__8/VX 었/EP 어/EC ./SF 눈길에 미끄러져 개골창에 처박혀 버렸어.
|
||||
글씨가 너머 짝어 갖고 못 알아묵겄다. 글씨/NNG 가/JKS 너머__2/MAG 짝__3/VA 어/EC 갖/VX 고/EC 못/MAG 알/VV 어/EC 묵__4/VX 겄/EP 다/EF ./SF 글씨가 너무 작아서 못 알아먹겠다.
|
||||
이 한더우에 조롷게 열심히 일허는 사람은 드물 거여. 이/MM 한더우__1/NNG 에/JKB 조롷/VA-I 게/EC 열심히/MAG 일/NNG 허/XSV 는/ETM 사람/NNG 은/JX 드물/VA ᆯ/ETM 거/NNB 이/VCP 여/EF ./SF 이 한더위에 저렇게 열심히 일하는 사람은 드물 거야.
|
||||
우리 몯딸이 시집가 갖고 인자 첨으로 친정에 왔어. 우리/NP 몯딸__1/NNG 이/JKS 시집가/VV 어/EC 갖/VX 고/EC 인자/MAG 첨/NNG 으로/JKB 친정/NNG 에/JKB 오/VV 었/EP 어/EF ./SF 우리 맏딸이 시집가 가지고 이제 첨으로 친정에 왔어.
|
||||
전에는 개성질로 단을 막 뚜둘겨서 나락을 떨었구만. 전/NNG 에/JKB 는/JX 개성질__1/NNG 로/JKB 단/NNG 을/JKO 막/MAG 뚜둘기__1/VV 어서/EC 나락__2/NNG 을/NNG 떨/VV 었/EP 구만/EF ./SF 전에는 개상질로 단을 막 두드려서 벼를 떨었구먼.
|
||||
쌀 소성 한 되 주씨요. 쌀/NNG 소성__15/NNG 한/MM 되/NNB 주/VV 씨요/EF ./SF 쌀 작은되 한 되 주시오.
|
||||
중핵교를 졸읍허고는 부모 젓을 떠나 혼차 살었제. 중핵교__1/NNG 를/JKO 졸읍__1/NNG 허/XSV 고/EC 는/JX 부모/NNG 젓__4/NNG 을/JKO 떠나/VV 어/EC 혼차__1/NNG 살/VV 었/EP 제/EF ./SF 중학교를 졸업하고는 부모 곁을 떠나 혼자 살았지.
|
||||
먹때왈이라도 쪼까 따서 장에 나가 팔어 볼라고 해도 누가 고걸 사겄어. 먹때왈__2/NNG 이/VCP 라도/EC 쪼까__2/MAG 따/VV 어서/EC 장/NNG 에/JKB 나가/VV 어/EC 팔/VV 어/EC 보/VX ᆯ라고/EC 하/VX 어도/EC 누구/NP 가/JKS 고거/NP ᆯ/JKO 사/VV 겄/EP 어/EF ./SF 먹딸기라도 조금 따서 장에 나가 팔아 보려고 해도 누가 그걸 사겠어.
|
||||
역서 집까정 걸어 댕기냐? 역__3/NP 서/JKB 집/NNG 까정/JX 걷/VV-I 어/EC 댕기__2/VV 냐/EF ?/SF 여기서 집까지 걸어 다니냐?
|
||||
되야지 괴기는 새와젓이랑 묵어야 써. 되야지__1/NNG 괴기__6/NNG 는/JX 새와젓__1/NNG 이랑/JC 묵__4/VV 어야/EC 쓰/VX 어/EF ./SF 돼지고기는 새우젓이랑 먹어야 해.
|
||||
도구통 만한 놈이 가랑구 떡 벌리고 앙거서 군불 넣고 있드랑게. 도구통__2/NNG 만하/XSA ᆫ/ETM 놈/NNB 이/JKS 가랑구__1/NNG 떡/MAG 벌리/VV 고/EC 앙그__1/VV 어서/EC 군불/NNG 넣/VV 고/EC 있/VX 드랑게/EF ./SF 절구통 만한 놈이 가랑이 떡 벌리고 앉아서 군불 넣고 있더라니까.
|
||||
우리 집에 묵자껏도 없네마는 조까 들렜다 가소. 우리/NP 집/NNG 에/JKB 묵자껏__1/NNG 도/JX 없/VA 네/EC 마는/JX 조까__2/MAG 들르/VV 었/EP 다/EC 가/VV 소/EF ./SF 우리 집에 먹을거리도 없지마는 잠깐 들렀다 가게.
|
||||
요로콤 짝아도 밍색이 달갈이여. 요로콤/MAG 짝__3/VA 어도/EC 밍색__1/NNG 이/JKS 달갈__1/NNG 이/VCP 여/EF ./SF 요렇게 작아도 명색이 달걀이야.
|
||||
까시가 들었는가 발바닥이 싸박싸박 쑤시드랑께. 까시__2/NNG 가/JKS 들/VV 었/EP 는가/EC 발바닥/NNG 이/JKS 싸박싸박__1/MAG 쑤시/VV 드랑께/EF ./SF 가시가 들었는지 발바닥이 따끔따끔 쑤시더라니까.
|
||||
수박이 꼬트래기가 시들시들헌 것이 빌로 안 싱싱허겄구만이라우. 수박/NNG 이/JKS 꼬트래기__1/NNG 가/JKS 시들시들/MAG 허/XSA ᆫ/ETM 것/NNB 이/JKS 빌로__1/MAG 안/MAG 싱싱/XR 허/XSA 겄/EP 구만이라우/EF ./SF 수박이 꼭지가 시들시들한 것이 별로 싱싱하지 않겠구먼요.
|
||||
사방이 캄캄허고 비도 오고 그렁께 어째 와싹허네. 사방/NNG 이/JKS 캄캄/MAG 허/XSA 고/EC 비/NNG 도/JX 오/VV 고/EC 그렁께__1/MAG 어째/MAG 와싹허__1/VV 네/EF ./SF 사방이 캄캄하고 비도 오고 그러니까 어째 오싹하네.
|
||||
그것을 인자 끈에다 여물쳐 뭉껐어. 그것/NP 을/JKO 인자/MAG 끈/NNG 에다/JKB 여물치__1/VV 어/EC 뭉끄__1/VV 었/EP 어/EF ./SF 그것을 이제 끈에다 잡아매어 묶었어.
|
||||
아들이 꼬숨 타고 있네. 아__23/NNG 들/XSN 이/JKS 꼬숨__1/NNG 타/VV 고/EC 있/VX 네/EF ./SF 아이들이 미끄럼 타고 있네.
|
||||
자석이 잘되먼 부모가 호질한단 말은 인자 엣날 말이랑께. 자석__1/NNG 이/JKS 잘/MAG 되/VV 먼/EC 부모/NNG 가/JKS 호질하__1/VV ᆫ단/ETM 말/NNG 은/JX 인자/MAG 엣날__1/NNG 말/NNG 이/VCP 랑께/EF ./SF 자식이 잘되면 부모가 호강한다는 말은 이제 옛날 말이라니까.
|
||||
나무제기돈은 됐응께 물견으로 더 주씨요. 나무제기돈__1/NNG 은/JX 되/VV 었/EP 응께/EC 물견__1/NNG 으로/JKB 더/MAG 주/VV 씨요/EF ./SF 거스름돈은 됐으니까 물건으로 더 주세요.
|
||||
부삭에다 젖은 나뭇가치를 옇었등만 히칸 냉갈만 올라오데. 부삭__1/NNG 에다/JKB 젖/VV 은/ETM 나뭇가치__1/NNG 를/JKO 옇__1/VV 었/EP 등만/EC 히카__1/VV ᆫ/ETM 냉갈/NNG 만/JX 올라오/VV 데/EF ./SF 아궁이에다 젖은 나뭇가지를 넣었더니만 하얀 연기만 올라오데.
|
||||
할무니는 당골헌티 갔다 오더니 정신이 개안허다 그라요. 할무니__1/NNG 는/JX 당골__1/NNG 헌티/JKB 가/VV 었/EP 다/EC 오/VV 더니/EC 정신/NNG 이/JKS 개안허__1/VA 다/EC 그라/VV 요/EF ./SF 할머니는 무당한테 갔다 오더니 정신이 개운하다 그래요.
|
||||
고 냥반 게탁 이약을 내가 한두 분 들었간디? 고/MM 냥반__1/NNG 게탁__1/NNG 이약__1/NNG 을/NNG 나/NP 가/JKS 한두/MM 분/NNB 들/VV 었/EP 간디/EF ?/SF 그 양반 게정 이야기를 내가 한두 번 들었관데?
|
||||
가 이름이 거시끼더라. 가/NP 이름/NNG 이/JKS 거시끼__1/NP 이/VCP 더라/EF ./SF 그 아이 이름이 거시기더라.
|
||||
가매솥에다 밥을 항께 밥이 나실나실허니 잘되았어라우. 가매솥__1/NNG 에다/JKB 밥/NNG 을/JKO 하/VV ᆼ께/EC 밥/NNG 이/JKS 나실나실허__1/VA 니/EC 잘되/NNG 었/EP 어라우/EF ./SF 가마솥에 밥을 하니까 밥이 고슬고슬하니 잘되었어요.
|
||||
고따우로 살지 마라잉. 고따우__1/NP 로/JKB 살/VV 지/EC 말/VX 어라잉/EF ./SF 고따위로 살지 말아라.
|
||||
갑재기 뱀이 나옹께 신부가 놀래서 자물쒜 불었어. 갑재기__1/MAG 뱀/NNG 이/JKS 나오/VV ᆼ께/EC 신부/NNG 가/JKS 놀래/VV 어서/EC 자물쒜__1/VV 어/EC 불__11/VX 었/EP 어/EF ./SF 갑자기 뱀이 나오니까 신부가 놀라서 까무러쳐 버렸어.
|
||||
그르끈부텀 차꼬 눈이 찌적찌적허니 눈물이 나고 눈곱이 찐다. 그르끈__1/NNG 부텀/JX 차꼬__4/MAG 눈/NNG 이/JKS 찌적찌적허__1/VA 니/EC 눈물/NNG 이/JKS 나/VV 고/EC 눈곱/NNG 이/JKS 찌__12/VV ᆫ다/EF ./SF 그러께부터 자꾸 눈이 지적지적하게 눈물이 나고 눈곱이 낀다.
|
||||
작은 사웃감 첨 만낼 때 뺏뺏다리칠로 야웠었는디 지금은 아조 건강해. 작/VA 은/ETM 사웃감__1/NNG 첨/NNG 만내__1/VV ᆯ/ETM 때/NNG 뺏뺏다리__1/NNG 칠로__1/JKB 야우__1/VV 었었/EP 는디/EC 지금/NNG 은/JX 아조/MAG 건강/NNG 하/XSA 어/EF ./SF 작은 사윗감 처음 만날 때 빼빼처럼 야위었었는데 지금은 아조 건강해.
|
||||
해찰허지 말고 얼렁얼렁 묵어라. 해찰/NNG 허/VV 지/EC 말/VX 고/EC 얼렁얼렁__3/MAG 묵__4/VV 어라/EF ./SF 해찰하지 말고 얼른얼른 먹어라.
|
||||
얼매를 강께 막 까시뎅이가 어울러지고 사람이 댕기기가 에러워. 얼매__1/NNG 를/JKO 가/VV ᆼ께/EC 막/MAG 까시뎅이__2/NNG 가/JKS 어우르/VV 어/EC 지/VX 고/EC 사람/NNG 이/JKS 댕기__2/VV 기/ETN 가/JKS 에럽__1/VA-I 어/EF ./SF 얼마를 가니까 막 가시덤불이 얽히고 사람이 다니기가 어려워.
|
||||
그랑께 그것이 차두요. 그랑께__1/MAG 그것/NP 이/JKS 차두__2/NNG 이/VCP 요/JX ./SF 그러니까 그것이 자두요.
|
||||
그 야그를 들응깨 쪼까 께꾸롬하구만. 그/MM 야그__1/NNG 를/JKO 들/MAG 응깨/EC 쪼까__2/MAG 께꾸롬하__1/VA 구만/EF ./SF 그 이야기를 들으니까 조금 께름하구먼.
|
||||
저 버르제기럴 어쭈고 고친단가, 즈그 하납시가 저러코 키운 것을. 저/MM 버르제기__1/NNG 럴/JKO 어쭈고__1/MAG 고치/VV ᆫ단가/EC ,/SP 즈그__1/NP 하납시/NNG 가/JKS 저렇/VA-I 고/EC 키우/VV ᆫ/ETM 것/NNB 을/JKO ./SF 저 버르장머리를 어떻게 고친다나, 저희 할아버지가 저렇게 키운 것을.
|
||||
꼬랑주는 너무다 독해. 꼬랑주__1/NNG 는/JX 너무다/MAG 독하/VA 어/EF ./SF 고량주는 너무 독해.
|
||||
이장이 혼차 겔정헌 것을 두고 여러 사람이 게약을 허드라고. 이장/NNG 이/JKS 혼차__1/NNG 겔정__1/NNG 허/XSV ᆫ/ETM 것/NNB 을/JKO 두/VV 고/EC 여러/MM 사람/NNG 이/JKS 게약__1/NNG 을/JKO 허/VV 드라고/EF ./SF 이장이 혼자 결정한 것을 두고 여러 사람이 게정을 하더라고.
|
||||
가실에 산이 울굿불굿 물드먼 차말로 이뿌담서? 가실__5/NNG 에/JKB 산/NNG 이/JKS 울굿불굿__1/MAG 물/NNG 들/VV 먼/EC 차말로__1/MAG 이뿌/VA 담서/EF ?/SF 가을에 산이 울긋불긋 물들면 참말로 이쁘다면서?
|
||||
만사 구찮어 갖고 애비작애비작 걸어온다. 만사/NNG 구찮__1/VA 어/EC 갖/VX 고/EC 애비작애비작__1/MAG 걸어오/VV ᆫ다/EF ./SF 만사 귀찮아 갖고 어기적어기적 걸어온다.
|
||||
비가 겁나 쏟아지등마 날이 폴쎄 벗거졌네야. 비/NNG 가/JKS 겁나__2/MAG 쏟아지/VV 등마/EC 날/NNG 이/JKS 폴쎄__1/MAG 벗거지__2/VV 었/EP 네야/EF ./SF 비가 무척 쏟아지더니만 날이 벌써 개었네.
|
||||
너마이로 대충대충 해불먼 될 일도 안 되제. 너/NP 마이로/JKB 대충대충/MAG 하/VV 어/EC 불__11/VX 먼/EC 되/VV ᆯ/ETM 일/NNG 도/JX 안/MAG 되/VV 제/EF ./SF 너처럼 대충대충 해 버리면 될 일도 안 되지.
|
||||
대치 역서 멋 허고 있니? 대치__7/MAG 역__3/NP 서/JKB 멋__5/NP 허/VV 고/EC 있/VX 니/EC ?/SF 대체 여기서 무엇 하고 있니?
|
||||
쌩짐치가 삼삼허니 아주 맛나다. 쌩짐치__1/NNG 가/JKS 삼삼/XR 허/XSA 니/EC 아주/MAG 맛나/VA 다/EF ./SF 생김치가 삼삼하니 아주 맛있다.
|
||||
음석 준비가 다 되았이먼 언능 가조니라. 음석__1/NNG 준비/NNG 가/JKS 다/MAG 되/VV 았/EF 이먼/EC 언능__1/MAG 가조__1/VV 니라/EF ./SF 음식 준비가 다 되었으면 얼른 가져오너라.
|
||||
모실마동 대회 참가자가 다서여서썩은 되아. 모실__2/NNG 마동__1/JX 대회/NNG 참가자/NNG 가/JKS 다서여서__1/NR 썩__7/XSN 은/JX 되/VV 아/EF ./SF 마을마다 대회 참가자가 대여섯씩은 돼.
|
||||
부싯독을 팍 긁어서 불을 붙인다. 부싯독__1/NNG 을/JKO 팍/MAG 긁/VV 어서/EC 불/NNG 을/JKO 붙이/VV ᆫ다/EF ./SF 부싯돌을 팍 긁어서 불을 붙인다.
|
||||
다 큰 아가 어린장혀 쌓네. 다/MAG 크/VA ᆫ/ETM 아__23/NNG 가/JKS 어린장__1/NNG 하/VV 어/EC 쌓/VX 네/EF ./SF 다 큰 아이가 어리광해 대내.
|
||||
자네는 멋이 심들다고 그라고 한소끔을 쉬고 그런가? 자네/NP 는/JX 멋__4/NP 이/JKS 심__3/NNG 들/VV 다고/EC 그라/VV 고/EC 한소끔__3/NNG 을/JKO 쉬/VV 고/EC 그렇/VA-I ᆫ가/EF ?/SF 자네는 뭣이 힘들다고 그렇게 한숨을 쉬고 그러는가?
|
||||
야차막헌 후타리 너메 집 안을 딜다봤제라우. 야차막허__1/VA ᆫ/ETM 후타리__1/NNG 너메__1/NNG 집/NNG 안/NNG 을/JKO 딜다보__1/VV 었/EP 제라우/EF ./SF 야트막한 울타리 너머 집 안을 들여다봤지요.
|
||||
고 사람은 우악시로와서 미와 죽겄어라우. 고/MM 사람/NNG 은/JX 우악시롭/VA-I 어서/EC 밉/VA-I 어/EC 죽/VX 겄/EP 어라우/EF ./SF 그 사람은 우악스러워서 미워 죽겠어요.
|
||||
크독시란 이멩이는 호랭이만치 무섭지라. 크독시랍/VA-I ᆫ/ETM 이멩이__2/NNG 는/JX 호랭이__1/NNG 만치/JKB 무섭/VA-I 지라/EF ./SF 커다란 이무기는 호랑이만큼 무섭지요.
|
||||
씨잘데기없다고 생각허들 말고 열심히 히야 쓴다. 씨잘데기없__1/VA 다고/EC 생각/NNG 허/XSV 들/EC 말/VX 고/EC 열심히/MAG 하/VV 어야/EC 쓰/VV ᆫ다/EF ./SF 쓸데없다고 생각하지를 말고 열심히 해야 된다.
|
||||
이놈아, 시끄러운디 그만 잠 외고 댕게. 이놈/NP 아/JKV ,/SP 시끄럽/VA-I 은디/EC 그만/MAG 잠__14/MAG 외__11/VV 고/EC 댕기__2/VV 어/EF ./SF 이놈아, 시끄러운데 그만 좀 외치고 다녀.
|
||||
쇠괴기는 기름기가 새사이 있이야 맛이 좋당께. 쇠괴기__1/NNG 는/JX 기름/NNG 기/XSN 가/JKS 새사이__1/NNG 있/VA 이야/JX 맛/NNG 이/JKS 좋/VA 당께/EF ./SF 쇠고기는 기름기가 사이사이 있어야 맛이 좋다니까.
|
||||
밥을 겁나게 많이 묵었등만 옷이 째이네. 밥/NNG 을/JKO 겁나게__1/MAG 많이/MAG 묵__4/VV 었/EP 등만/EC 옷/NNG 이/JKS 째이__4/VV 네/EF ./SF 밥을 매우 많이 먹었더니만 옷이 째네.
|
||||
아그들이 그륵을 깨 갖고 혼짝을 냈제라우. 아그__1/NNG 들/XSN 이/JKS 그륵__1/NNG 을/JKO 깨/VV 어/EC 갖/VX 고/EC 혼짝__1/NNG 을/JKO 내/VV 었/EP 제라우/EF ./SF 아이들이 그릇을 깨서 혼쭐을 냈지요.
|
||||
진드껭이 땀시 고상헌 것도 다 엣날 일이제. 진드껭이__1/NNG 땀__5/NNB 시/JKB 고상__1/NNG 허/XSV ᆫ/ETM 것/NNB 도/JX 다/MAG 엣날__1/NNG 일/NNG 이/VCP 제/EF ./SF 진드기 때문에 고생한 것도 다 옛날 일이지.
|
||||
해는 지고 거그다 비까정 오니께 당최 질을 찾을 수 읎었어라우. 해/NNG 는/JX 지/VV 고/EC 거그다__1/MAG 비/NNG 까정/JX 오/VV 니께/EC 당최/MAG 질__4/NNG 을/JKO 찾/VV 을/ETM 수/NNB 읎__1/VA 었/EP 어라우/EF ./SF 해는 지고 게다가 비까지 오니까 도무지 길을 찾을 수 없었어요.
|
||||
야가 누가 띠메 가도 모리게 자고 있네. 야/NP 가/JKS 누구/NP 가/JKS 띠메__1/VV 어/EC 가/VX 어도/EC 모리__5/VV 게/EC 자/VV 고/EC 있/VX 네/EF ./SF 얘가 누가 떠메 가도 모르게 자고 있네.
|
||||
흑을 더 부어 갖고 바닥을 도다야 쓰겄네. 흑__5/NNG 을/JKO 더/MAG 붓/VV-I 어/EC 갖/VX 고/EC 바닥/NNG 을/JKO 도드__1/VV 어야/EC 쓰/VV 겄/EP 네/EF ./SF 흙을 더 부어 가지고 바닥을 돋워야 되겠네.
|
||||
긍게 니라도 내려와야제. 긍게__1/MAG 니/NP 이/VCP 라도/EC 내려오/VV 어야제/EF ./SF 그러니까 너라도 내려와야지.
|
||||
꼼장애럴 씹으먼 쫄긋쫄긋 아조 맛난 벨미여. 꼼장애/NNG 럴/JKO 씹/VV-R 으먼/EC 쫄긋쫄긋__1/MAG 아조/MAG 맛나/VA ᆫ/ETM 벨미__1/NNG 이/VCP 여/JKV ./SF 곰장어를 씹으면 쫄깃쫄깃 아주 맛난 별미야.
|
||||
비도 오고 밤질이 어둥께 자고 낼 가라고 했는디 한사고 집에 간다고 우기드랑께. 비/NNG 도/JX 오/VV 고/EC 밤/NNG 질__4/NNG 이/JKS 어둡/VA-I ᆼ께/EC 자/VV 고/EC 낼/NNG 가/VV 라고/EC 하/VV 었/EP 는디/EC 한사고__1/MAG 집/NNG 에/JKB 가/VV ᆫ다고/EC 우기/VV 드랑께/EF ./SF 비도 오고 밤길이 어두우니까 자고 내일 가라고 했는데 한사코 집에 간다고 우기더라니까.
|
||||
긍게 개잡기가 재밌기는 허제라. 긍게__1/MAG 개잡기__1/NNG 가/JKS 재밌/VA 기/ETN 는/JX 허/VX 제라/EF ./SF 그러니까 자치기가 재밌기는 하지요.
|
||||
운동장에는 쬐깐한 애들이 고데고데허니 있어. 운동장/NNG 에/JKB 는/JX 쬐깐__1/NNG 하/XSA ᆫ/ETM 애/NNG 들/XSN 이/JKS 고데고데허__1/VA 니/EC 있/VA 어/EF ./SF 운동장에는 조그만한 아이들이 다붓다붓하게 있어.
|
||||
사램이 죽어불먼 여영 못 볼 디로 가는 거여. 사램__1/NNG 이/JKS 죽/VV 어/EC 불__11/VX 먼/EC 여영__4/MAG 못/MAG 보/VV ᆯ/ETM 디__1/NNB 로/JKB 가/VV 는/ETM 거/NNB 이/VCP 여/EF ./SF 사람이 죽어버리면 영영 못 볼 데로 가는 거야.
|
||||
일을 다 끝냈응께 오늘 하레치 품삭을 어서 주씨요. 일/NNG 을/JKO 다/MAG 끝내/VV 었/EP 응께/EC 오늘/NNG 하레치__1/NNG 품삭__1/NNG 을/JKO 어서/MAG 주/VV 씨요/EF ./SF 일을 다 끝냈으니까 오늘 하루치 품삯을 어서 주세요.
|
||||
나헌티 엥기먼 가만두지 않을 티니께 알아서 혀. 나/NP 헌티/JKB 엥기__3/VV 먼/EC 가만두/VV 지/EC 않/VX 을/ETM 티/NNB 이/VCP 니께/EC 알/VV 어서/EC 허/VV 어/EF ./SF 나한테 걸리면 가만두지 않을 테니까 알아서 해.
|
||||
감마솟이다 멀 낋인당가? 감마솟__1/NNG 이다/JKB 멀/VA 낋이__1/VV ᆫ당가/EF ?/SF 가마솥에다 무엇을 끓이는가?
|
||||
지금은 거기 시누대가 꽉 차서 다니기도 힘들어. 지금/NNG 은/JX 거기/NP 시누대__3/NNG 가/JKS 꽉/MAG 차/VV 어서/EC 다니/VV 기/ETN 도/JX 힘들/VA 어/EF ./SF 지금은 거기 신의대가 꽉 차서 다니기도 힘들어.
|
||||
오늘 기약을 혔는 갑소. 오늘/MAG 기약__9/NNG 을/JKO 허/VV 었/EP 는가/EC ᆸ소/EF ./SF 오늘 계약을 했는가 봐요.
|
||||
딸내미헌티 집안일 잠 하락 했드이만 팽기치고 마실 나가 불었구마이. 딸내미/NNG 헌티/JKB 집안일/NNG 잠__14/MAG 하/VV 락/EC 하/VV 었/EP 드이만/EC 팽기치__1/VV 고/EC 마실/NNG 나가/VV 어/EC 불__11/VX 었/EP 구마이/EF ./SF 딸내미한테 집안일 좀 하라고 했더니만 팽개치고 마을 나가 버렸구먼.
|
||||
염생이란 놈이 연데가리없이 내 손을 칵 물드란 말이시. 염생이__1/NNG 이/VCP 란/ETM 놈/NNB 이/JKS 연데가리없이__1/MAG 나/NP 의/JKG 손/NNG 을/JKO 칵/MAG 물/VV 드란/ETM 말/NNG 이/VCP 시/EF ./SF 염소란 놈이 연득없이 내 손을 콱 물더란 말일세.
|
||||
그러고 개울배기로 살락 허지 말란 말이시. 그러/VV 고/EC 개울배기/NNG 로/JKB 살/VV 락/EC 허/VX 지/EC 말/VX 란/ETM 말/NNG 이/VCP 시/EF ./SF 그렇게 게으름뱅이로 살려 하지 말란 말이야.
|
||||
호박써레기를 넣고 죽을 낋이먼 맛있제라우. 호박써레기__1/NNG 를/JKO 넣/VV 고/EC 죽/NNG 을/JKO 낋이__1/VV 먼/EC 맛있/VA 제/EC 라우/EF ./SF 호박고지를 넣고 죽을 끓이면 맛있지요.
|
||||
니가 멋모르고 망냉이같이 까불드만 오늘 옳게 한번 혼나구나. 니__5/NP 가/JKS 멋모르/VV 고/EC 망냉이__1/NNG 같이/JKB 까불/VV 드만/EC 오늘/MAG 옳게__1/MAG 한/MM 번/NNB 혼나/VV 구나/EF ./SF 네가 멋모르고 망나니같이 까불더니만 오늘 제대로 한번 혼나는구나.
|
||||
아침 손님들이 내둥 대야섯썩은 된당께. 아침/NNG 손/NNG 님/XSN 들/XSN 이/JKS 내둥__1/MAG 대야섯__1/NR 썩__7/XSN 은/JX 되/VV ᆫ/ETM 당께/EF ./SF 아침 손님들이 내내 대여섯씩은 된다니까.
|
||||
활랑 벗고 댕이다가 개짐머리 걸린다. 활랑__1/MAG 벗/VV-R 고/EC 댕이__3/VV 다가/EC 개짐머리__1/NNG 걸리/VV ᆫ다/EF ./SF 홀랑 벗고 다니다가 감기 걸린다.
|
||||
자네 허는 행오가 지끔 옳다는 것이여? 자네/NP 허/VV 는/ETM 행오__1/NNG 가/JKS 지끔__2/NNG 옳/VA 다는/ETM 것/NNB 이/VCP 여/EF ?/SF 자네 하는 행위가 지금 옳다는 거야?
|
||||
바우가 벼랑 끄터리에 있응게 날람허등만. 바우__1/NNG 가/JKS 벼랑/NNG 끄터리__1/NNG 에/JKB 있/VA 응게/EC 날람허__1/VA 등만/EF ./SF 바위가 벼랑 끄트머리에 있으니까 위태하더만.
|
||||
다담이질허게 홍돌깨를 가져오랑께. 다담이질__1/NNG 허/XSV 게/EC 홍돌깨__1/NNG 를/JKO 가져오/VV 랑께/EF ./SF 다듬이질하게 홍두깨를 가져오라니까.
|
||||
물동우를 반만 채워서 이면 헤겁지. 물동우__1/NNG 를/JKO 반/NNG 만/JX 채우/VV 어서/EC 이/VV 면/EC 헤겁__1/VA-I 지/EF ./SF 물동이를 반만 채워서 이면 가볍지.
|
||||
얼굴을 봉게 허벌나게 고상힜는갑소. 얼굴/NNG 을/JKO 보/VV ᆼ게/EC 허벌나__1/VA 게/EC 고상허__1/VV 었/EP 는가/EC ᆸ소/EF ./SF 얼굴을 보니까 엄청나게 많이 고생했나 봐요.
|
||||
역서는 씨림헐 때 오른동걸이를 많이 허제만 다른 디 가 봉께 왼동걸이도 허등만이라. 역__3/NP 서/JKB 는/JX 씨림__1/NNG 허/XSV ᆯ/ETM 때/NNG 오른동걸이__1/NNG 를/JKO 많이/MAG 허/VV 제만/EC 다른/MM 디__1/NNB 가/VV 어/EC 보/VX ᆼ께/EC 왼동걸이__1/NNG 도/JX 허/VV 등만이라/EF ./SF 여기서는 씨름할 때 오른씨름을 많이 하지만 다른 데 가 보니까 왼씨름도 하더군요.
|
||||
보림만 되먼 내 더구락 험시롱 더구럴 팔고 댕에. 보림__1/NNG 만/JX 되/VV 먼/EC 나/NP 의/JKG 더구__1/NNG 락__3/EC 허/VV ᆷ시롱__1/EC 더구__1/NNG 럴/JKO 팔/VV 고/EC 댕이__3/VV 어/EF ./SF 보름만 되면 내 더위라고 하면서 더위를 팔고 다녀.
|
||||
야는 연필 쥐는 거 봉께 왼동잽이구마. 야/NP 는/JX 연필/NNG 쥐/VV 는/ETM 거/NNB 보/VV ᆼ께/EC 왼동잽이__1/NNG 이/VCP 구마/EF ./SF 얘는 연필 쥐는 거 보니까 왼손잡이구먼.
|
||||
안 허던 운동을 힜더니 옆굴창이 땅겨서 못 자겄네. 안/MAG 허/VV 던/ETM 운동/NNG 을/JKO 하/VV 었/EP 더니/EC 옆굴창__1/NNG 이/JKS 땅기/VV 어서/EC 못/MAG 자/VV 겄/EP 네/EF ./SF 안 하던 운동을 했더니 옆구리가 땅겨서 못 자겠네.
|
||||
엣날에는 소죽 쒀 줄라고 마구간 앞에 가매솟을 걸어 놨당게. 엣날__1/NNG 에/JKB 는/JX 소/NNG 죽/NNG 쑤/VV 어/EC 주/VX ᆯ라고/EC 마구간/NNG 앞/NNG 에/JKB 가매솟__1/NNG 을/JKO 걸/VV 어/EC 놓/VX 었/EP 당게/EF ./SF 옛날에는 소죽 쒀 주려고 마구간 앞에 가마솥을 걸어 놓았다니까.
|
||||
오날날까장 무탈헌 거여. 오날날__1/NNG 까장/JX 무탈/XR 허/XSA ᆫ/ETM 거/NNB 이/VCP 여/EF ./SF 오늘날까지 무탈한 거야.
|
||||
막냉이 말론 성지간이 모이는디 즈그 큰성이 그 중 만그듬에 오드라네. 막냉이__1/NNG 말/NNG 로/JKB ᆫ/JX 성지간__1/NNG 이/JKB 모이/VV 는디/EC 즈그/NP 큰성__3/NNG 이/JKS 그/MM 중/NNB 만그듬__1/NNG 에/JKB 오/VV 드라네/EF ./SF 막내 말론 형제간에 모이는데 자기 큰형이 그 중 마지막에 오더라네.
|
||||
해후름에나 오실란가 모리겄소. 해후름__1/NNG 에/JKB 나/JX 오/VV 시/EP ᆯ라가/EC 모리__5/VV 겄/EP 소/EF ./SF 해거름에나 오시려는지 모르겠소.
|
||||
살림살이가 옹삭시롱께 애기들 핵교도 못 보냈제. 살림살이/NNG 가/JKS 옹삭시롭__1/VA-I ᆼ께/EC 애기/NNG 들/XSN 핵교__1/NNG 도/JX 못/MAG 보내/VV 었/EP 제/EF ./SF 살림살이가 옹색스러우니까 아이들 학교도 못 보냈지.
|
||||
녹두노물은 잘 쉬니께 오늘 싹 묵어 치워야 쓰겄다. 녹두노물__1/NNG 은/JX 잘/MAG 쉬/VV 니께/EC 오늘/MAG 싹/MAG 묵__4/VV 어/EC 치우/VV 어야/EC 쓰/VV 겄/EP 다/EF ./SF 숙주나물은 잘 쉬니까 오늘 싹 먹어 치워야 되겠다.
|
||||
논물을 끌어 갈라고 우리 도개럴 놈이 열어 놨닥 헤라우. 논물/NNG 을/JKO 끌/VV 어/EC 가/VX ᆯ라고/EC 우리/NP 도개__4/NNG 럴/JKO 놈__10/NNG 이/JKS 열/VV 어/EC 놓/VX 었/EP 닥/EC 하/VV 어라우/EF ./SF 논물을 끌어 가려고 우리 논도랑을 남이 열어 놨다고 해요.
|
||||
어째 잘 고정이 안 되았는가 막 흔득흔득해라우. 어째/MAG 잘/MAG 고정/NNG 이/JKC 안/MAG 되/VV 었/EP 는가/EC 막/MAG 흔득흔득__1/MAG 하/XSA 어라우/EF ./SF 어째 잘 고정이 안 됐는지 막 흔덕흔덕해요.
|
||||
잠칭이가 어쩐 일로 일찍 일어났디야. 잠칭이__1/NNG 가/JKS 어쩌/VV ᆫ/ETM 일/NNG 로/JKB 일찍/MAG 일어나/VV 었/EP 디야/EF ./SF 잠꾸러기가 어쩐 일로 일찍 일어났대.
|
||||
노인네가 쌔뜩헌 옷을 좋아헝께 항시 젊어 보이드만. 노인/NNG 네/XSN 가/JKS 쌔뜩__1/XR 허/XSA ᆫ/ETM 옷/NNG 을/JKO 좋아허/VV ᆼ께/EC 항시/MAG 젊/VA 어/EC 보이/VV 드만/EF ./SF 노인네가 새뜻한 옷을 좋아하니까 항시 젊어 보이더만.
|
||||
나는 심탈 사나운 여자가 젤로 싫어. 나/NP 는/JX 심탈__1/NNG 사납/VA-I 은/ETM 여자/NNG 가/JKS 젤__2/MAG 로/JKB 싫/VA 어/EF ./SF 나는 성깔 사나운 여자가 제일 싫어.
|
||||
근동 멧에 노리덜이 삼스렁 고매럴 다 파묵은닥 해. 근동/NNG 멧__4/NNG 에/JKB 노리__1/NNG 덜/XSN 이/JKS 살/VV ᆷ스렁/EC 고매__1/NNG 럴/JKO 다/MAG 파묵/VV 은닥/EC 하/VV 어/EF ./SF 근처 산에 노루들이 살면서 고구마를 다 파먹는다고 해.
|
||||
그 집 가수원으 복숭이 맛나다. 그/MM 집/NNG 가수원__1/NNG 으/JKG 복숭__1/NNG 이/JKS 맛나/VA 다/EF ./SF 그 집 과수원의 복숭아가 맛나다.
|
||||
푹푹 삶아서 호아지면 너물로 무쳐 묵자. 푹푹/MAG 삶/VV 어서/EC 호아지__1/VV 면/EC 너물__2/NNG 로/JKB 무치/VV 어/EC 묵__4/VV 자/EF ./SF 푹푹 삶아서 눅어지면 나물로 무쳐 먹자.
|
||||
게란이 이롸 갖고 닥이 되아. 게란__1/NNG 이/JKS 이루__7/VV 어/EC 갖/VX 고/EC 닥__6/NNG 이/JKC 되/VV 어/EF ./SF 계란이 부화해 가지고 닭이 돼.
|
||||
일언 삼니떡이 참 잘혀. 일/NNG 언/JX 삼니/NNP 떡__19/XSN 이/JKS 참/MAG 잘/MAG 하/VV 어/EF ./SF 일은 삼례댁이 참 잘해.
|
||||
하루에도 멫 번썩 물을 주야 콩노물을 잘 지룰 수 있어. 하루/NNG 에/JKB 도/JX 멫__1/NR 번/NNB 썩__7/XSN 물/NNG 을/JKO 주/VV 어야/EC 콩노물__1/NNG 을/JKO 잘/MAG 지루__1/VV ᆯ/ETM 수/NNB 있/VA 어/EF ./SF 하루에도 몇 번씩 물을 줘야 콩나물을 잘 기를 수 있어.
|
||||
거그는 갑짜리만 모탔구만. 거그__1/NP 는/JX 갑짜리__2/NNG 만/JX 모트__1/VV 었/EP 구만/EF ./SF 거기는 동갑만 모았구먼.
|
||||
마실 사람들이 회관에 까뜩 들어찼담서? 마실__2/NNG 사람/NNG 들/XSN 이/JKS 회관/NNG 에/JKB 까뜩__1/MAG 들어차/VV 었/EP 담서/EF ?/SF 동네 사람들이 회관에 가득 들어찼다면서?
|
||||
동시간에 앉어서 뒤본다. 동시간__1/NNG 에/JKB 앉/VV 어서/EC 뒤보__1/VV ᆫ다/EF ./SF 변소에 앉아서 뒤본다.
|
||||
첨에 논을 딱 갈아서 써울려 놓고 모를 쪄야 허는 거이지라. 첨/NNG 에/JKB 논/NNG 을/JKO 딱/MAG 갈/VV 어서/EC 써울리__1/VV 어/EC 놓/VX 고/EC 모/NNG 를/JKO 찌/VV 어야/EC 허/VX 는/ETM 거/NNB 이/VCP 지라/EF ./SF 처음에 논을 딱 갈아서 써레질해 놓고 모를 쪄야 하는 것이지요.
|
||||
인자 해 질 요령잉께 뻘에서 나오시씨요. 인자__1/MAG 해/NNG 지/VV ᆯ/ETM 요령__10/NNB 이/VCP ᆼ께/EC 뻘/NNG 에서/JKB 나오/VV 시/EP 씨요/EF ./SF 이제 해 질 무렵이니까 뻘에서 나오십시오.
|
||||
아도 아직 에레고 다 키울라먼 멀었다. 아__23/NNG 도/JX 아직/MAG 에레__1/VA 고/EC 다/MAG 키우/VV ᆯ라먼/EC 멀/VA 었/EP 다/EF ./SF 아이도 아직 어리고 다 키우려면 멀었다.
|
||||
역서는 씨림을 힜닥 허먼 오른동걸이로 허제. 역/NP 서/JKB 는/JX 씨림__1/NNG 을/JKO 하/VV 었/EP 닥/EC 허/VV 먼/EC 오른동걸이__1/NNG 로/JKB 허/VV 제/EF ./SF 여기서는 씨름을 했다면 오른씨름으로 하지.
|
||||
우리 민누리가 어머니맹킬로는 지를 못 담구겄다 그네요. 우리/NP 민누리__1/NNG 가/JKS 어머니/NNG 맹키로/JKB 는/JX 지__4/NNG 를/JKO 못/MAG 담구__2/VV 겄/EP 다/EF 그러/VV 네요/EF ./SF 우리 며느리가 어머니처럼은 김치를 못 담그겠다고 그러네요.
|
||||
옛날에는 평상 아그들이 대야섯썩이제. 옛날/NNG 에/JKB 는/JX 평상__3/MAG 아그__1/NNG 들/XSN 이/JKS 대야섯/NR 썩/XSN 이/VCP 제/EF ./SF 옛날에는 내나 아이들이 대여섯씩이지.
|
||||
나는 거끄장은 모릉께 더 야그 마시씨요. 나/NP 는/JX 거/NP 끄장/JX 은/JX 모르/VV ᆼ께/EC 더/MAG 야그__1/NNG 말/VX 시/VV 씨요/EF ./SF 나는 거기까지는 모르니까 더 이야기 마시요.
|
||||
인자 무구 따문에 마당에서 몬 자는 것이제. 인자__1/MAG 무구__9/NNG 따문__1/NNB 에/JKB 마당/NNG 에서/JKB 몬__3/MAG 자/VV 는/ETM 것/NNB 이/VCP 제/EF ./SF 이제 모기 때문에 마당에서 못 자는 것이지.
|
||||
얼끔 생각해 보먼 다 존 일 같소. 얼끔__1/MAG 생각/NNG 하/XSV 어/EC 보/VX 먼/EC 다/MAG 좋/VA ᆫ/ETM 일/NNG 같/VA 소/EF ./SF 언뜻 생각해 보면 다 좋은 일 같소.
|
||||
동식이 넘, 요리 잔 와 보씨요. 동식이/NNP 넘__3/NNG ,/SP 요리__1/MAG 잔__1/MAG 오/VV 어/EC 보/VX 씨요/EF ./SF 동식이 어머니, 이리 좀 와 보세요.
|
||||
우리 아들놈은 올해 만드리도 완곤히 끗을 냈단 말이시. 우리/NP 아들/NNG 놈/NNB 은/JX 올해/NNG 만드리__1/NNG 도/JX 완곤히__1/MAG 끗__5/NNG 을/JKO 내/VV 었/EP 단/ETM 말/NNG 이/VCP 시/EF ./SF 우리 아들놈은 올해 만도리도 완전히 끝을 냈단 말일세.
|
||||
요놈우 괴기는 살 볼그기가 성가와서 못 먹어라우. 요놈/NP 우/JKG 괴기__6/NNG 는/JX 살/NNG 볼그__1/VV 기/ETN 가/JKS 성갑__1/VA-I 어서/EC 못/MAG 먹/VV 어라우/EF ./SF 요놈의 고기는 살 바르기가 성가셔서 못 먹어요.
|
||||
여우살을 허는 거이 쉽지는 않제. 여우살__1/NNG 을/NNG 허/VV 는/ETM 거/NNB 이/JKS 쉽/VA-I 지/EC 는/JX 않/VX 제/EF ./SF 처가살이를 하는 게 쉽지는 않지.
|
||||
하렛내 밥충이같이 묵기만 허고 집 안에만 있으니 멋이 되겄냐? 하렛내/MAG 밥충이__1/NNG 같이/MAG 묵__4/VV 기/ETN 만/JX 허/VX 고/EC 집/NNG 안/NNG 에/JKB 만/JX 있/VV 으니/EC 멋/NP 이/JKC 되/VV 겄/EP 냐/EF ?/SF 하루 내내 식충이같이 먹기만 하고 집 안에만 있으니 뭐가 되겠니?
|
||||
아그들은 호신 맛으로 군지를 타제. 아그__1/NNG 들/XSN 은/JX 호시__1/VA ᆫ/ETM 맛/NNG 으로/JKB 군지__1/NNG 를/JKO 타/VV 제/EF ./SF 아이들은 재미있는 맛으로 그네를 타지.
|
||||
내가 십오 년을 너미를 두었제만 그놈은 착실허기가 말헐 것이 없어. 나/NP 가/JKS 십오/NR 년/NNB 을/JKO 너미__1/NNG 를/JKO 두/VV 었/EP 제만/EC 그놈/NP 은/JX 착실/XR 허/XSA 기/ETN 가/JKS 말/NNG 허/XSV ᆯ/ETM 것/NNB 이/JKS 없/VA 어/EF ./SF
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
팡구에 부테소니래 한머사니 잇수다. 팡구__1/NNG 에/JKB 부테소니__1/NNG 래/JKS 한머사니__1/MAG 잇/VA-R 수다/EF ./SF 바위에 부처손이 많이 있습니다.
|
||||
다네 왜큰마니래 오신다는 날이 오늘이 맞네? 다/NP 네/XSN 왜큰마니__1/NNG 래/JKS 오/VV 시/EP ᆫ다는/ETM 날/NNG 이/JKS 오늘/NNG 이/JKS 맞/VV 네/EF ?/SF 쟤네 외할머니가 오신다는 날이 오늘이 맞니?
|
||||
깍 깨밀어라. 깍__7/MAG 깨밀__1/VV 어라/EF ./SF 꼭 깨물어라.
|
||||
내래 초개마가리를 해두 신세는 기티디 않을 겁네다. 나/NP 래/JKS 초개마가리__1/NNG 를/JKO 하/VV 어두/EC 신세/NNG 는/JX 기티/VV 디/EC 않/VX 을/ETM 거/NNB 이/VCP ᆸ네다/EF ./SF 내가 오막살이를 해도 신세는 끼치지 않을 겁니다.
|
||||
아들놈이 글을 잘 따루내니끼니까 공부를 더 가르체야 하갓수다. 아들놈/NNG 이/JKS 글/NNG 을/JKO 잘/MAG 따루내__1/VV 니끼니까/EC 공부/NNG 를/JKO 더/MAG 가르체__1/VV 어야/EF 하/VX 갓/EP 수다/EF ./SF 아들놈이 글을 잘 외니 공부를 더 가르쳐야 하겠습니다.
|
||||
당사하는 건 중국 사람이 잘합네다. 당사하__3/VV 는/ETM 거/NNB ᆫ/JX 중국/NNP 사람/NNG 이/JKS 잘/MAG 하/VX ᆸ네다/EF ./SF 장사하는 건 중국 사람이 잘합니다.
|
||||
가는 어드래서 데맇게 왁자지근하네 가/NP 는/JX 어드래서/MAG 데맇/VA-I 게/EC 왁자지근하__1/VV 네/EF 걔는 어째서 저렇게 왁자지껄하니?
|
||||
쌈지래 큰아바지 오른켄에 잇이요. 쌈지/NNG 래/JKS 큰아바지__1/NNG 오른켄__1/NNG 에/JKB 잇/VA-R 이요/EF ./SF 쌈지가 할아버지 오른편에 있어요.
|
||||
넢구리가 께낀하니끼니 날래 털라요. 넢구리__1/NNG 가/JKS 께낀하__1/VA 니끼니/EC 날래__1/MAG 털/VV 라요/EF ./SF 옆구리가 더러우니까 빨리 터세요.
|
||||
닛못이 아푸문 고상이 막심합네다. 닛못__1/NNG 이/JKS 아푸/VA 문/EC 고상__1/NNG 이/JKS 막심/NNG 하/XSV ᆸ네다/EF ./SF 잇몸이 아프면 고생이 막심합니다.
|
||||
냥디에는 발쎄 눈이 다 녹앗디요. 냥디__1/NNG 에/JKB 는/JX 발쎄__2/MAG 눈/NNG 이/JKS 다/MAG 녹/VV 엇/EP 디요/EF ./SF 양지에는 벌써 눈이 다 녹았지요.
|
||||
소는 비싸니끼니 소왕간에 쇄지나 싸다 넣구 멕이시라요. 소/NNG 는/JX 비싸/VA 니끼니/EC 소왕간__1/NNG 에/JKB 쇄지__2/NNG 나/JC 싸__21/VV 다/EF 넣/VV 구/EC 멕이__1/VV 시/EP 라요/EF ./SF 소는 비싸니까 외양간에 송아지나 사다 넣고 먹이세요.
|
||||
댜네 집 보리농구래 다 닉엇갓디? 댜/NP 네/XSN 집/NNG 보리농구__1/NNG 래/JKS 다/MAG 닉/VV 엇/EP 갓/EP 디/EF ?/SF 쟤네 집 자두가 다 익었겠지?
|
||||
더기 가는 체네래 앞집 아즈바이 왜손네웨다. 더기__3/NP 가/VV 는/ETM 체네__1/NNG 래/JKS 앞집/NNG 아즈바이__1/NNG 왜손네__1/NNG 이/VCP 웨다/EF ./SF 저기 가는 처녀가 앞집 아저씨 외손녀외다.
|
||||
웬일인디 왜클아바지래 자무런 말씀이 없엇이요. 웬일/NNG 이/VCP ᆫ디/EC 왜클아바지__1/NNG 래/JKS 자무런/MM 말씀/NNG 이/JKS 없/VA 엇/EP 이요/JX ./SF 웬일인지 외할아버지가 아무런 말씀이 없었어요.
|
||||
나케 오롯길루 가야갓다. 나케__1/MAG 오롯길__1/NNG 루/JKB 가/VV 어야/EC 갓/EP 다/EF ./SF 이따가 오솔길로 가야겠다.
|
||||
국마룩이 식지 않게 가마뚜껑얼 깍 닫았다. 국마룩__1/NNG 이/JKS 식/VV 지/EC 않/VX 게/EC 가마/NNG 뚜껑/NNG 얼/JKO 깍__7/MAG 닫/VV-R 었/EP 다/EF ./SF 국물이 식지 않게 솥뚜껑을 꼭 닫았다.
|
||||
산에 갈 때 굴걱지 개지구 나가는 거 닞디 말라우. 산/NNG 에/JKB 가/VV ᆯ/ETM 때/NNG 굴걱지__1/NNG 개지__1/VV 구/EC 나가/VV 는/ETM 거/NNB 닞/VV 디/EC 말/VX 라우/EF ./SF 산에 갈 때 옷 가지고 나가는 것 잊지 마라.
|
||||
와 기케 술을 딜이마시네? 와__7/MAG 기케/MAG 술/NNG 을/JKO 딜이마시__1/VV 네/EF ?/SF 왜 그렇게 술을 들이마시니?
|
||||
잔챗집이란 거저 데렇게 왁자지근한 거웨다. 잔챗집__1/NNG 이란/JX 거저/MAG 데렇__1/VA-I 게/EC 왁자지근/XR 하/XSA ᆫ/ETM 거/NNB 이/VCP 웨다/EF ./SF 잔칫집이란 그저 저렇게 왁자지껄한 것입니다.
|
||||
가래 왠손좨기라 왠손으루 글씨를 씁네다. 가/NP 래/JKS 왠손좨기__1/NNG 이/VCP 라/EC 왠손__1/NNG 으루/JKB 글씨/NNG 를/JKO 쓰/VV ᆸ네다/EF ./SF 개가 왼손잡이라 왼손으로 글씨를 씁니다.
|
||||
젠에 사람들이야 자동고를 안 배왓이요. 젠/NNG 에/JKB 사람/NNG 들/XSN 이야/JX 자동고__1/NNG 를/JKO 안/MAG 배오__1/VV 엇/EP 이요/EF ./SF 전에 사람들이야 자전거를 안 배웠어요.
|
||||
삽 소리 디끄룹다. 꿀구 가디 말라. 삽/NNG 소리/NNG 디끄룹__1/VA-R 다/EF ./SF 꿀/VV 구/EC 가/VV 디/EC 말/VX 라/EF ./SF 삽 소리 듣그럽다. 끌고 가지 말아라.
|
||||
세 잇디 말구 얼등 앉으람. 세__20/VV 어/EC 잇/VX-R 디/EC 말/VX 구/EC 얼등__1/MAG 앉/VV 으람/EF ./SF 서 있지 말고 어서 앉으렴.
|
||||
그지께 일루 상게두 나무럽습메까? 그지께__1/NNG 일/NNG 루/JKB 상게__1/MAG 두/JX 나무럽__1/VA-I 습메까/EF ?/SF 그저께 일로 아직도 노엽습니까?
|
||||
동제맨 바오래기래 다 끄켓수다. 동제매__1/VV ᆫ/ETM 바오래기__1/NNG 래/JKS 다/MAG 끄키__1/VV 엇/EP 수다/EF ./SF 동여맨 바오라기가 다 끊겼습니다.
|
||||
넷날 냬기는 해서 뭐 하간? 넷날__1/NNG 냬기__1/NNG 는/JX 하/VV 어서/EC 뭐/NP 하/VV 간/EF ?/SF 옛날 이야기는 해서 뭐 하겠니?
|
||||
더기 낭짝에 앉아 잇는 거이 누구가? 더기__3/NP 낭짝__1/NNG 에/JKB 앉/VV 어/EC 잇/VX-R 는/ETM 거/NNB 이/JKS 누구/NP 이/VCP 가/EF ?/SF 저기 양지쪽에 앉아 있는 게 누구냐?
|
||||
쌀 그르구 땔깜두 준비해야디. 쌀/NNG 그르구__1/MAG 땔깜/NNG 두/JX 준비/NNG 하/XSV 어야디/EF ./SF 쌀 그리고 땔감도 준비해야지.
|
||||
닞디 말구 넝수증을 받아 오시라요. 닞/VV 디/EC 말/VX 구/EC 넝수증__1/NNG 을/JKO 받/VV-R 어/EC 오/VV 시/EP 라요/EF ./SF 잊지 말고 영수증을 받아 오세요.
|
||||
산맑에 오루니끼니 정말루 상쾌허우다레. 산맑__1/NNG 에/JKB 오루/VV 니끼니/EC 정말루/MAG 상쾌/XR 허/XSA 우다레/EF ./SF 산마루에 오르니까 정말로 상쾌합니다그려.
|
||||
산에 부즈런히 올라갓다 왓수다. 산/NNG 에/JKB 부즈런히__1/MAG 올라가/VV 엇/EP 다/EC 오/VV 엇/EP 수다/EF ./SF 산에 부지런히 올라갔다 왔습니다.
|
||||
내래 그 소식을 알괫디. 나/NP 래/JKS 그/MM 소식/NNG 을/JKO 알괘__1/VV 엇/EP 디/EF ./SF 내가 그 소식을 알렸지.
|
||||
내래 메쌀가루루 맨든 거, 젤펜 돟아해요. 나/NP 래/JKS 메쌀__1/NNG 가루/NNG 루/JKB 맨들/VV ᆫ/ETM 거/NNB ,/SP 젤펜__1/NNG 돟__1/VA 어/EC 하/VX 어요/EF ./SF 내가 멥쌀가루로 만든 거, 절편 좋아해요.
|
||||
절게방은 뭐 하레 갑마? 절게방__1/NNG 은/JX 뭐/NP 하/VV 레/EC 가/VV ᆸ마/NNG ?/SF 머슴방은 뭐 하러 가는가?
|
||||
한딧잠 잘 땐 누덩불이나 피워야디 딴 도리래 잇갓이요? 한딧잠__1/NNG 자/VV ᆯ/ETM 때/NNG ᆫ/JX 누덩불__1/NNG 이나/JC 피우/VV 어야디/EC 딴/MM 도리/NNG 래/JKS 잇/VV-R 갓/EP 이요/EF ?/SF 한뎃잠 잘 땐 모닥불이나 피워야지 다른 도리가 있겠어요?
|
||||
우리 동무터럼 성하게 디냅세다. 우리/NP 동무/NNG 터럼__1/JKB 성하__9/VA 게/EC 디내/VV ᆸ세다/EF ./SF 우리 동무처럼 허물없게 지냅시다.
|
||||
가래 한 삼십 나서 당개갓이요. 가/NP 래/JKS 한/MM 삼/NR 십/NR 나/VV 어서/EC 당개__1/NNB 가/VV 엇/EP 이요/EF ./SF 걔가 한 서른 살 되어서 장가갔어요.
|
||||
가 오정 쌋나 보구레. 가/NP 오정__6/NNG 싸/VV 엇/EP 나/EC 보/VX 구레/EF ./SF 그 아이 오줌 쌌나 보구려.
|
||||
삼춘오마니는 당사를 잘 못함메. 삼춘오마니__1/NNG 는/JX 당사/NNG 를/JKO 잘/MAG 못/MAG 하/VV ᆷ메/EF ./SF 작은어머니는 장사를 잘 못하네.
|
||||
솔가래가 많이 쌓였다. 솔가래__1/NNG 가/JKS 많이/MAG 쌓이/VV 었/EP 다/EF ./SF 솔가리가 많이 쌓였다.
|
||||
|
|
@ -10,9 +10,7 @@ namespace kiwi
|
|||
sse2,
|
||||
sse4_1,
|
||||
avx2,
|
||||
avx_vnni,
|
||||
avx512bw,
|
||||
avx512vnni,
|
||||
neon,
|
||||
last = neon,
|
||||
};
|
||||
|
|
@ -27,9 +25,18 @@ namespace kiwi
|
|||
const char* archToStr(ArchType arch);
|
||||
|
||||
template<ArchType arch>
|
||||
struct ArchInfo
|
||||
struct ArchInfo;
|
||||
|
||||
template<>
|
||||
struct ArchInfo<ArchType::none>
|
||||
{
|
||||
static constexpr size_t alignment = 4;
|
||||
static constexpr size_t alignment = 0;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ArchInfo<ArchType::balanced>
|
||||
{
|
||||
static constexpr size_t alignment = 0;
|
||||
};
|
||||
|
||||
template<>
|
||||
|
|
@ -50,24 +57,12 @@ namespace kiwi
|
|||
static constexpr size_t alignment = 32;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ArchInfo<ArchType::avx_vnni>
|
||||
{
|
||||
static constexpr size_t alignment = 32;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ArchInfo<ArchType::avx512bw>
|
||||
{
|
||||
static constexpr size_t alignment = 64;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ArchInfo<ArchType::avx512vnni>
|
||||
{
|
||||
static constexpr size_t alignment = 64;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ArchInfo<ArchType::neon>
|
||||
{
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue