mirror of
https://github.com/explosion/spaCy.git
synced 2024-11-11 12:18:04 +03:00
f7471abd82
* Add pkuseg and serialization support for Chinese Add support for pkuseg alongside jieba * Specify model through `Language` meta: * split on characters (if no word segmentation packages are installed) ``` Chinese(meta={"tokenizer": {"config": {"use_jieba": False, "use_pkuseg": False}}}) ``` * jieba (remains the default tokenizer if installed) ``` Chinese() Chinese(meta={"tokenizer": {"config": {"use_jieba": True}}}) # explicit ``` * pkuseg ``` Chinese(meta={"tokenizer": {"config": {"pkuseg_model": "default", "use_jieba": False, "use_pkuseg": True}}}) ``` * The new tokenizer setting `require_pkuseg` is used to override `use_jieba` default, which is intended for models that provide a pkuseg model: ``` nlp_pkuseg = Chinese(meta={"tokenizer": {"config": {"pkuseg_model": "default", "require_pkuseg": True}}}) nlp = Chinese() # has `use_jieba` as `True` by default nlp.from_bytes(nlp_pkuseg.to_bytes()) # `require_pkuseg` overrides `use_jieba` when calling the tokenizer ``` Add support for serialization of tokenizer settings and pkuseg model, if loaded * Add sorting for `Language.to_bytes()` serialization of `Language.meta` so that the (emptied, but still present) tokenizer metadata is in a consistent position in the serialized data Extend tests to cover all three tokenizer configurations and serialization * Fix from_disk and tests without jieba or pkuseg * Load cfg first and only show error if `use_pkuseg` * Fix blank/default initialization in serialization tests * Explicitly initialize jieba's cache on init * Add serialization for pkuseg pre/postprocessors * Reformat pkuseg install message
39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
# coding: utf-8
|
|
from __future__ import unicode_literals
|
|
|
|
import pytest
|
|
from spacy.lang.zh import Chinese
|
|
from ...util import make_tempdir
|
|
|
|
|
|
def zh_tokenizer_serialize(zh_tokenizer):
|
|
tokenizer_bytes = zh_tokenizer.to_bytes()
|
|
nlp = Chinese(meta={"tokenizer": {"config": {"use_jieba": False}}})
|
|
nlp.tokenizer.from_bytes(tokenizer_bytes)
|
|
assert tokenizer_bytes == nlp.tokenizer.to_bytes()
|
|
|
|
with make_tempdir() as d:
|
|
file_path = d / "tokenizer"
|
|
zh_tokenizer.to_disk(file_path)
|
|
nlp = Chinese(meta={"tokenizer": {"config": {"use_jieba": False}}})
|
|
nlp.tokenizer.from_disk(file_path)
|
|
assert tokenizer_bytes == nlp.tokenizer.to_bytes()
|
|
|
|
|
|
def test_zh_tokenizer_serialize_char(zh_tokenizer_char):
|
|
zh_tokenizer_serialize(zh_tokenizer_char)
|
|
|
|
|
|
def test_zh_tokenizer_serialize_jieba(zh_tokenizer_jieba):
|
|
zh_tokenizer_serialize(zh_tokenizer_jieba)
|
|
|
|
|
|
def test_zh_tokenizer_serialize_pkuseg(zh_tokenizer_pkuseg):
|
|
zh_tokenizer_serialize(zh_tokenizer_pkuseg)
|
|
|
|
|
|
@pytest.mark.slow
|
|
def test_zh_tokenizer_serialize_pkuseg_with_processors(zh_tokenizer_pkuseg):
|
|
nlp = Chinese(meta={"tokenizer": {"config": {"use_jieba": False, "use_pkuseg": True, "pkuseg_model": "medicine"}}})
|
|
zh_tokenizer_serialize(nlp.tokenizer)
|