十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

spaCy 中文分词如何选择 char、jieba 与 pkuseg 分词器?

spaCy 中文分词如何选择 char、jieba 与 pkuseg 分词器? spaCy 中文分词如何选择 char、jieba 与 pkuseg 分词器【免费下载链接】spaCy Industrial-strength Natural Language Processing (NLP) in Python项目地址: https://gitcode.com/GitHub_Trending/sp/spaCy在 spaCy 中处理中文文本时Chinese语言类或spacy.blank(zh)的默认分词器是字符级切分而不是按词切分。如果你的任务需要真正的“词”粒度分词就需要在char、jieba、pkuseg三种segmenter选项中做出选择并正确配置。本文基于 spaCy 文档中的 Chinese language support 章节和 spacy/lang/zh/__init__.py 源码给出每个分词器的适用条件、配置写法、依赖安装和验证方法帮助你在中文 NLP 项目中确定并验证分词方案。三种分词器各自的行为与默认值spaCy 的中文语言类支持三种 word segmentation 选项见 usage/models 文档Segmenter说明char字符切分默认选项。新建Chinese语言类或调用spacy.blank(zh)时启用的就是它把文本切成单个字符。jiebaJieba将 tokenizer 选项segmenter设为jieba使用 Jieba 做词级分词需要额外安装 jieba 包。pkusegPKUSeg自 spaCy v2.3.0 起支持把segmenter设为pkuseg。文档说明它被引入是为了更好地支持 Chinese OntoNotes 以及 spaCy 提供的中文 pipeline。一个重要的版本行为变化自 v3.0 起默认分词器从 Jieba 改成了字符切分。也就是说v3 中新建的中文 pipeline 不再自动用 jieba 分词。另外由于pkuseg分词器依赖一个需要从文件加载的模型文档要求模型在 initialization 阶段通常是训练前加载这样打包后的中文模型在运行时不会依赖某个本地路径。按依赖需求和使用目标选择三种选项的选择依据都来自文档中说明的行为差异不想引入额外依赖、或只做字符级处理用char。它是默认值创建Chinese()即可用无需安装任何第三方分词库。需要词级分词且希望零模型配置用jieba。只需pip install jieba配置里把segmenter设为jieba即可不需要再调用initialize加载模型。需要与 spaCy 提供的中文 pipeline 对齐、或需要用户词典干预用pkuseg。spaCy 官方中文 pipeline 内置的是基于 Chinese OntoNotes 5.0 训练的自定义pkuseg模型同时pkuseg提供运行期修改用户词典的 APIpkuseg_update_user_dict这是char和jieba不具备的能力。注意pkuseg要求安装spacy-pkuseg包并必须在initialize时指定模型。配置与验证各分词器以下示例均使用文档给出的写法。验证方式为对一段文本调用nlp(text)后检查[token.text for token in doc]的结果。char默认配置即可from spacy.lang.zh import Chinese # 字符切分默认 nlp Chinese() doc nlp(作为语言而言) print([token.text for token in doc])仓库测试文件 spacy/tests/lang/zh/test_tokenizer.py 对char的断言是tokens list(text)即每个 token 恰好是原文的一个字符。你运行上面代码后应看到与逐字符一致的结果文档示例外的输出取决于你输入的具体文本。对应的完整 tokenizer 配置来自文档[nlp.tokenizer] tokenizers spacy.zh.ChineseTokenizer segmenter charjieba先安装 jieba再配置 segmenterjieba分词器在创建 tokenizer 时导入 jieba 包未安装会抛出ImportError提示信息为安装pip install jieba。pip install jiebafrom spacy.lang.zh import Chinese cfg {segmenter: jieba} nlp Chinese.from_config({nlp: {tokenizer: cfg}}) doc nlp(作为语言而言) print([token.text for token in doc])仓库测试文件中记录了 jieba 分词器对示例句“作为语言而言为世界使用人数最多的语言目前世界有五分之一人口做为母语。”的期望分词结果以下为其中的分词片段来自 test_tokenizer.py属于仓库测试的期望值实际输出以你安装的 jieba 版本为准[作为, 语言, 而言, , 为, 世界, 使用, 人, 数最多, ...]。pkuseg安装 spacy-pkuseg配置后必须调用 initializepkuseg路径比前两者多两步安装spacy-pkuseg包并在创建 pipeline 后调用nlp.tokenizer.initialize(...)指定模型。源码中的安装提示为pip install spacy-pkuseg0.0.27,0.1.0 # 或 conda install -c conda-forge spacy-pkuseg0.0.27,0.1.0基本用法来自文档from spacy.lang.zh import Chinese # 使用 pkuseg 提供的 mixed 模型 cfg {segmenter: pkuseg} nlp Chinese.from_config({nlp: {tokenizer: cfg}}) nlp.tokenizer.initialize(pkuseg_modelmixed) doc nlp(作为语言而言) print([token.text for token in doc])pkuseg_model接受两类值文档 API 表spacy-pkuseg提供的模型名或本地模型目录路径。文档示例列出的几种加载方式# 加载 spaCy 的 OntoNotes 模型 nlp.tokenizer.initialize(pkuseg_modelspacy_ontonotes) # 加载 pkuseg 的 news 模型 nlp.tokenizer.initialize(pkuseg_modelnews) # 加载本地模型 nlp.tokenizer.initialize(pkuseg_model/path/to/pkuseg_model) # 覆盖用户词典pkuseg_user_dict 为“每行一个词”的文件路径 nlp.tokenizer.initialize(pkuseg_modelspacy_ontonotes, pkuseg_user_dict/path/to/user_dict)其中/path/to/pkuseg_model与/path/to/user_dict需要你替换为自己的本地模型目录与用户词典文件路径pkuseg_user_dict默认为defaultspacy-pkuseg自带的默认词典。pkuseg支持的领域模型文档说明用于研究场景mixed等价于pkuseg包的default、news、web、medicine、tourism。如果你的语料属于其他领域文档指出pkuseg提供了训练 API 来自训模型import spacy_pkuseg as pkuseg from spacy.lang.zh import Chinese # 训练 pkuseg 模型 pkuseg.train(train.utf8, test.utf8, /path/to/pkuseg_model) # 在 spaCy 中文 tokenizer 中加载 cfg {segmenter: pkuseg} nlp Chinese.from_config({nlp: {tokenizer: cfg}}) nlp.tokenizer.initialize(pkuseg_model/path/to/pkuseg_model)仓库测试文件中同样记录了pkuseg基于spacy_ontonotes模型对同一示例句的期望分词片段[作为, 语言, 而言, , 为, 世界, 使用, 人数, 最多, ...]——与 jieba 的结果在“人数/最多”和“做为”等处不同这也是对比两个分词器切分粒度时可以直接观察到的差异。在训练配置中声明 pkuseg 初始化如果你要训练 pipeline 而不是临时用 blank 模型文档建议在训练配置的[initialize.tokenizer]段提供 pkuseg 设置数据会在训练前加载并随模型序列化运行时不再需要相同的本地路径[initialize] [initialize.tokenizer] pkuseg_model /path/to/model pkuseg_user_dict default/path/to/model替换为你训练机上可访问的模型目录。修改 pkuseg 用户词典只有pkuseg分词器支持运行期修改用户词典文档 API# 追加词到用户词典 nlp.tokenizer.pkuseg_update_user_dict([中国, ABC]) # 清空用户词典并替换为新词 nlp.tokenizer.pkuseg_update_user_dict([中国], resetTrue) # 清空用户词典 nlp.tokenizer.pkuseg_update_user_dict([], resetTrue)注意在char或jieba分词器上调用该方法只会发出警告源码 zh/__init__.py 中对应Warnings.W104不会生效。常见报错与边界pkuseg 未初始化就处理文本直接把segmenter设为pkuseg但未调用initialize处理文本时会抛出ValueError错误码 E1000。仓库测试 test_zh_uninitialized_pkuseg 验证的正是这一行为。配置了不支持的 segmenter 值例如{segmenter: unk}会在from_config时抛出ConfigValidationError见 test_zh_unsupported_segmenter。缺少依赖未安装 jieba 时选择jieba、未安装spacy-pkuseg时选择pkuseg都会抛出ImportError并提示对应的pip install命令。数据授权边界文档说明pkuseg官方提供的模型包含仅限研究用途的数据因此 spaCy 官方中文 pipeline 改用仅基于 Chinese OntoNotes 5.0 训练的自定义pkuseg模型。如果你的用途超出研究范围需要留意这一点。小结一条可核对的操作路径明确是否需要词级分词不需要则保持默认char零依赖需要词级分词且不想管理模型安装jiebasegmenter jieba需要用户词典、对齐官方中文 pipeline 或领域模型安装spacy-pkuseg0.0.27,0.1.0segmenter pkuseg并务必调用nlp.tokenizer.initialize(pkuseg_model...)用[token.text for token in nlp(text)]核对切分结果对照上文仓库测试文件中的示例分词确认粒度是否符合预期。更完整的中文支持说明见 usage/models 文档实现细节见 spacy/lang/zh/__init__.py。【免费下载链接】spaCy Industrial-strength Natural Language Processing (NLP) in Python项目地址: https://gitcode.com/GitHub_Trending/sp/spaCy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表