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.0

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.0
File
litsea-0.14.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
litsea-0.14.0-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.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
litsea-0.14.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
litsea-0.14.0-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.0-cp310-abi3-win_amd64.whl

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

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

Download URL litsea-0.14.0-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
dd04bdb1f990c9dbb7c88d01e2445305fa83fd5989e09d9db4f9500db8fe2cc0
BLAKE2b-256 checksum
How to use checksums
85ccf20491a2de5a82a8e8954b9d4e70819794f9d0eeca5a4bf98a35a1cd2dc8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL litsea-0.14.0-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
944dcde47497b0048cbb3331ef4389c3d22b4ff6c70272483d38c5422bbf1b7b
BLAKE2b-256 checksum
How to use checksums
6cf2a998a201b7e91159f16e8d074bd99d7aaa104acb580069851ab205e9d615
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL litsea-0.14.0-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
0dd2a6ee186d1757ebf43f68862a61f623f0d91f0afc18f61d4b86a21defd520
BLAKE2b-256 checksum
How to use checksums
4ff8a60d3680de4bd11ce34344a5706592157bc8ca7630dabc04bd0f56bd2b18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

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

Download URL litsea-0.14.0-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
90d7bcfbe49abda35e23b9fcb742f2fb3f423d6f4d8206f85f74ab1bbc1511c2
BLAKE2b-256 checksum
How to use checksums
9f6ed51ddd0dbbea04ff4de1bc8a06e4b59f939cc7db50d2cf01635c288c95b0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release history Release notifications | RSS feed

0.14.2

5 release files

0.14.1

5 release files

This release

0.14.0 This release

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