Skip to main content

litsea-python

Python binding for Litsea, a compact word segmentation and POS (Part-of-Speech) tagging library for Japanese, Chinese, Korean, and English.

日本語のREADME

Installation

pip install litsea

Wheels are built with the stable ABI (abi3) and work on CPython 3.10 and later.

Models are not bundled

The package ships code only. Download a pre-trained model from the Litsea repository and point the segmenter at it:

Model Purpose Size
japanese.model, chinese.model, korean.model, english.model Segmentation 84 KB – 2.0 MB
japanese_pos.model, chinese_pos.model, korean_pos.model, english_pos.model Segmentation + POS 3.0 – 8.0 MB

You never have to say which kind you have: the model file identifies itself, and has_pos reports what the loaded model can do.

Usage

Segmentation

from litsea import Language, Segmenter

seg = Segmenter.open(Language.JAPANESE, "models/japanese.model")

seg.segment("これはテストです。")
# ['これ', 'は', 'テスト', 'です', '。']

seg.segment_batch(["これはテストです。", "東京都から神奈川県へ引っ越した"])
# [['これ', 'は', 'テスト', 'です', '。'],
#  ['東京', '都', 'から', '神奈川', '県', 'へ', '引っ越し', 'た']]

For space-delimited languages the whitespace comes back as its own token, so the tokens always reconstruct the input:

Segmenter.open("ko", "models/korean.model").segment("안녕하세요 반갑습니다")
# ['안녕하세요', ' ', '반갑습니다']

Language names work anywhere a Language does:

Segmenter.open("ja", "models/japanese.model")
Segmenter.open("japanese", "models/japanese.model")

POS tagging

from litsea import Language, Segmenter

seg = Segmenter.open(Language.JAPANESE, "models/japanese_pos.model")
seg.has_pos
# True

for token in seg.segment_with_pos("これはテストです。"):
    print(token.surface, token.pos.name, token.start, token.end)
# これ PRON 0 6
# は ADP 6 9
# テスト NOUN 9 18
# です AUX 18 24
# 。 PUNCT 24 27

start and end are byte offsets into the input, so text.encode()[token.start:token.end].decode() gives the surface back. They are exact for both segmentation and POS output, including for space-preserving languages such as Korean and English.

Calling segment_with_pos on a segmentation-only model raises PosUnavailableError.

Other model sources

Segmenter.from_bytes(Language.KOREAN, open("korean.model", "rb").read())
Segmenter.from_uri(Language.CHINESE, "https://example.com/chinese.model")

Training

from litsea import CancelToken, Extractor, Language, Trainer

Extractor(Language.JAPANESE).extract("corpus.txt", "features.txt")

metrics = Trainer(0.01, 10_000, "features.txt").train("japanese.model")
print(f"accuracy: {metrics.accuracy:.2f}%")

Two-stage (segmentation + POS) training:

from litsea import Extractor, Language, TwoStageTrainer

Extractor(Language.JAPANESE).extract_two_stage("corpus_pos.txt", "features", feature_set="fast")

metrics = TwoStageTrainer(10, "features").train("japanese_pos.model")
print(metrics.stage1.accuracy, metrics.stage2.accuracy)

A TwoStageTrainer can only be used once — training collapses stage 1 into an AdaBoost model, which consumes the trainer. available reports whether it can still run.

Cancelling a training run

Training releases the GIL, so another thread can stop it:

import threading
from litsea import CancelToken, Trainer

cancel = CancelToken()
trainer = Trainer(0.01, 100_000, "features.txt")

threading.Timer(60.0, cancel.cancel).start()
metrics = trainer.train("japanese.model", cancel=cancel)

Cancelling is not an error: training stops at its next check point, still writes the partially trained model, and returns its metrics.

The binding never installs a signal handler, so Ctrl-C handling stays yours.

Errors

Every exception derives from LitseaError, so one except clause catches them all.

Exception Raised when
InvalidArgumentError Unknown language name, unknown feature set, reused trainer
ModelError Download failed, or the file is a legacy joint POS model
IoError A file could not be read or written
ParseError The model or training data is malformed
UnsupportedError The scheme or operation is unavailable in this build
PosUnavailableError POS tagging requested from a segmentation-only model

Threading

A Segmenter is immutable and safe to share between threads. segment_batch, segment_with_pos_batch, extract, and every train release the GIL. Single-sentence segment and segment_with_pos keep it: releasing would require copying the input string, which costs more than segmenting one sentence.

Development

make setup-venv            # create the venv and install the dev tools
make test-litsea-python    # cargo test + maturin develop + pytest
make build-litsea-python   # build a release wheel

License

MIT. See LICENSE.

Release files for litsea 0.14.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for litsea 0.14.3
File
litsea-0.14.3-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
litsea-0.14.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
litsea-0.14.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
litsea-0.14.3-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
litsea-0.14.3-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 12.5 MB

Release files / litsea-0.14.3-cp310-abi3-win_amd64.whl

Download URL litsea-0.14.3-cp310-abi3-win_amd64.whl
Size 2.2 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
272a3d90ab5c2484238cd4277d3e825eb8cee578172535bdd16c07986b14f448
BLAKE2b-256 checksum
How to use checksums
73d544478fd62c0809720192e55c478f615b68c02ede55cbd89bdb0bf5af45ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / litsea-0.14.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL litsea-0.14.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 2.7 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
c848f55cef4688a5d9ff8e277b4f911984d2041bf15d8268d6245031c5b690d1
BLAKE2b-256 checksum
How to use checksums
8cb477bf0b0e8315e9d462f668cd9a157082c14223c8ff90f5982d31f0809c4b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / litsea-0.14.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL litsea-0.14.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.6 MB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
2c723d4c065b4168702e3a93441bec22ab5a6e0d02c0c34f8b48423235a92e4d
BLAKE2b-256 checksum
How to use checksums
4583118f63605131df676ae61c33e0e212141641560c2f1f6b2d6e3b25c689c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / litsea-0.14.3-cp310-abi3-macosx_11_0_arm64.whl

Download URL litsea-0.14.3-cp310-abi3-macosx_11_0_arm64.whl
Size 2.5 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f2b551a8eff5c71b2562359f7772850612188258db8512a2074a3ded894bc23f
BLAKE2b-256 checksum
How to use checksums
5809eff11fdc2309f340c2c205c4b3ac3e4a4ea2bb9d351383ae4f83398468f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / litsea-0.14.3-cp310-abi3-macosx_10_12_x86_64.whl

Download URL litsea-0.14.3-cp310-abi3-macosx_10_12_x86_64.whl
Size 2.6 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
5da1a0a7215985ec93e436410125f5f5c49aac5055265870c01dee05ef8f3989
BLAKE2b-256 checksum
How to use checksums
ea2dfedd857d646a7a880bc3fe9cfa66f098bfefc34596f56730fe22f8c7b7aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release history Release notifications | RSS feed

This release

0.14.3 This release

5 release files

0.14.2

5 release files

0.14.1

5 release files

0.14.0

5 release files

0.13.0

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page