{"id":38691250,"url":"https://github.com/bab2min/kiwipiepy","last_synced_at":"2026-01-17T10:32:54.623Z","repository":{"id":35128990,"uuid":"206734686","full_name":"bab2min/kiwipiepy","owner":"bab2min","description":"Python API for Kiwi","archived":false,"fork":false,"pushed_at":"2025-12-25T17:45:42.000Z","size":171094,"stargazers_count":349,"open_issues_count":12,"forks_count":35,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-12-27T04:37:12.529Z","etag":null,"topics":["korean","korean-nlp","korean-tokenizer","morphological-analysis","nlp","python-library","word-segmentation"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bab2min.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["bab2min"]}},"created_at":"2019-09-06T07:08:50.000Z","updated_at":"2025-12-25T17:45:45.000Z","dependencies_parsed_at":"2023-12-03T04:19:00.818Z","dependency_job_id":"b7b6390b-a28b-492d-83df-7cd16782ff91","html_url":"https://github.com/bab2min/kiwipiepy","commit_stats":{"total_commits":506,"total_committers":5,"mean_commits":101.2,"dds":0.02371541501976282,"last_synced_commit":"8c83a4a3bb242f31ec8cadd14f88ddc7f82ba323"},"previous_names":[],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/bab2min/kiwipiepy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bab2min%2Fkiwipiepy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bab2min%2Fkiwipiepy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bab2min%2Fkiwipiepy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bab2min%2Fkiwipiepy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bab2min","download_url":"https://codeload.github.com/bab2min/kiwipiepy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bab2min%2Fkiwipiepy/sbom","scorecard":{"id":222268,"data":{"date":"2025-08-11","repo":{"name":"github.com/bab2min/kiwipiepy","commit":"02ae5dff1410d91cd5b7e98986c13306ab25c845"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.7,"checks":[{"name":"Maintained","score":4,"reason":"0 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/13 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/deploy.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy_test.yml:1","Warn: no topLevel permission defined: .github/workflows/generate_documentation.yml:1","Warn: no topLevel permission defined: .github/workflows/pull_request_test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:164: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:167: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:109: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:113: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:137: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:141: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_test.yml:106: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_test.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_test.yml:134: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_test.yml:138: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_test.yml:161: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy_test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy_test.yml:164: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_test.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy_test.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/deploy_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate_documentation.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/generate_documentation.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/generate_documentation.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/generate_documentation.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:127: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:148: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:168: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:172: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:213: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pull_request_test.yml:218: update your workflow using https://app.stepsecurity.io/secureworkflow/bab2min/kiwipiepy/pull_request_test.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:122","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:198","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:199","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:42","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:47","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:48","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:85","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:90","Warn: pipCommand not pinned by hash: .github/workflows/deploy.yml:91","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:196","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:197","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:39","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:44","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:45","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:82","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:87","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:88","Warn: pipCommand not pinned by hash: .github/workflows/deploy_test.yml:119","Warn: pipCommand not pinned by hash: .github/workflows/generate_documentation.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/generate_documentation.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/pull_request_test.yml:92","Warn: pipCommand not pinned by hash: .github/workflows/pull_request_test.yml:100","Warn: pipCommand not pinned by hash: .github/workflows/pull_request_test.yml:109","Info:   0 out of  27 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of  23 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2017-74"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 18 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T02:51:57.385Z","repository_id":35128990,"created_at":"2025-08-17T02:51:57.385Z","updated_at":"2025-08-17T02:51:57.385Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28506588,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T10:25:30.148Z","status":"ssl_error","status_checked_at":"2026-01-17T10:25:29.718Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["korean","korean-nlp","korean-tokenizer","morphological-analysis","nlp","python-library","word-segmentation"],"created_at":"2026-01-17T10:32:54.513Z","updated_at":"2026-01-17T10:32:54.597Z","avatar_url":"https://github.com/bab2min.png","language":"Python","funding_links":["https://github.com/sponsors/bab2min"],"categories":[],"sub_categories":[],"readme":"# Kiwipiepy, Python용 Kiwi 패키지\n\nhttps://github.com/bab2min/kiwipiepy\n\n[![PyPI version](https://badge.fury.io/py/kiwipiepy.svg)](https://pypi.org/project/kiwipiepy/)\n\nPython3 API 문서: https://bab2min.github.io/kiwipiepy \n\n[Kiwi 0.5 버전](https://github.com/bab2min/kiwi)부터는 Python3용 API를 제공합니다. 이 프로젝트를 빌드하여 Python에 모듈을 import해서 사용하셔도 좋고, \n혹은 더 간편하게 pip를 이용하여 이미 빌드된 kiwipiepy 모듈을 설치하셔도 좋습니다.\n```console\n$ pip install --upgrade pip\n$ pip install kiwipiepy\n```\n또는\n```console\n$ pip3 install --upgrade pip\n$ pip3 install kiwipiepy\n```\n\n현재 kiwipiepy 패키지는 Vista 버전 이상의 Windows OS 및 Linux, macOS 10.12 이상을 지원합니다.\n\nbinary distribution이 제공되지 않는 환경에서는 설치시 소스 코드 컴파일을 위해 **cmake3.12 이상이 필요**합니다.\n```console\n$ pip install cmake\n$ pip install --upgrade pip\n$ pip install kiwipiepy\n```\n\n## 테스트해보기\n\nKiwi 0.6.3 버전부터는 설치 후 바로 테스트할 수 있도록 대화형 인터페이스를 지원합니다. pip를 통해 설치가 완료된 후 다음과 같이 실행하여 형태소 분석기를 시험해볼 수 있습니다.\n```console\n$ python -m kiwipiepy\n```\n또는\n```console\n$ python3 -m kiwipiepy\n```\n대화형 인터페이스가 시작되면, 원하는 문장을 입력해 바로 형태소 분석결과를 확인할 수 있습니다.\n```python\n\u003e\u003e 안녕?\n[Token(form='안녕', tag='IC', start=0, len=2), Token(form='?', tag='SF', start=2, len=3)]\n```\n인터페이스를 종료하려면 Ctrl + C 를 누르십시오.\n\nKiwi에서 사용하는 품사 태그는 세종 말뭉치의 품사 태그를 기초로 하고 일부 태그들을 개량하여 사용하고 있습니다. 자세한 태그 체계에 대해서는 [여기](https://github.com/bab2min/kiwipiepy#%ED%92%88%EC%82%AC-%ED%83%9C%EA%B7%B8)를 참조하십시오.\n\n## 간단 예제\n\n```python\n\u003e\u003e\u003e from kiwipiepy import Kiwi\n\u003e\u003e\u003e kiwi = Kiwi()\n# tokenize 함수로 형태소 분석 결과를 얻을 수 있습니다.\n\u003e\u003e\u003e kiwi.tokenize(\"안녕하세요 형태소 분석기 키위입니다.\")\n[Token(form='안녕', tag='NNG', start=0, len=2),\n Token(form='하', tag='XSA', start=2, len=1),\n Token(form='시', tag='EP', start=4, len=1),\n Token(form='어요', tag='EC', start=3, len=2),\n Token(form='형태소', tag='NNG', start=6, len=3),\n Token(form='분석', tag='NNG', start=10, len=2),\n Token(form='기', tag='NNG', start=12, len=1),\n Token(form='키위', tag='NNG', start=14, len=2),\n Token(form='이', tag='VCP', start=16, len=1),\n Token(form='ᆸ니다', tag='EF', start=17, len=2),\n Token(form='.', tag='SF', start=19, len=1)]\n\n# normalize_coda 옵션을 사용하면 \n# 덧붙은 받침 때문에 분석이 깨지는 경우를 방지할 수 있습니다.\n\u003e\u003e\u003e kiwi.tokenize(\"ㅋㅋㅋ 이런 것도 분석이 될까욬ㅋㅋ?\", normalize_coda=True)\n[Token(form='ㅋㅋㅋ', tag='SW', start=0, len=3),\n Token(form='이런', tag='MM', start=4, len=2),\n Token(form='것', tag='NNB', start=7, len=1),\n Token(form='도', tag='JX', start=8, len=1),\n Token(form='분석', tag='NNG', start=10, len=2),\n Token(form='이', tag='JKS', start=12, len=1),\n Token(form='되', tag='VV', start=14, len=1),\n Token(form='ᆯ까요', tag='EC', start=15, len=2),\n Token(form='ㅋㅋㅋ', tag='SW', start=17, len=2),\n Token(form='?', tag='SF', start=19, len=1)]\n\n# 불용어 관리를 위한 Stopwords 클래스도 제공합니다.\n\u003e\u003e\u003e from kiwipiepy.utils import Stopwords\n\u003e\u003e\u003e stopwords = Stopwords()\n\u003e\u003e\u003e kiwi.tokenize(\"분석 결과에서 불용어만 제외하고 출력할 수도 있다.\", stopwords=stopwords)\n[Token(form='분석', tag='NNG', start=0, len=2),\n Token(form='결과', tag='NNG', start=3, len=2),\n Token(form='불', tag='XPN', start=8, len=1),\n Token(form='용어', tag='NNG', start=9, len=2),\n Token(form='제외', tag='NNG', start=13, len=2),\n Token(form='출력', tag='NNG', start=18, len=2)]\n\n# add, remove 메소드를 이용해 불용어 목록에 단어를 추가하거나 삭제할 수도 있습니다.\n\u003e\u003e\u003e stopwords.add(('결과', 'NNG'))\n\u003e\u003e\u003e kiwi.tokenize(\"분석 결과에서 불용어만 제외하고 출력할 수도 있다.\", stopwords=stopwords)\n[Token(form='분석', tag='NNG', start=0, len=2),\n Token(form='불', tag='XPN', start=8, len=1),\n Token(form='용어', tag='NNG', start=9, len=2),\n Token(form='제외', tag='NNG', start=13, len=2),\n Token(form='출력', tag='NNG', start=18, len=2)]\n\n\u003e\u003e\u003e tokens = kiwi.tokenize(\"각 토큰은 여러 정보를 담고 있습니다.\")\n\u003e\u003e\u003e tokens[0]\nToken(form='각', tag='MM', start=0, len=1)\n\u003e\u003e\u003e tokens[0].form # 형태소의 형태 정보\n'각'\n\u003e\u003e\u003e tokens[0].tag # 형태소의 품사 정보\n'MM'\n\u003e\u003e\u003e tokens[0].start # 시작 및 끝 지점 (문자 단위)\n0\n\u003e\u003e\u003e tokens[0].end\n1\n\u003e\u003e\u003e tokens[0].word_position # 현 문장에서의 어절 번호\n0\n\u003e\u003e\u003e tokens[0].sent_position # 형태소가 속한 문장 번호\n0\n\u003e\u003e\u003e tokens[0].line_number # 형태소가 속한 줄의 번호\n0\n\n# 문장 분리 기능도 지원합니다.\n\u003e\u003e\u003e kiwi.split_into_sents(\"여러 문장으로 구성된 텍스트네 이걸 분리해줘\")\n[Sentence(text='여러 문장으로 구성된 텍스트네', start=0, end=16, tokens=None),\n Sentence(text='이걸 분리해줘', start=17, end=24, tokens=None)]\n\n# 문장 분리와 형태소 분석을 함께 수행할 수도 있습니다.\n\u003e\u003e\u003e kiwi.split_into_sents(\"여러 문장으로 구성된 텍스트네 이걸 분리해줘\", return_tokens=True)\n[Sentence(text='여러 문장으로 구성된 텍스트네', start=0, end=16, tokens=[\n  Token(form='여러', tag='MM', start=0, len=2), \n  Token(form='문장', tag='NNG', start=3, len=2), \n  Token(form='으로', tag='JKB', start=5, len=2), \n  Token(form='구성', tag='NNG', start=8, len=2), \n  Token(form='되', tag='XSV', start=10, len=1), \n  Token(form='ᆫ', tag='ETM', start=11, len=0), \n  Token(form='텍스트', tag='NNG', start=12, len=3), \n  Token(form='이', tag='VCP', start=15, len=1), \n  Token(form='네', tag='EF', start=15, len=1)]),\n Sentence(text='이걸 분리해줘', start=17, end=24, tokens=[\n  Token(form='이거', tag='NP', start=17, len=2), \n  Token(form='ᆯ', tag='JKO', start=19, len=0), \n  Token(form='분리', tag='NNG', start=20, len=2), \n  Token(form='하', tag='XSV', start=22, len=1), \n  Token(form='어', tag='EC', start=22, len=1), \n  Token(form='주', tag='VX', start=23, len=1), \n  Token(form='어', tag='EF', start=23, len=1)])]\n\n# 사전에 새로운 단어를 추가할 수 있습니다.\n\u003e\u003e\u003e kiwi.add_user_word(\"김갑갑\", \"NNP\")\nTrue\n\u003e\u003e\u003e kiwi.tokenize(\"김갑갑이 누구야\")\n[Token(form='김갑갑', tag='NNP', start=0, len=3),\n Token(form='이', tag='JKS', start=3, len=1),\n Token(form='누구', tag='NP', start=5, len=2),\n Token(form='야', tag='JKV', start=7, len=1)]\n\n# v0.11.0 신기능\n# 0.11.0 버전부터는 사용자 사전에 동사/형용사를 추가할 때, 그 활용형도 함께 등재됩니다.\n# 사전에 등재되어 있지 않은 동사 `팅기다`를 분석하면, 엉뚱한 결과가 나옵니다.\n\u003e\u003e\u003e kiwi.tokenize('팅겼다')\n[Token(form='팅기', tag='NNG', start=0, len=2),\n Token(form='하', tag='XSA', start=2, len=0), \n Token(form='다', tag='EF', start=2, len=1)]\n\n# 형태소 `팅기/VV`를 사전에 등록하면, 이 형태소의 모든 활용형이 자동으로 추가되기에\n# `팅겼다`, `팅길` 등의 형태를 모두 분석해낼 수 있습니다.\n\u003e\u003e\u003e kiwi.add_user_word('팅기', 'VV')\nTrue\n\u003e\u003e\u003e kiwi.tokenize('팅겼다')\n[Token(form='팅기', tag='VV', start=0, len=2), \n Token(form='었', tag='EP', start=1, len=1), \n Token(form='다', tag='EF', start=2, len=1)]\n\n# 또한 변형된 형태소를 일괄적으로 추가하여 대상 텍스트에 맞춰 분석 성능을 높일 수 있습니다.\n\u003e\u003e\u003e kiwi.tokenize(\"안녕하세영, 제 이름은 이세영이에영. 학생이세영?\")\n[Token(form='안녕', tag='NNG', start=0, len=2),\n Token(form='하', tag='XSA', start=2, len=1),\n Token(form='시', tag='EP', start=3, len=1),\n Token(form='어', tag='EC', start=3, len=1),\n Token(form='영', tag='MAG', start=4, len=1), # 오분석\n Token(form=',', tag='SP', start=5, len=1),\n Token(form='저', tag='NP', start=7, len=1),\n Token(form='의', tag='JKG', start=7, len=1),\n Token(form='이름', tag='NNG', start=9, len=2),\n Token(form='은', tag='JX', start=11, len=1),\n Token(form='이세영', tag='NNP', start=13, len=3),\n Token(form='이', tag='JKS', start=16, len=1),\n Token(form='에', tag='IC', start=17, len=1),\n Token(form='영', tag='NR', start=18, len=1),\n Token(form='.', tag='SF', start=19, len=1),\n Token(form='님', tag='NNG', start=21, len=1),\n Token(form='도', tag='JX', start=22, len=1),\n Token(form='학생', tag='NNG', start=24, len=2),\n Token(form='이세영', tag='NNP', start=26, len=3), # 오분석\n Token(form='?', tag='SF', start=29, len=1)]\n\n# 종결어미(EF) 중 '요'로 끝나는 것들을 '영'으로 대체하여 일괄 삽입합니다. \n# 이 때 변형된 종결어미에는 -3의 페널티를 부여하여 원 형태소보다 우선하지 않도록 합니다.\n# 새로 삽입된 형태소들이 반환됩니다.\n\u003e\u003e\u003e kiwi.add_re_rule('EF', '요$', '영', -3)\n['어영', '에영', '지영', '잖아영', '거든영', 'ᆯ까영', '네영', '구영', '나영', '군영', ..., '으니깐영']\n\n# 동일한 문장을 재분석하면 분석 결과가 개선된 것을 확인할 수 있습니다.\n\u003e\u003e\u003e kiwi.tokenize(\"안녕하세영, 제 이름은 이세영이에영. 님도 학생이세영?\")\n[Token(form='안녕', tag='NNG', start=0, len=2),\n Token(form='하', tag='XSA', start=2, len=1),\n Token(form='시', tag='EP', start=3, len=1),\n Token(form='어영', tag='EF', start=3, len=2), # 분석 결과 개선\n Token(form=',', tag='SP', start=5, len=1),\n Token(form='저', tag='NP', start=7, len=1),\n Token(form='의', tag='JKG', start=7, len=1),\n Token(form='이름', tag='NNG', start=9, len=2),\n Token(form='은', tag='JX', start=11, len=1),\n Token(form='이세영', tag='NNP', start=13, len=3),\n Token(form='이', tag='VCP', start=16, len=1),\n Token(form='에영', tag='EF', start=17, len=2),\n Token(form='.', tag='SF', start=19, len=1),\n Token(form='님', tag='NNG', start=21, len=1),\n Token(form='도', tag='JX', start=22, len=1),\n Token(form='학생', tag='NNG', start=24, len=2),\n Token(form='이', tag='VCP', start=26, len=1),\n Token(form='시', tag='EP', start=27, len=1),\n Token(form='어영', tag='EF', start=27, len=2), # 분석 결과 개선\n Token(form='?', tag='SF', start=29, len=1)]\n \n# 기분석 형태를 등록하여 원하는 대로 분석되지 않는 문자열을 교정할 수도 있습니다.\n# 다음 문장의 `사겼대`는 오타가 들어간 형태라 제대로 분석되지 않습니다.\n\u003e\u003e\u003e kiwi.tokenize('걔네 둘이 사겼대')\n[Token(form='걔', tag='NP', start=0, len=1), \n Token(form='네', tag='XSN', start=1, len=1), \n Token(form='둘', tag='NR', start=3, len=1), \n Token(form='이', tag='JKS', start=4, len=1), \n Token(form='사', tag='NR', start=6, len=1), \n Token(form='기', tag='VV', start=7, len=1), \n Token(form='었', tag='EP', start=7, len=1), \n Token(form='대', tag='EF', start=8, len=1)]\n# 다음과 같이 add_pre_analyzed_word 메소드를 이용하여 이를 교정할 수 있습니다.\n\u003e\u003e\u003e kiwi.add_pre_analyzed_word('사겼대', ['사귀/VV', '었/EP', '대/EF'], -3)\nTrue\n# 그 뒤 동일한 문장을 다시 분석해보면 결과가 바뀐 것을 확인할 수 있습니다.\n\u003e\u003e\u003e kiwi.tokenize('걔네 둘이 사겼대')\n[Token(form='걔', tag='NP', start=0, len=1), \n Token(form='네', tag='XSN', start=1, len=1), \n Token(form='둘', tag='NR', start=3, len=1), \n Token(form='이', tag='JKS', start=4, len=1), \n Token(form='사귀', tag='VV', start=6, len=3), \n Token(form='었', tag='EP', start=6, len=3), \n Token(form='대', tag='EF', start=6, len=3)]\n# 단, 사귀/VV, 었/EP, 대/EF의 시작위치가 모두 6, 길이가 모두 3으로 잘못 잡히는 문제가 보입니다.\n# 이를 고치기 위해서는 add_pre_analyzed_word 시 각 형태소의 위치정보도 함께 입력해주어야합니다.\n\u003e\u003e\u003e kiwi = Kiwi()\n\u003e\u003e\u003e kiwi.add_pre_analyzed_word('사겼대', [('사귀', 'VV', 0, 2), ('었', 'EP', 1, 2), ('대', 'EF', 2, 3)], -3)\nTrue\n\u003e\u003e\u003e kiwi.tokenize('걔네 둘이 사겼대')\n[Token(form='걔', tag='NP', start=0, len=1), \n Token(form='네', tag='XSN', start=1, len=1), \n Token(form='둘', tag='NR', start=3, len=1), \n Token(form='이', tag='JKS', start=4, len=1), \n Token(form='사귀', tag='VV', start=6, len=2, \n Token(form='었', tag='EP', start=7 len=1, \n Token(form='대', tag='EF', start=8 len=1]\n\n# v0.12.0 신기능\n# 0.12.0 버전부터는 형태소를 결합하여 문장으로 복원하는 기능이 추가되었습니다.\n\u003e\u003e\u003e kiwi.join([('길', 'NNG'), ('을', 'JKO'), ('묻', 'VV'), ('어요', 'EF')])\n'길을 물어요'\n\u003e\u003e\u003e kiwi.join([('흙', 'NNG'), ('이', 'JKS'), ('묻', 'VV'), ('어요', 'EF')])\n'흙이 묻어요'\n\n# v0.13.0 신기능\n# 오타 교정 기능이 추가되었습니다.\n# 간단한 오타를 교정하여, 사소한 오타 때문에 전체 분석 결과가 어긋나는 문제를 해결할 수 있습니다.\n\u003e\u003e\u003e kiwi = Kiwi(model_type='largest', typos='basic')\n\u003e\u003e\u003e kiwi.tokenize('외않됀대?') # 오타 교정 사용 시 로딩 시간이 5~10초 정도 소요됨\n[Token(form='왜', tag='MAG', start=0, len=1),\n Token(form='안', tag='MAG', start=1, len=1),\n Token(form='되', tag='VV', start=2, len=1),\n Token(form='ᆫ대', tag='EF', start=2, len=2),\n Token(form='?', tag='SF', start=4, len=1)]\n\n\u003e\u003e\u003e kiwi.tokenize('장례희망이 뭐냐는 선섕님의 질문에 벙어리가 됫따') \n[Token(form='장래', tag='NNG', start=0, len=2),\n Token(form='희망', tag='NNG', start=2, len=2), \n Token(form='이', tag='JKS', start=4, len=1), \n Token(form='뭐', tag='NP', start=6, len=1), \n Token(form='이', tag='VCP', start=7, len=0), \n Token(form='냐는', tag='ETM', start=7, len=2), \n Token(form='선생', tag='NNG', start=10, len=2), \n Token(form='님', tag='XSN', start=12, len=1), \n Token(form='의', tag='JKG', start=13, len=1), \n Token(form='질문', tag='NNG', start=15, len=2), \n Token(form='에', tag='JKB', start=17, len=1), \n Token(form='벙어리', tag='NNG', start=19, len=3), \n Token(form='가', tag='JKC', start=22, len=1), \n Token(form='되', tag='VV', start=24, len=1), \n Token(form='엇', tag='EP', start=24, len=1), \n Token(form='다', tag='EF', start=25, len=1)]\n\n# 0.17.1에서는 연철에 대한 오타 교정이 추가되었습니다.\n# 받침 + 초성 ㅇ/ㅎ 꼴을 잘못 이어적은 경우에 대해 교정이 가능합니다.\n\u003e\u003e\u003e kiwi = Kiwi(typos='continual')\n\u003e\u003e\u003e kiwi.tokenize('오늘사무시레서')\n[Token(form='오늘', tag='NNG', start=0, len=2),\n Token(form='사무실', tag='NNG', start=2, len=4),\n Token(form='에서', tag='JKB', start=5, len=2)]\n\u003e\u003e\u003e kiwi.tokenize('지가캤어요')\n[Token(form='지각', tag='NNG', start=0, len=3),\n Token(form='하', tag='XSV', start=2, len=1),\n Token(form='었', tag='EP', start=2, len=1),\n Token(form='어요', tag='EF', start=3, len=2)]\n\n# 기본 오타 교정에 연철 오타 교정까지 함께 사용할 수도 있습니다.\n\u003e\u003e\u003e kiwi = Kiwi(typos='basic_with_continual')\n\u003e\u003e\u003e kiwi.tokenize('웨 지가캤니?')\n[Token(form='왜', tag='MAG', start=0, len=1),\n Token(form='지각', tag='NNG', start=2, len=3),\n Token(form='하', tag='XSV', start=4, len=1),\n Token(form='었', tag='EP', start=4, len=1),\n Token(form='니', tag='EC', start=5, len=1),\n Token(form='?', tag='SF', start=6, len=1)]\n\n# 0.19.0 버전에서는 장음화 오류(한 음절을 여러 음절로 늘려 적는 오류)가 \n# 포함된 텍스트를 교정하는 기능도 추가되었습니다.\n\u003e\u003e\u003e kiwi = Kiwi(typos='lengthening')\n\u003e\u003e\u003e kiwi.tokenize('지이인짜 귀여워요')\n[Token(form='진짜', tag='MAG', start=0, len=4), \n Token(form='귀엽', tag='VA-I', start=5, len=3), \n Token(form='어요', tag='EF', start=7, len=2)]\n\n# 기본 오타 교정 + 연철 오타 교정 + 장음화 오류 교정을 함께 사용할 수도 있습니다.\n\u003e\u003e\u003e kiwi = Kiwi(typos='basic_with_continual_and_lengthening')\n\u003e\u003e\u003e kiwi.tokenize('지이인짜 기여워요~ 마니 좋아해')\n[Token(form='진짜', tag='MAG', start=0, len=4),\n Token(form='귀엽', tag='VA-I', start=5, len=3),\n Token(form='어요', tag='EF', start=7, len=2), \n Token(form='~', tag='SO', start=9, len=1), \n Token(form='많이', tag='MAG', start=11, len=2), \n Token(form='좋아하', tag='VV', start=14, len=3), \n Token(form='어', tag='EF', start=16, len=1)]\n\n# 0.17.0 버전부터는 사용자 사전에 공백이 있는 단어를 추가할 수 있습니다.\n\u003e\u003e\u003e kiwi = Kiwi()\n# '대학생 선교회'라는 단어를 등록합니다.\n\u003e\u003e\u003e kiwi.add_user_word('대학생 선교회', 'NNP')\nTrue\n\n# 등록한 것과 동일한 형태에서는\n# 당연히 잘 분석됩니다.\n\u003e\u003e\u003e kiwi.tokenize('대학생 선교회에서') \n[Token(form='대학생 선교회', tag='NNP', start=0, len=7),\n Token(form='에서', tag='JKB', start=7, len=2)]\n\n# 추가로 공백이 없는 형태에도 일치가 가능합니다.\n\u003e\u003e\u003e kiwi.tokenize('대학생선교회에서') \nkiwi.tokenize('대학생선교회에서')  \n[Token(form='대학생 선교회', tag='NNP', start=0, len=6),\n Token(form='에서', tag='JKB', start=6, len=2)]\n\n# 탭 문자나 줄바꿈 문자 등이 들어가도 일치가 가능합니다.\n# 연속한 공백 문자는 공백 1번과 동일하게 처리합니다.\n\u003e\u003e\u003e kiwi.tokenize('대학생 \\t \\n 선교회에서') \n[Token(form='대학생 선교회', tag='NNP', start=0, len=11),\n Token(form='에서', tag='JKB', start=11, len=2)]\n\n# 그러나 사전 등재 시 공백이 없던 지점에\n# 공백이 있는 경우에는 일치가 불가능합니다.\n\u003e\u003e\u003e kiwi.tokenize('대학 생선 교회에서')      \n[Token(form='대학', tag='NNG', start=0, len=2),\n Token(form='생선', tag='NNG', start=3, len=2),\n Token(form='교회', tag='NNG', start=6, len=2),\n Token(form='에서', tag='JKB', start=8, len=2)]\n\n# space_tolerance를 2로 설정하여\n# 공백이 두 개까지 틀린 경우를 허용하도록 하면\n# '대학 생선 교회'에도 '대학생 선교회'가 일치하게 됩니다.\n\u003e\u003e\u003e kiwi.global_config.space_tolerance = 2\n\u003e\u003e\u003e kiwi.tokenize('대학 생선 교회에서')\n[Token(form='대학생 선교회', tag='NNP', start=0, len=8),\n Token(form='에서', tag='JKB', start=8, len=2)]\n\n# 0.18.0 버전에서는 외국어 문자, 이모지에 대한 지원이 강화되었습니다.\n# 화면에 표시되는 글자 단위로 토큰이 분할됩니다.\n\u003e\u003e\u003e kiwi.tokenize('😂☝🏻☝🏿')\n[Token(form='😂', tag='W_EMOJI', start=0, len=1), \n Token(form='☝🏻', tag='W_EMOJI', start=1, len=2), \n Token(form='☝🏿', tag='W_EMOJI', start=3, len=2)]\n# 참고: v0.17의 결과\n# [Token(form='😂☝🏻☝🏿', tag='SW', start=0, len=5)]\n\n# script 필드가 추가되어 해당 문자가\n# 유니코드 상에서 어떤 영역에 속하는지 확인할 수 있습니다.\n# SW, SH, SL, W_EMOJI 태그에 대해서만 script값이 부여됩니다.\n\u003e\u003e\u003e tokens = kiwi.tokenize('ひらがなカタカナ')\n\u003e\u003e\u003e tokens\n[Token(form='ひらがなカタカナ', tag='SW', start=0, len=8)]\n\u003e\u003e\u003e tokens[0].script\n'Kana'\n\n\u003e\u003e\u003e tokens = kiwi.tokenize('résumé')\n\u003e\u003e\u003e tokens\n[Token(form='résumé', tag='SL', start=0, len=6)]\n# 참고 v0.17까지의 결과\n# [Token(form='r', tag='SL', start=0, len=1), \n#  Token(form='é', tag='SW', start=1, len=1), \n#  Token(form='sum', tag='SL', start=2, len=3), \n#  Token(form='é', tag='SW', start=5, len=1)]\n\u003e\u003e\u003e tokens[0].script\n'Latin'\n\n\u003e\u003e\u003e tokens = kiwi.tokenize('ἥρως')\n\u003e\u003e\u003e tokens\n[Token(form='ἥρως', tag='SW', start=0, len=4)]\n\u003e\u003e\u003e tokens[0].script\n'Greek and Coptic'\n\n\u003e\u003e\u003e tokens = kiwi.tokenize('ฉันชอบกินข้าวผัด')\n\u003e\u003e\u003e tokens\n[Token(form='ฉันชอบกินข้าวผัด', tag='SW', start=0, len=16)]\n\u003e\u003e\u003e tokens[0].script\n'Thai'\n\n# 0.18.1버전부터는 받침만으로 구성된 형태소 출력시 \n# 호환용 자모를 사용하는 옵션을 제공합니다.\n\u003e\u003e\u003e kiwi.tokenize('예쁜데')\n[Token(form='예쁘', tag='VA', start=0, len=2),\n Token(form='ᆫ데', tag='EF', start=1, len=2)]\n\u003e\u003e\u003e kiwi.tokenize('예쁜데', compatible_jamo=True) \n[Token(form='예쁘', tag='VA', start=0, len=2),\n Token(form='ㄴ데', tag='EF', start=1, len=2)] \n# 받침 ᆫ이 호환용 자모인 ㄴ으로 변환되어 출력됨\n\n# 0.20.0버전에서는 사이시옷 분석을 수행하는 옵션이 추가되었습니다.\n\n# 사전에 등재되어 있지 않은, 사이시옷이 들어간 합성명사는\n# 다음과 같이 잘못 분석되는 경우가 많습니다.\n\u003e\u003e\u003e kiwi.tokenize('시곗바늘')\n[Token(form='시곗', tag='NNG', start=0, len=2),\n Token(form='바늘', tag='NNG', start=2, len=2)]\n\n# saisiot=True 옵션을 주면 사이시옷을 형태소로 간주하여\n# 다음과 같이 분리해줍니다.\n\u003e\u003e\u003e kiwi.tokenize('시곗바늘', saisiot=True)\n[Token(form='시계', tag='NNG', start=0, len=2),\n Token(form='ᆺ', tag='Z_SIOT', start=1, len=1),\n Token(form='바늘', tag='NNG', start=2, len=2)]\n\n# saisiot=False 옵션을 주면 사이시옷이 들어간 합성 명사 전체를\n# 하나의 형태소로 합쳐서 출력합니다.\n\u003e\u003e\u003e kiwi.tokenize('시곗바늘', saisiot=False)\n[Token(form='시곗바늘', tag='NNG', start=0, len=4)]\n\n# 0.22.0 버전에서는 방언 분석 기능이 추가되었습니다.\n# 방언 분석을 위해서는 먼저\n# Kiwi 객체 생성 시 enabled_dialects에 사용할 방언을 지정하여 분석기를 생성합니다.\n# 참고로 방언 분석은 아직 기초적인 수준이기 때문에\n# 분석 정확도가 낮을 수 있다는 점 염두해두시길 바랍니다.\n#\n# 현재 사용 가능한 방언 옵션은 다음과 같습니다.\n# 표준어(standard)\n# 경기(gyeonggi)\n# 충청(chungcheong)\n# 강원(gangwon)\n# 경상(gyeongsang)\n# 전라(jeolla)\n# 제주(jeju)\n# 황해(hwanghae)\n# 함경(hamgyeong)\n# 평안(pyeongan)\n# 옛말(archaic)\n\u003e\u003e\u003e kiwi = Kiwi(enabled_dialects='jeju,archaic')\n\n# allowed_dialects 인자를 설정하지 않은 경우 표준어로만 분석됩니다.\nprint(kiwi.tokenize(\"약주 ᄒᆞᆫ 잔 드셧수과?\"))\n[Token(form='약주', tag='NNG', start=0, len=2),\n Token(form='ᄒᆞᆫ', tag='NNG', start=3, len=3),\n Token(form='잔', tag='NNG', start=7, len=1),\n Token(form='드셧수과', tag='NNG', start=9, len=4),\n Token(form='?', tag='SF', start=13, len=1)]\n\n# allowed_dialects 인자에 제주 사투리만 지정한 경우\nprint(kiwi.tokenize(\"약주 ᄒᆞᆫ 잔 드셧수과?\", allowed_dialects='jeju'))\n[Token(form='약주', tag='NNG', start=0, len=2),\n Token(form='ᄒᆞᆫ', tag='MM', start=3, len=3),\n Token(form='잔', tag='NNG', start=7, len=1),\n Token(form='드시', tag='VV', start=9, len=2),\n Token(form='엇', tag='EP', start=10, len=1),\n Token(form='수과', tag='EF', start=11, len=2, sense=1),\n Token(form='?', tag='SF', start=13, len=1)]\n\n# allowed_dialects 인자에 제주 사투리와 옛말을 지정한 경우\nprint(kiwi.tokenize(\"약주 ᄒᆞᆫ 잔 드셧수과?\", allowed_dialects='jeju,archaic'))\n[Token(form='약주', tag='NNG', start=0, len=2),\n Token(form='ᄒᆞᆫ', tag='MM', start=3, len=3, sense=2),\n Token(form='잔', tag='NNG', start=7, len=1),\n Token(form='드시', tag='VV', start=9, len=2),\n Token(form='엇', tag='EP', start=10, len=1),\n Token(form='수과', tag='EF', start=11, len=2, sense=1),\n Token(form='?', tag='SF', start=13, len=1)]\n```\n\n## 시작하기\n\nkiwipiepy 패키지 설치가 성공적으로 완료되었다면, 다음과 같이 패키지를 import후 Kiwi 객체를 생성했을때 오류가 발생하지 않습니다.\n```python\nfrom kiwipiepy import Kiwi, Match\nkiwi = Kiwi()\n```\nKiwi 생성자는 다음과 같습니다.\n```python\nKiwi(num_workers=-1, model_path=None, load_default_dict=True, integrate_allomorph=True, model_type=None, typos=None, typo_cost_threshold=2.5, enabled_dialects='standard')\n```\n* `num_workers`:  1 이상이면 단어 추출 및 형태소 분석에 멀티 코어를 활용하여 조금 더 빠른 속도로 분석을 진행할 수 있습니다. \u003cbr\u003e\n0인 경우 단일 코어만 활용합니다. num_workers가 -1이면 현재 환경에서 사용가능한 모든 코어를 활용합니다. \u003cbr\u003e\n생략 시 기본값은 -1입니다.\n* `model_path`: 형태소 분석 모델이 있는 경로를 지정합니다. 생략시 `kiwipiepy_model` 패키지로부터 모델 경로를 불러옵니다.\n* `load_default_dict`: 추가 사전을 로드합니다. 추가 사전은 위키백과의 표제어 타이틀로 구성되어 있습니다. 이 경우 로딩 및 분석 시간이 약간 증가하지만 다양한 고유명사를 좀 더 잘 잡아낼 수 있습니다. 분석 결과에 원치 않는 고유명사가 잡히는 것을 방지하려면 이를 False로 설정하십시오.\n* `integrate_allomorph`: 어미 중, '아/어', '았/었'과 같이 동일하지만 음운 환경에 따라 형태가 달라지는 이형태들을 자동으로 통합합니다.\n* `model_type`: 형태소 분석에 사용할 언어 모델을 지정합니다. `'cong'`, `'cong-global'` 중 하나를 선택할 수 있습니다. `'cong-global'` 는 상대적으로 느리지만 먼 거리에 있는 형태소 간의 관계를 포착할 수 있습니다.\n* `typos`: 형태소 분석 시 간단한 오타를 교정합니다. `None`으로 설정 시 교정을 수행하지 않습니다.\n* `typo_cost_threshold`: 오타 교정을 허용할 최대 오타 비용을 설정합니다.\n* `enabled_dialects`: 활성화할 방언을 설정합니다. 기본값은 `Dialect.STANDARD`으로 이 경우 Kiwi는 표준어만을 분석할 수 있습니다.\n\nkiwi 객체는 크게 다음 세 종류의 작업을 수행할 수 있습니다.\n* 코퍼스로부터 미등록 단어 추출\n* 사용자 사전 관리\n* 형태소 분석\n\n### 코퍼스로부터 미등록 단어 추출\n\nKiwi 0.5부터 새로 추가된 기능입니다. 자주 등장하는 문자열의 패턴을 파악하여 단어로 추정되는 문자열을 추출해줍니다. \n이 기능의 기초적인 아이디어는 https://github.com/lovit/soynlp 의 Word Extraction 기법을 바탕으로 하고 있으며, \n이에 문자열 기반의 명사 확률을 조합하여 명사일 것으로 예측되는 단어만 추출합니다.\n\nKiwi가 제공하는 미등록 단어 추출 관련 메소드는 다음 두 가지입니다.\n```python\nKiwi.extract_words(texts, min_cnt, max_word_len, min_score)\nKiwi.extract_add_words(texts, min_cnt, max_word_len, min_score, pos_score)\n```\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eextract_words(texts, min_cnt=10, max_word_len=10, min_score=0.25, pos_score=-3.0, lm_filter=True)\u003c/code\u003e\u003c/summary\u003e\n\n* `texts`: 분석할 텍스트를 `Iterable[str]` 형태로 넣어줍니다. 자세한 건 아래의 예제를 참조해주세요.\n* `min_cnt`: 추출할 단어가 입력 텍스트 내에서 최소 몇 번 이상 등장하는 지를 결정합니다. 입력 텍스트가 클 수록 그 값을 높여주시는게 좋습니다.\n* `max_word_len`: 추출할 단어의 최대 길이입니다. 이 값을 너무 크게 설정할 경우 단어를 스캔하는 시간이 길어지므로 적절하게 조절해주시는 게 좋습니다.\n* `min_score`:  추출할 단어의 최소 단어 점수입니다. 이 값을 낮출수록 단어가 아닌 형태가 추출될 가능성이 높아지고, \n반대로 이 값을 높일 수록 추출되는 단어의 개수가 줄어들므로 적절한 수치로 설정하실 필요가 있습니다. 기본값은 0.25입니다.\n* `pos_score`: 추출할 단어의 최소 명사 점수입니다. 이 값을 낮출수록 명사가 아닌 단어들이 추출될 가능성이 높으며, 반대로 높일수록 추출되는 명사의 개수가 줄어듭니다. 기본값은 -3입니다.\n* `lm_filter`: 품사 및 언어 모델을 이용한 필터링을 사용할 지 결정합니다.\n```python\n# 입력으로 str의 list를 줄 경우\ninputs = list(open('test.txt', encoding='utf-8'))\nkiwi.extract_words(inputs, min_cnt=10, max_word_len=10, min_score=0.25)\n\n'''\n위의 코드에서는 모든 입력을 미리 list로 저장해두므로\ntest.txt 파일이 클 경우 많은 메모리를 소모할 수 있습니다.\n\n그 대신 파일에서 필요한 부분만 가져와 사용하려면(streaming)\n아래와 같이 사용해야 합니다.\n'''\n\nclass IterableTextFile:\n    def __init__(self, path):\n        self.path = path\n\n    def __iter__(self):\n        yield from open(path, encoding='utf-8')\n\nkiwi.extract_words(IterableTextFile('test.txt'), min_cnt=10, max_word_len=10, min_score=0.25)\n```\n\u003c/details\u003e\n\u003chr\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eextract_add_words(texts, min_cnt=10, max_word_len=10, min_score=0.25, pos_score=-3, lm_filter=True)\u003c/code\u003e\u003c/summary\u003e\n\n`extract_words` 와 동일하게 명사인 단어만 추출해줍니다. \n다만 이 메소드는 추출된 명사 후보를 자동으로 사용자 사전에 `NNP`로 등록하여 형태소 분석에 사용할 수 있게 해줍니다. 만약 이 메소드를 사용하지 않는다면 add_user_word 메소드를 사용하여 추출된 미등록 단어를 직접 사용자 사전에 등록해야 합니다.\n\u003c/details\u003e\n\u003chr\u003e\n\n### 사용자 사전 관리\n\n기존의 사전에 등록되지 않은 단어를 제대로 분석하기 위해서는 사용자 사전에 해당 단어를 등록해주어야 합니다. \n이는 extract_add_words를 통해서 자동으로 이뤄질 수도 있고, 수작업으로 직접 추가될 수도 있습니다. \n다음 메소드들은 사용자 사전을 관리하는데 사용되는 메소드들입니다.\n```python\nKiwi.add_user_word(word, tag, score, orig_word=None)\nKiwi.add_pre_analyzed_word(form, analyzed, score)\nKiwi.add_rule(tag, replacer, score)\nKiwi.add_re_rule(tag, pattern, repl, score)\nKiwi.load_user_dictionary(user_dict_path)\n```\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eadd_user_word(word, tag='NNP', score=0.0, orig_word=None)\u003c/code\u003e\u003c/summary\u003e\n\n사용자 사전에 새 형태소를 등록합니다. \n\n* `word`: 등록할 형태소의 형태입니다. 현재는 띄어쓰기(공백문자)가 포함되지 않는 문자열만 단어로 등록할 수 있습니다.\n* `tag`: 등록할 형태소의 품사입니다. 기본값은 NNP(고유명사)입니다.\n* `score`: 등록할 형태소의 점수입니다. \n    동일한 형태라도 여러 경우로 분석될 가능성이 있는 경우에, 이 값이 클수록 해당 형태소가 더 우선권을 가지게 됩니다.\n* `orig_word`: 추가할 형태소가 특정 형태소의 변이형인 경우 이 인자로 원본 형태소를 넘겨줄 수 있습니다. 없는 경우 생략할 수 있습니다. \n     이 값을 준 경우, 현재 사전 내에 `orig_word`/`tag` 조합의 형태소가 반드시 존재해야 하며, 그렇지 않으면 `ValueError` 예외를 발생시킵니다. \n     원본 형태소가 존재하는 경우 `orig_word`를 명시하면 더 정확한 분석 결과를 낼 수 있습니다.\n\n형태소 삽입이 성공하면 `True`를, 동일한 형태소가 이미 존재하여 실패하면 `False`를 반환합니다.\n\u003c/details\u003e\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eadd_pre_analyzed_word(form, analyzed, score=0.0)\u003c/code\u003e\u003c/summary\u003e\n\n사용자 사전에 기분석 형태를 등록합니다. 이를 통해 특정 형태가 사용자가 원하는 형태로 형태소 분석이 되도록 유도할 수 있습니다.\n\n* `form`: 기분석의 형태입니다.\n* `analyzed`: `form`의 형태소 분석 결과.\n    이 값은 (형태, 품사) 모양의 tuple, 혹은 (형태, 품사, 시작지점, 끝지점) 모양의 tuple로 구성된 Iterable이어야합니다.\n    이 값으로 지정되는 형태소는 현재 사전 내에 반드시 존재해야 하며, 그렇지 않으면 `ValueError` 예외를 발생시킵니다.\n* `score`: 추가할 형태소열의 가중치 점수. \n    해당 형태에 부합하는 형태소 조합이 여러 개가 있는 경우, 이 점수가 높을 단어가 더 우선권을 가집니다.\n\n삽입이 성공하면 `True`를, 동일한 형태가 이미 존재하여 실패하면 `False`를 반환합니다.\n\n이 메소드는 불규칙적인 분석 결과를 분석기에 추가하는 데에 용이합니다. \n예를 들어 `사귀다` 동사의 과거형은 `사귀었다`가 맞지만, 흔히 `사겼다`로 잘못 쓰이기도 합니다.\n`사겼다`가 `사귀/VV + 었/EP + 다/EF`로 바르게 분석되도록 하는데에 이 메소드를 사용할 수 있습니다.\n\n ```python\nkiwi.add_pre_analyzed_word('사겼다', ['사귀/VV', '었/EP', '다/EF'], -3)`\nkiwi.add_pre_analyzed_word('사겼다', [('사귀', 'VV', 0, 2), ('었', 'EP', 1, 2), ('다', 'EF', 2, 3)], -3)\n ```\n\n후자의 경우 분석 결과의 각 형태소가 원본 문자열에서 차지하는 위치를 정확하게 지정해줌으로써, \nKiwi 분석 결과에서 해당 형태소의 `start`, `end`, `length`가 정확하게 나오도록 합니다.\n\u003c/details\u003e\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eadd_rule(tag, replacer, score)\u003c/code\u003e\u003c/summary\u003e\n\n규칙에 의해 변형된 형태소를 일괄적으로 추가합니다.\n* `tag`: 추가할 형태소들의 품사\n* `replacer`: 형태소를 변형시킬 규칙. \n    이 값은 호출가능한 Callable 형태로 제공되어야 하며, 원본 형태소 str를 입력으로 받아 변형된 형태소의 str을 반환해야합니다.\n    만약 입력과 동일한 값을 반환하면 해당 변형 결과는 무시됩니다.\n* `score`: 추가할 변형된 형태소의 가중치 점수. \n    해당 형태에 부합하는 형태소 조합이 여러 개가 있는 경우, 이 점수가 높을 단어가 더 우선권을 가집니다.\n\n`replacer`에 의해 새로 생성된 형태소의 `list`를 반환합니다.\n\u003c/details\u003e\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eadd_re_rule(tag, pattern, repl, score)\u003c/code\u003e\u003c/summary\u003e\n\n`add_rule`메소드와 동일한 역할을 수행하되, 변형 규칙에 정규표현식을 사용합니다.\n\n* `tag`: 추가할 형태소들의 품사\n* `pattern`: 변형시킬 형태소의 규칙. 이 값은 `re.compile`로 컴파일가능한 정규표현식이어야 합니다.\n* `repl`: `pattern`에 의해 발견된 패턴은 이 값으로 교체됩니다. Python3 정규표현식 모듈 내의 `re.sub` 함수의 `repl` 인자와 동일합니다.\n* `score`: 추가할 변형된 형태소의 가중치 점수. \n    해당 형태에 부합하는 형태소 조합이 여러 개가 있는 경우, 이 점수가 높을 단어가 더 우선권을 가집니다.\n\n`pattern`과 `repl`에 의해 새로 생성된 형태소의 `list`를 반환합니다.\n\n이 메소드는 규칙에 의해 변형되는 이형태들을 일괄적으로 추가할 때 굉장히 용이합니다.\n예를 들어 `-요`가 `-염`으로 교체된 종결어미들(`먹어염`, `뛰었구염`, `배불러염` 등)을 일괄 등록하기 위해서는\n다음을 수행하면 됩니다.\n\n```python\nkiwi.add_re_rule('EF', r'요$', r'염', -3.0)\n```\n\n이런 이형태들을 대량으로 등록할 경우 이형태가 원본 형태보다 분석결과에서 높은 우선권을 가지지 않도록\nscore를 `-3` 이하의 값으로 설정하는걸 권장합니다.\n\u003c/details\u003e\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eload_user_dictionary(user_dict_path)\u003c/code\u003e\u003c/summary\u003e\n\n파일로부터 사용자 사전을 읽어들입니다. 사용자 사전 파일은 UTF-8로 인코딩되어 있어야하며, 다음과 같은 형태로 구성되어야 합니다.\n탭 문자(\\t)로 각각의 필드는 분리되어야 하며, 단어 점수는 생략 가능합니다. \n```text\n#으로 시작하는 줄은 주석 처리됩니다.\n# 각 필드는 Tab(\\t)문자로 구분됩니다.\n#\n# \u003c단일 형태소를 추가하는 경우\u003e\n# (형태) \\t (품사태그) \\t (점수)\n# * (점수)는 생략시 0으로 처리됩니다.\n키위\tNNP\t-5.0\n#\n# \u003c이미 존재하는 형태소의 이형태를 추가하는 경우\u003e\n# (이형태) \\t (원형태소/품사태그) \\t (점수)\n# * (점수)는 생략시 0으로 처리됩니다.\n기위\t키위/NNG\t-3.0\n#\n# \u003c기분석 형태를 추가하는 경우\u003e\n# (형태) \\t (원형태소/품사태그 + 원형태소/품사태그 + ...) \\t (점수)\n# * (점수)는 생략시 0으로 처리됩니다.\n사겼다\t사귀/VV + 었/EP + 다/EF\t-1.0\n```\n사전 파일을 성공적으로 읽어들이면, 사전을 통해 새로 추가된 형태소의 개수를 반환합니다. \n\n실제 예시에 대해서는 [Kiwi에 내장된 기본 사전 파일](https://raw.githubusercontent.com/bab2min/Kiwi/main/models/base/default.dict)을 참조해주세요.\n\u003c/details\u003e\n\u003chr\u003e\n\n### 분석\n\nkiwi을 생성하고, 사용자 사전에 단어를 추가하는 작업이 완료되었으면 다음 메소드를 사용하여 \n형태소 분석, 문장 분리, 띄어쓰기 교정, 문장 복원 등의 작업을 수행할 수 있습니다.\n\n```python\nKiwi.tokenize(text, match_option, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None, allowed_dialects='standard', dialect_cost=3.0)\nKiwi.analyze(text, top_n, match_option, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None, allowed_dialects='standard', dialect_cost=3.0)\nKiwi.split_into_sents(text, match_options=Match.ALL, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None, allowed_dialects='standard', dialect_cost=3.0, return_tokens=False)\nKiwi.glue(text_chunks, insert_new_lines=None, return_space_insertions=False)\nKiwi.space(text, reset_whitespace=False)\nKiwi.join(morphs, lm_search=True)\nKiwi.template(format_str, cache=True)\n``` \n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003etokenize(text, match_option=Match.ALL, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None, allowed_dialects='standard', dialect_cost=3.0)\u003c/code\u003e\u003c/summary\u003e\n \n입력된 `text`를 형태소 분석하여 그 결과를 간단하게 반환합니다. 분석결과는 다음과 같이 `Token`의 리스트 형태로 반환됩니다.\n\n```python\n\u003e\u003e kiwi.tokenize('테스트입니다.')\n[Token(form='테스트', tag='NNG', start=0, len=3), Token(form='이', tag='VCP', start=3, len=1), Token(form='ᆸ니다', tag='EF', start=4, len=2)]\n```\n\n`normalize_coda`는 ㅋㅋㅋ,ㅎㅎㅎ와 같은 초성체가 뒤따라와서 받침으로 들어갔을때 분석에 실패하는 문제를 해결해줍니다.\n```python\n\u003e\u003e kiwi.tokenize(\"안 먹었엌ㅋㅋ\", normalize_coda=False)\n[Token(form='안', tag='NNP', start=0, len=1), \n Token(form='먹었엌', tag='NNP', start=2, len=3), \n Token(form='ㅋㅋ', tag='SW', start=5, len=2)]\n\u003e\u003e kiwi.tokenize(\"안 먹었엌ㅋㅋ\", normalize_coda=True)\n[Token(form='안', tag='MAG', start=0, len=1), \n Token(form='먹', tag='VV', start=2, len=1), \n Token(form='었', tag='EP', start=3, len=1), \n Token(form='어', tag='EF', start=4, len=1), \n Token(form='ㅋㅋㅋ', tag='SW', start=5, len=2)]\n```\n\u003c/details\u003e\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eanalyze(text, top_n=1, match_option=Match.ALL, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None, allowed_dialects='standard', dialect_cost=3.0)\u003c/code\u003e\u003c/summary\u003e\n \n입력된 `text`를 형태소 분석하여 그 결과를 반환합니다. 총 top_n개의 결과를 자세하게 출력합니다. 반환값은 다음과 같이 구성됩니다.\n \n```python\n[(분석결과1, 점수), (분석결과2, 점수), ... ]\n```\n \n분석결과는 다음과 같이 `Token`의 리스트 형태로 반환됩니다.\n\n실제 예시는 다음과 같습니다.\n```python\n\u003e\u003e kiwi.analyze('테스트입니다.', top_n=5)\n[([Token(form='테스트', tag='NNG', start=0, len=3), Token(form='이', tag='VCP', start=3, len=1), Token(form='ᆸ니다', tag='EF', start=4, len=2)], -25.217018127441406), \n ([Token(form='테스트입니', tag='NNG', start=0, len=5), Token(form='다', tag='EC', start=5, len=1)], -40.741905212402344), \n ([Token(form='테스트입니', tag='NNG', start=0, len=5), Token(form='다', tag='MAG', start=5, len=1)], -41.81024932861328), \n ([Token(form='테스트입니', tag='NNG', start=0, len=5), Token(form='다', tag='EF', start=5, len=1)], -42.300254821777344), \n ([Token(form='테스트', tag='NNG', start=0, len=3), Token(form='입', tag='NNG', start=3, len=1), Token(form='니다', tag='EF', start=4, len=2)], -45.86524200439453)\n]\n```\n만약 text가 str의 iterable인 경우 여러 개의 입력을 병렬로 처리합니다. 이때의 반환값은 단일 text를 입력한 경우의 반환값의 iterable입니다.\nKiwi() 생성시 인자로 준 num_workers에 따라 여러 개의 스레드에서 작업이 동시에 처리됩니다. 반환되는 값은 입력되는 값의 순서와 동일합니다.\n```python\n\u003e\u003e result_iter = kiwi.analyze(['테스트입니다.', '테스트가 아닙니다.', '사실 맞습니다.'])\n\u003e\u003e next(result_iter)\n[([Token(form='테스트', tag='NNG', start=0, len=3), Token(form='이', tag='VCP', start=3, len=1), Token(form='ᆸ니다', tag='EF', start=4, len=2), Token(form='.', tag='SF', start=6, len=1)], -20.441545486450195)]\n\u003e\u003e next(result_iter)\n[([Token(form='테스트', tag='NNG', start=0, len=3), Token(form='가', tag='JKC', start=3, len=1), Token(form='아니', tag='VCN', start=5, len=2), Token(form='ᆸ니다', tag='EF', start=7, len=2), Token(form='.', tag='SF', start=9, len=1)], -30.23870277404785)]\n\u003e\u003e next(result_iter)\n[([Token(form='사실', tag='MAG', start=0, len=2), Token(form='맞', tag='VV', start=3, len=1), Token(form='습니다', tag='EF', start=4, len=3), Token(form='.', tag='SF', start=7, len=1)], -22.232769012451172)]\n\u003e\u003e next(result_iter)\nTraceback (most recent call last):\n    File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nStopIteration\n```\nfor 반복문을 사용하면 좀더 간단하고 편리하게 병렬 처리를 수행할 수 있습니다. 이는 대량의 텍스트 데이터를 분석할 때 유용합니다.\n```python\n\u003e\u003e for result in kiwi.analyze(long_list_of_text):\n      tokens, score = result[0]\n      print(tokens)\n```\ntext를 str의 iterable로 준 경우 이 iterable을 읽어들이는 시점은 analyze 호출 이후일 수도 있습니다. \n따라서 이 인자가 다른 IO 자원(파일 입출력 등)과 연동되어 있다면 모든 분석이 끝나기 전까지 해당 자원을 종료하면 안됩니다.\n```python\n\u003e\u003e file = open('long_text.txt', encoding='utf-8')\n\u003e\u003e result_iter = kiwi.analyze(file)\n\u003e\u003e file.close() # 파일이 종료됨\n\u003e\u003e next(result_iter) # 종료된 파일에서 분석해야할 다음 텍스트를 읽어들이려고 시도함\nValueError: I/O operation on closed file.\nThe above exception was the direct cause of the following exception:\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nSystemError: \u003cbuilt-in function next\u003e returned a result with an error set\n```\n\u003c/details\u003e\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003esplit_into_sents( \n    text, \n    match_options=Match.ALL, \n    normalize_coda=False, \n    z_coda=True, \n    split_complex=False, \n    compatible_jamo=False,\n    saisiot=None,\n    allowed_dialects='standard', \n    dialect_cost=3.0,\n    return_tokens=False\n)\u003c/code\u003e\u003c/summary\u003e\n입력 텍스트를 문장 단위로 분할하여 반환합니다. \n이 메소드는 문장 분할 과정에서 내부적으로 형태소 분석을 사용하므로 문장 분할과 동시에 형태소 분석 결과를 얻는 데 사용할 수도 있습니다. `return_tokens`를 `True`로 설정하면 문장 분리와 함께 형태소 분석 결과도 출력합니다.\n\n```python\n\u003e\u003e kiwi.split_into_sents(\"여러 문장으로 구성된 텍스트네 이걸 분리해줘\")\n[Sentence(text='여러 문장으로 구성된 텍스트네', start=0, end=16, tokens=None),\n Sentence(text='이걸 분리해줘', start=17, end=24, tokens=None)]\n\u003e\u003e kiwi.split_into_sents(\"여러 문장으로 구성된 텍스트네 이걸 분리해줘\", return_tokens=True)\n[Sentence(text='여러 문장으로 구성된 텍스트네', start=0, end=16, tokens=[\n  Token(form='여러', tag='MM', start=0, len=2), \n  Token(form='문장', tag='NNG', start=3, len=2), \n  Token(form='으로', tag='JKB', start=5, len=2), \n  Token(form='구성', tag='NNG', start=8, len=2), \n  Token(form='되', tag='XSV', start=10, len=1), \n  Token(form='ᆫ', tag='ETM', start=11, len=0), \n  Token(form='텍스트', tag='NNG', start=12, len=3), \n  Token(form='이', tag='VCP', start=15, len=1), \n  Token(form='네', tag='EF', start=15, len=1)\n ]),\n Sentence(text='이걸 분리해줘', start=17, end=24, tokens=[\n  Token(form='이거', tag='NP', start=17, len=2), \n  Token(form='ᆯ', tag='JKO', start=19, len=0), \n  Token(form='분리', tag='NNG', start=20, len=2), \n  Token(form='하', tag='XSV', start=22, len=1), \n  Token(form='어', tag='EC', start=22, len=1), \n  Token(form='주', tag='VX', start=23, len=1), \n  Token(form='어', tag='EF', start=23, len=1)\n ])]\n```\n\u003c/details\u003e\n\u003chr\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eglue(text_chunks, return_space_insertions=False)\u003c/code\u003e\u003c/summary\u003e\n여러 텍스트 조각을 하나로 합치되, 문맥을 고려해 적절한 공백을 사이에 삽입합니다.\n이 기능은 OCR로 생성되거나 PDF 등에서 복사하여 강제 개행이 포함된 텍스트를 이어 붙이는데에 용이합니다.\n\n* `text_chunks`: 합칠 텍스트 조각들의 목록입니다.\n* `return_space_insertions`: True인 경우, 각 조각별 공백 삽입 유무를 `List[bool]`로 반환합니다.\n\n```python\n\u003e\u003e kiwi.glue([\n    \"그러나  알고보니 그 봉\",\n    \"지 안에 있던 것은 바로\",\n    \"레몬이었던 것이다.\"])\n\"그러나  알고보니 그 봉지 안에 있던 것은 바로 레몬이었던 것이다.\"\n\n\u003e\u003e kiwi.glue([\n    \"그러나  알고보니 그 봉\",\n    \"지 안에 있던 것은 바로\",\n    \"레몬이었던 것이다.\"], return_space_insertions=True)\n(\"그러나  알고보니 그 봉지 안에 있던 것은 바로 레몬이었던 것이다.\", [False, True])\n```\n\u003c/details\u003e\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003espace(text, reset_whitespace=False)\u003c/code\u003e\u003c/summary\u003e\n입력 텍스트에서 띄어쓰기를 교정하여 반환합니다.\n\n* `text`: 분석할 문자열입니다.  이 인자를 단일 str로 줄 경우, 싱글스레드에서 처리하며 str의 Iterable로 줄 경우, 멀티스레드로 분배하여 처리합니다.\n* `reset_whitespace` True인 경우 이미 띄어쓰기된 부분을 붙이는 교정도 적극적으로 수행합니다. 기본값은 False로, 이 경우에는 붙어 있는 단어를 띄어쓰는 교정 위주로 수행합니다.\n\n이 메소드의 띄어쓰기 교정 기능은 형태소 분석에 기반합니다. \n따라서 형태소 중간에 공백이 삽입된 경우 교정 결과가 부정확할 수 있습니다.\n이 경우 `Kiwi.global_config.space_tolerance`를 조절하여 형태소 내 공백을 무시하거나, \n`reset_whitespace=True`로 설정하여 아예 기존 공백을 무시하고 띄어쓰기를 하도록 하면 결과를 개선할 수 있습니다.\n\n```python\n\u003e\u003e kiwi.space(\"띄어쓰기없이작성된텍스트네이걸교정해줘\")\n\"띄어쓰기 없이 작성된 텍스트네 이걸 교정해 줘.\"\n\u003e\u003e kiwi.space(\"띄 어 쓰 기 문 제 가 있 습 니 다\")\n\"띄어 쓰기 문 제 가 있 습 니 다\"\n\u003e\u003e kiwi.global_config.space_tolerance = 2 # 형태소 내 공백을 최대 2개까지 허용\n\u003e\u003e kiwi.space(\"띄 어 쓰 기 문 제 가 있 습 니 다\")\n\"띄어 쓰기 문제가 있습니다\"\n\u003e\u003e kiwi.space(\"띄 어 쓰 기 문 제 가 있 습 니 다\", reset_whitespace=True) # 기존 공백 전부 무시\n\"띄어쓰기 문제가 있습니다\"\n```\n\u003c/details\u003e\n\u003chr\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003ejoin(morphs, lm_search=True)\u003c/code\u003e\u003c/summary\u003e\n형태소들을 결합하여 문장으로 복원합니다. 조사나 어미는 앞 형태소에 맞춰 적절한 형태로 변경됩니다.\n\n* `morphs`: 결합할 형태소의 목록입니다.  각 형태소는 `Kiwi.tokenizer`에서 얻어진 `Token` 타입이거나,  (형태, 품사)로 구성된 `tuple` 타입이어야 합니다.\n* `lm_search`: 둘 이상의 형태로 복원 가능한 모호한 형태소가 있는 경우, 이 값이 True면 언어 모델 탐색을 통해 최적의 형태소를 선택합니다. False일 경우 탐색을 실시하지 않지만 더 빠른 속도로 복원이 가능합니다.\n\n\n이 메소드는 형태소를 결합할 때 `space`에서 사용하는 것과 유사한 규칙을 사용하여 공백을 적절히 삽입합니다.\n형태소 그 자체에는 공백 관련 정보가 포함되지 않으므로\n특정 텍스트를 `tokenize`로 분석 후 다시 `join`으로 결합하여도 원본 텍스트가 그대로 복원되지는 않습니다.\n\n\n```python\n\u003e\u003e kiwi.join([('덥', 'VA'), ('어', 'EC')])\n'더워'\n\u003e\u003e tokens = kiwi.tokenize(\"분석된결과를 다시합칠수있다!\")\n# 형태소 분석 결과를 복원. \n# 복원 시 공백은 규칙에 의해 삽입되므로 원문 텍스트가 그대로 복원되지는 않음.\n\u003e\u003e kiwi.join(tokens)\n'분석된 결과를 다시 합칠 수 있다!'\n\u003e\u003e tokens[3]\nToken(form='결과', tag='NNG', start=4, len=2)\n\u003e\u003e tokens[3] = ('내용', 'NNG') # 4번째 형태소를 결과-\u003e내용으로 교체\n\u003e\u003e kiwi.join(tokens) # 다시 join하면 결과를-\u003e내용을 로 교체된 걸 확인 가능\n'분석된 내용을 다시 합칠 수 있다!'\n\n# 불규칙 활용여부가 모호한 경우 lm_search=True인 경우 맥락을 고려해 최적의 후보를 선택합니다.\n\u003e\u003e kiwi.join([('길', 'NNG'), ('을', 'JKO'), ('묻', 'VV'), ('어요', 'EF')])\n'길을 물어요'\n\u003e\u003e kiwi.join([('흙', 'NNG'), ('이', 'JKS'), ('묻', 'VV'), ('어요', 'EF')])\n'흙이 묻어요'\n# lm_search=False이면 탐색을 실시하지 않습니다.\n\u003e\u003e kiwi.join([('길', 'NNG'), ('을', 'JKO'), ('묻', 'VV'), ('어요', 'EF')], lm_search=False)\n'길을 묻어요'\n\u003e\u003e kiwi.join([('흙', 'NNG'), ('이', 'JKS'), ('묻', 'VV'), ('어요', 'EF')], lm_search=False)\n'흙이 묻어요'\n# 동사/형용사 품사 태그 뒤에 -R(규칙 활용), -I(불규칙 활용)을 덧붙여 활용법을 직접 명시할 수 있습니다.\n\u003e\u003e kiwi.join([('묻', 'VV-R'), ('어요', 'EF')])\n'묻어요'\n\u003e\u003e kiwi.join([('묻', 'VV-I'), ('어요', 'EF')])\n'물어요'\n\n# 0.15.2버전부터는 Tuple의 세번째 요소로 띄어쓰기 유무를 지정할 수 있습니다. \n# True일 경우 강제로 띄어쓰기, False일 경우 강제로 붙여쓰기를 수행합니다.\n\u003e\u003e kiwi.join([('길', 'NNG'), ('을', 'JKO', True), ('묻', 'VV'), ('어요', 'EF')])\n'길 을 물어요'\n\u003e\u003e kiwi.join([('길', 'NNG'), ('을', 'JKO'), ('묻', 'VV', False), ('어요', 'EF')])\n'길을물어요'\n\n# 과거형 선어말어미를 제거하는 예시\n\u003e\u003e remove_past = lambda s: kiwi.join(t for t in kiwi.tokenize(s) if t.tagged_form != '었/EP')\n\u003e\u003e remove_past('먹었다')\n'먹다'\n\u003e\u003e remove_past('먼 길을 걸었다')\n'먼 길을 걷다'\n\u003e\u003e remove_past('전화를 걸었다.')\n'전화를 걸다.'\n```\n\u003c/details\u003e\n\u003chr\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003etemplate(format_str, cache=True)\u003c/code\u003e\u003c/summary\u003e\n형태소들을 결합하여 문장으로 복원합니다. 조사나 어미는 앞 형태소에 맞춰 적절한 형태로 변경됩니다.\n\n* `format_str`: 템플릿 문자열입니다. Python의 `str.format`(https://docs.python.org/ko/3/library/string.html#formatstrings )과 동일한 문법을 사용합니다.\n* `cache`: 템플릿의 캐시 여부입니다.\n\n이 메소드는 다음과 같이 `Kiwi.join`의 형태소 결합 기능을 더욱 간편하게 사용할 수 있게 도와줍니다.\n\n```python\n# 빈칸은 {}로 표시합니다. \n# 이 자리에 형태소 혹은 기타 Python 객체가 들어가서 문자열을 완성시키게 됩니다.\n\u003e\u003e\u003e tpl = kiwi.template(\"{}가 {}을 {}었다.\")\n\n# template 객체는 format 메소드를 제공합니다. \n# 이 메소드를 통해 빈 칸을 채울 수 있습니다.\n# 형태소는 `kiwipiepy.Token` 타입이거나 \n# (형태, 품사) 혹은 (형태, 품사, 왼쪽 띄어쓰기 유무)로 구성된 tuple 타입이어야 합니다.\n\u003e\u003e\u003e tpl.format((\"나\", \"NP\"), (\"공부\", \"NNG\"), (\"하\", \"VV\"))\n'내가 공부를 했다.'\n\n\u003e\u003e\u003e tpl.format((\"너\", \"NP\"), (\"밥\", \"NNG\"), (\"먹\", \"VV\"))\n'네가 밥을 먹었다.'\n\n\u003e\u003e\u003e tpl.format((\"우리\", \"NP\"), (\"길\", \"NNG\"), (\"묻\", \"VV-I\"))\n'우리가 길을 물었다.'\n\n# 형태소가 아닌 Python 객체가 입력되는 경우 `str.format`과 동일하게 동작합니다.\n\u003e\u003e\u003e tpl.format(5, \"str\", {\"dict\":\"dict\"})\n\"5가 str를 {'dict': 'dict'}었다.\"\n\n# 입력한 객체가 형태소가 아닌 Python 객체로 처리되길 원하는 경우 !s 변환 플래그를 사용합니다.\n\u003e\u003e\u003e tpl = kiwi.template(\"{!s}가 {}을 {}었다.\")\n\u003e\u003e\u003e tpl.format((\"나\", \"NP\"), (\"공부\", \"NNG\"), (\"하\", \"VV\"))\n\"('나', 'NP')가 공부를 했다.\"\n\n# Python 객체에 대해서는 `str.format`과 동일한 서식 지정자를 사용할 수 있습니다.\n\u003e\u003e\u003e tpl = kiwi.template(\"{:.5f}가 {!r}을 {}었다.\")\n\u003e\u003e\u003e tpl.format(5, \"str\", {\"dict\":\"dict\"})\n\"5.00000가 'str'를 {'dict': 'dict'}었다.\"\n\n# 서식 지정자가 주어진 칸에 형태소를 대입할 경우 ValueError가 발생합니다.\n\u003e\u003e\u003e tpl.format((\"우리\", \"NP\"), \"str\", (\"묻\", \"VV-I\"))\nValueError: cannot specify format specifier for Kiwi Token\n\n# 치환 필드에 index나 name을 지정하여 대입 순서를 설정할 수 있습니다.\n\u003e\u003e\u003e tpl = kiwi.template(\"{0}가 {obj}를 {verb}\\ㄴ다. {1}는 {obj}를 안 {verb}었다.\")\n\u003e\u003e\u003e tpl.format(\n    [(\"우리\", \"NP\"), (\"들\", \"XSN\")], \n    [(\"너희\", \"NP\"), (\"들\", \"XSN\")], \n    obj=(\"길\", \"NNG\"), \n    verb=(\"묻\", \"VV-I\")\n)\n'우리들이 길을 묻는다. 너희들은 길을 안 물었다.'\n\n# 위의 예시처럼 종성 자음은 호환용 자모 코드 앞에 \\\\로 이스케이프를 사용해야합니다.\n# 그렇지 않으면 종성이 아닌 초성으로 인식됩니다.\n\u003e\u003e\u003e tpl = kiwi.template(\"{0}가 {obj}를 {verb}ㄴ다. {1}는 {obj}를 안 {verb}었다.\")\n\u003e\u003e\u003e tpl.format(\n    [(\"우리\", \"NP\"), (\"들\", \"XSN\")], \n    [(\"너희\", \"NP\"), (\"들\", \"XSN\")], \n    obj=(\"길\", \"NNG\"), \n    verb=(\"묻\", \"VV-I\")\n)\n'우리들이 길을 묻 ᄂ이다. 너희들은 길을 안 물었다.'\n```\n\u003c/details\u003e\n\u003chr\u003e\n\n### CoNg 모델 사용하기\nv0.22.0 버전부터는 대부분의 상황에서 속도가 개선되고 정확도는 향상된 CoNg(Contextual N-gram)으로 공식 배포 기본 모델이 교체되었습니다. 따라서 별다른 조치를 취할 필요 없이 바로 CoNg 모델을 사용할 수 있습니다.\nv0.21.0 버전에서도 CoNg을 사용할 수 있으나 공식 배포에는 포함되어 있지 않으므로 [릴리즈](https://github.com/bab2min/Kiwi/releases/tag/v0.21.0)에서 별도로 다운로드 받아야 합니다. 그리고 다운 받은 모델의 압축을 풀고, `Kiwi` 객체를 생성할 때 `model_path`에 모델 파일이 있는 경로를 지정해주면 됩니다. \n현재는 x86-64 장비에서만 최적화된 커널이 제공되고 Apple Silicon M 시리즈 칩이나 Arm64 등 다른 아키텍처에서는 느리게 동작하거나 오류가 발생할 수 있습니다. (오류를 제보해주시면 CoNg 모델 커널을 개선하는 데 큰 도움이 됩니다.)\n\n다음은 리눅스 환경에서 0.21.0버전의 모델 파일을 받고 CoNg 모델을 사용하는 방법입니다.\n\n```bash\n$ pip install \"kiwipiepy==0.21\"\n$ curl -L https://github.com/bab2min/Kiwi/releases/download/v0.21.0/kiwi_model_v0.21.0_cong_base.tgz -o model.tgz\n  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\n100 58.7M  100 58.7M    0     0  7981k      0  0:00:07  0:00:07 --:--:-- 10.4M\n$ tar -zxvf model.tgz\ncong-base/\ncong-base/combiningRule.txt\ncong-base/cong.mdl\ncong-base/default.dict\ncong-base/extract.mdl\ncong-base/multi.dict\ncong-base/sj.morph\ncong-base/typo.dict\n$ python\n\u003e\u003e\u003e from kiwipiepy import Kiwi\n\u003e\u003e\u003e kiwi = Kiwi(model_path='./cong-base', model_type='cong')\n\u003e\u003e\u003e kiwi.tokenize('테스트입니다.')\n```\n\nCoNg 모델에서는 모호성 해소 성능이 크게 개선되었습니다.\n```python\n\u003e\u003e\u003e from kiwipiepy import Kiwi\n\u003e\u003e\u003e kiwi = Kiwi() # 기본 모델 (KnLM)\n\u003e\u003e\u003e kiwi.tokenize('한적한 카페에 강도 들었다는 소리 못 들었어?')\n[Token(form='한적', tag='XR', start=0, len=2),\n Token(form='하', tag='XSA', start=2, len=1), \n Token(form='ᆫ', tag='ETM', start=2, len=1), \n Token(form='카페', tag='NNG', start==4, len=2), \n Token(form='에', tag='JKB', start=6, len=1), \n Token(form='강', tag='NNG', start=8, len=1), ####\n Token(form='도', tag='JX', start=9, len=1), # 강도가 잘못 분석됨\n Token(form='듣', tag='VV-I', start=11, len=1), \n Token(form='었', tag='EP', start=12, len=1), \n Token(form='다는', tag='ETM', start=13, len=2), \n Token(form='소리', tag='NNG', start=16, len=2), \n Token(form='못', tag='MAG', start=19, len=1), \n Token(form='듣', tag='VV-I', start=21, len=1), \n Token(form='었', tag='EP', start=22, len=1), \n Token(form='어', tag='EF', start=23, len=1), \n Token(form='?', tag='SF', start=24, len=1)]\n\n\u003e\u003e\u003e kiwi.tokenize('스페인의 강들처럼 이 강도 대서양으로 흘러든다.')\n[Token(form='스페인', tag='NNP', start=0, len=3),\n Token(form='의', tag='JKG', start=3, len=1),\n Token(form='강', tag='NNG', start=5, len=1), \n Token(form='들', tag='XSN', start=6, len=1), \n Token(form='처럼', tag='JKB', start=7, len=2), \n Token(form='이', tag='MM', start=10, len=1), \n Token(form='강도', tag='NNG', start=12, len=2), # 강+도가 잘못 분석됨\n Token(form='대서양', tag='NNP', start=15, len=3), \n Token(form='으로', tag='JKB', start=18, len=2), \n Token(form='흘러들', tag='VV', start=21, len=3), \n Token(form='ᆫ다', tag='EF', start=23, len=2), \n Token(form='.', tag='SF', start=25, len=1)]\n\n\u003e\u003e\u003e kiwi = Kiwi(model_path=PATH_TO_CONG_MODEL) # CoNg 모델\n\u003e\u003e\u003e kiwi.tokenize('한적한 카페에 강도 들었다는 소리 못 들었어?')\n[Token(form='한적', tag='XR', start=0, len=2),\n Token(form='하', tag='XSA', start=2, len=1), \n Token(form='ᆫ', tag='ETM', start=2, len=1), \n Token(form='카페', tag='NNG', start==4, len=2), \n Token(form='에', tag='JKB', start=6, len=1), \n Token(form='강도', tag='NNG', start=8, len=2), # 강도가 제대로 분석됨\n Token(form='들', tag='VV', start=11, len=1), \n Token(form='었', tag='EP', start=12, len=1), \n Token(form='다는', tag='ETM', start=13, len=2), \n Token(form='소리', tag='NNG', start=16, len=2), \n Token(form='못', tag='MAG', start=19, len=1), \n Token(form='듣', tag='VV-I', start=21, len=1), \n Token(form='었', tag='EP', start=22, len=1), \n Token(form='어', tag='EF', start=23, len=1), \n Token(form='?', tag='SF', start=24, len=1)]\n\n\u003e\u003e\u003e kiwi.tokenize('스페인의 강들처럼 이 강도 대서양으로 흘러든다.')\n[Token(form='스페인', tag='NNP', start=0, len=3),\n Token(form='의', tag='JKG', start=3, len=1), \n Token(form='강', tag='NNG', start=5, len=1), \n Token(form='들', tag='XSN', start=6, len=1), \n Token(form='처럼', tag='JKB', start=7, len=2), \n Token(form='이', tag='MM', start=10, len=1), \n Token(form='강', tag='NNG', start=12, len=1), ####\n Token(form='도', tag='JX', start=13, len=1), # 강+도가 제대로 분석됨\n Token(form='대서양', tag='NNP', start=15, len=3), \n Token(form='으로', tag='JKB', start=18, len=2), \n Token(form='흘러들', tag='VV', start=21, len=3), \n Token(form='ᆫ다', tag='EF', start=23, len=2), \n Token(form='.', tag='SF', start=25, len=1)]\n```\n\n## 품사 태그\n\n세종 품사 태그를 기초로 하되, 일부 품사 태그를 추가/수정하여 사용하고 있습니다.\n\n\u003ctable class='sp'\u003e\n\u003ctr\u003e\u003cth\u003e대분류\u003c/th\u003e\u003cth\u003e태그\u003c/th\u003e\u003cth\u003e설명\u003c/th\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='5'\u003e체언(N)\u003c/th\u003e\u003ctd\u003eNNG\u003c/td\u003e\u003ctd\u003e일반 명사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eNNP\u003c/td\u003e\u003ctd\u003e고유 명사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eNNB\u003c/td\u003e\u003ctd\u003e의존 명사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eNR\u003c/td\u003e\u003ctd\u003e수사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eNP\u003c/td\u003e\u003ctd\u003e대명사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='5'\u003e용언(V)\u003c/th\u003e\u003ctd\u003eVV\u003c/td\u003e\u003ctd\u003e동사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eVA\u003c/td\u003e\u003ctd\u003e형용사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eVX\u003c/td\u003e\u003ctd\u003e보조 용언\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eVCP\u003c/td\u003e\u003ctd\u003e긍정 지정사(이다)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eVCN\u003c/td\u003e\u003ctd\u003e부정 지정사(아니다)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='1'\u003e관형사\u003c/th\u003e\u003ctd\u003eMM\u003c/td\u003e\u003ctd\u003e관형사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='2'\u003e부사(MA)\u003c/th\u003e\u003ctd\u003eMAG\u003c/td\u003e\u003ctd\u003e일반 부사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eMAJ\u003c/td\u003e\u003ctd\u003e접속 부사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='1'\u003e감탄사\u003c/th\u003e\u003ctd\u003eIC\u003c/td\u003e\u003ctd\u003e감탄사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='9'\u003e조사(J)\u003c/th\u003e\u003ctd\u003eJKS\u003c/td\u003e\u003ctd\u003e주격 조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eJKC\u003c/td\u003e\u003ctd\u003e보격 조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eJKG\u003c/td\u003e\u003ctd\u003e관형격 조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eJKO\u003c/td\u003e\u003ctd\u003e목적격 조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eJKB\u003c/td\u003e\u003ctd\u003e부사격 조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eJKV\u003c/td\u003e\u003ctd\u003e호격 조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eJKQ\u003c/td\u003e\u003ctd\u003e인용격 조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eJX\u003c/td\u003e\u003ctd\u003e보조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eJC\u003c/td\u003e\u003ctd\u003e접속 조사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='5'\u003e어미(E)\u003c/th\u003e\u003ctd\u003eEP\u003c/td\u003e\u003ctd\u003e선어말 어미\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eEF\u003c/td\u003e\u003ctd\u003e종결 어미\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eEC\u003c/td\u003e\u003ctd\u003e연결 어미\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eETN\u003c/td\u003e\u003ctd\u003e명사형 전성 어미\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eETM\u003c/td\u003e\u003ctd\u003e관형형 전성 어미\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='1'\u003e접두사\u003c/th\u003e\u003ctd\u003eXPN\u003c/td\u003e\u003ctd\u003e체언 접두사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='4'\u003e접미사(XS)\u003c/th\u003e\u003ctd\u003eXSN\u003c/td\u003e\u003ctd\u003e명사 파생 접미사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eXSV\u003c/td\u003e\u003ctd\u003e동사 파생 접미사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eXSA\u003c/td\u003e\u003ctd\u003e형용사 파생 접미사\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eXSM\u003c/td\u003e\u003ctd\u003e부사 파생 접미사\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='1'\u003e어근\u003c/th\u003e\u003ctd\u003eXR\u003c/td\u003e\u003ctd\u003e어근\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='12'\u003e부호, 외국어, 특수문자(S)\u003c/th\u003e\u003ctd\u003eSF\u003c/td\u003e\u003ctd\u003e종결 부호(. ! ?)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSP\u003c/td\u003e\u003ctd\u003e구분 부호(, / : ;)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSS\u003c/td\u003e\u003ctd\u003e인용 부호 및 괄호(' \" ( ) [ ] \u003c \u003e { } ― ‘ ’ “ ” ≪ ≫ 등)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSSO\u003c/td\u003e\u003ctd\u003eSS 중 여는 부호\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSSC\u003c/td\u003e\u003ctd\u003eSS 중 닫는 부호\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSE\u003c/td\u003e\u003ctd\u003e줄임표(…)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSO\u003c/td\u003e\u003ctd\u003e붙임표(- ~)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSW\u003c/td\u003e\u003ctd\u003e기타 특수 문자\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSL\u003c/td\u003e\u003ctd\u003e알파벳(A-Z a-z)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSH\u003c/td\u003e\u003ctd\u003e한자\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSN\u003c/td\u003e\u003ctd\u003e숫자(0-9)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eSB\u003c/td\u003e\u003ctd\u003e순서 있는 글머리(가. 나. 1. 2. 가) 나) 등)\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='1'\u003e분석 불능\u003c/th\u003e\u003ctd\u003eUN\u003c/td\u003e\u003ctd\u003e분석 불능\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='6'\u003e웹(W)\u003c/th\u003e\u003ctd\u003eW_URL\u003c/td\u003e\u003ctd\u003eURL 주소\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eW_EMAIL\u003c/td\u003e\u003ctd\u003e이메일 주소\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eW_HASHTAG\u003c/td\u003e\u003ctd\u003e해시태그(#abcd)\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eW_MENTION\u003c/td\u003e\u003ctd\u003e멘션(@abcd)\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eW_SERIAL\u003c/td\u003e\u003ctd\u003e일련번호(전화번호, 통장번호, IP주소 등)\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eW_EMOJI\u003c/td\u003e\u003ctd\u003e이모지\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003cth rowspan='3'\u003e기타\u003c/th\u003e\u003ctd\u003eZ_CODA\u003c/td\u003e\u003ctd\u003e덧붙은 받침\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eZ_SIOT\u003c/td\u003e\u003ctd\u003e사이시옷\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eUSER0~4\u003c/td\u003e\u003ctd\u003e사용자 정의 태그\u003csup\u003e*\u003c/sup\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n\u003csup\u003e*\u003c/sup\u003e 세종 품사 태그와 다른 독자적인 태그입니다.\n\n0.12.0 버전부터 `VV`, `VA`, `VX`, `XSA` 태그에 불규칙 활용여부를 명시하는 접미사 `-R`와 `-I`이 덧붙을 수 있습니다.\n`-R`은 규칙 활용,`-I`은 불규칙 활용을 나타냅니다.\n\n## 문장 분리 기능\n0.10.3 버전부터 문장 분리 기능을 실험적으로 지원합니다. 0.11.0 버전부터는 정확도가 제법 향상되었습니다. 문장 분리 기능의 성능에 대해서는 [이 페이지](benchmark/sentence_split)를 참조해주세요. \n\n## 모호성 해소 성능\n한 단어가 여러 가지로 형태소 분석이 가능하여 맥락을 보는 게 필수적인 상황에서 Kiwi가 높은 정확도를 보이는 것이 확인되었습니다. \n모호성 해소 성능에 대해서는 [이 페이지](benchmark/disambiguate)를 참조해주세요. \n\n## 인용하기\n인용 방법에 대해서는 [Kiwi#인용하기](https://github.com/bab2min/Kiwi#%EC%9D%B8%EC%9A%A9%ED%95%98%EA%B8%B0)를 참조해주세요.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbab2min%2Fkiwipiepy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbab2min%2Fkiwipiepy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbab2min%2Fkiwipiepy/lists"}