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

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

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

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

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

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

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

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

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

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

Download URL litsea-0.14.2-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
003a2d37b895e38c27f8a0945a8739625b2b82dd44591f630bef9eb25e996c86
BLAKE2b-256 checksum
How to use checksums
af8114c11e18ebe214776cafd98bf8e676a88fdcf272449bf1ad4b1526e9fc1c
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.2 This release

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