全部文章

01.文本预处理-分词、命名实体、词性

 

文本处理概述

文本预处理及其作用

  • 文本语料在输送给模型前一般需要一系列的预处理工作,才能符合模型输入的要求,如:将文本转化成模型需要的张量,规范张量的尺寸等,而且科学的文本预处理环节还将有效指导模型超参数的选择,提升模型的评估指标。
文本预处理中包含的主要环节
  • 文本处理的基本方法
  • 文本张量表示方法
  • 文本语料的数据分析
  • 文本特征处理
  • 数据增强方法

文本处理的基本方法

  • 分词
  • 词性标注
  • 命名实体识别

文本张量表示方法

  • one-hot 编码
  • Word2vec
  • Word Embedding

文本语料的数据分析

  • 标签数量分布
  • 句子长度分布
  • 词频统计与关键词词云

文本特征处理

  • 添加 n-gram 特征
  • 文本长度规范

数据增强方法

  • 回译数据增强法

重要说明

  • 在实际生产应用中,我们最常使用的两种语言是中文和英文,因此,文本预处理部分的内容都将针对这两种语言进行讲解。

文本处理的基本方法

学习目标

  • 了解什么是分词、词性标注、命名实体识别及其它们的作用
  • 掌握分词、词性标注、命名实体识别流行工具的使用方法

分词

什么是分词

分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,分词过程就是找到这样分界符的过程。

示例:​

工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作
==>
['工信处','女干事','每月','经过','下属','科室','都','要','亲口','交代','24','口','交换机','等','技术性','器件','的','安装','工作']

分词的作用

词作为语言语义理解的最小单元,是人类理解文本语言的基础。因此也是AI解决NLP领域高阶任务,如自动问答、机器翻译、文本生成的重要基础环节。

流行中文分词工具jieba

​特性:​

  • 支持多种分词模式:
    • 精确模式
    • 全模式
    • 搜索引擎模式
  • 支持中文繁体分词
  • 支持用户自定义词典

​安装:​

pip install jieba

精确模式分词

试图将句子最精确地切开,适合文本分析。
import jieba
content = "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
jieba.cut(content, cut_all=False)  # cut_all默认为False
# 将返回一个生成器对象
<generator object Tokenizer.cut at 0x7f065c19e318>
# 若需直接返回列表内容,使用jieba.lcut即可
jieba.lcut(content, cut_all=False)
['工信处', '女干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口']

全模式分词

import jieba
content = "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
jieba.lcut(content, cut_all=True)
# 输出:
# ['工信处', '处女', '女干事', '干事', '每月', '月经', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换机', '技术', '技术性', '器件', '的', '安装', '安装工', '装工', '工作']

搜索引擎模式分词

在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
import jieba
content = "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
jieba.cut_for_search(content)
# 将返回一个生成器对象
<generator object Tokenizer.cut at 0x7f065c19e318>
# 若需直接返回列表内容,使用jieba.lcut_for_search即可
jieba.lcut_for_search(content)
['工信处', '干事', '女干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换', '换机', '交换机', '等', '技术', '技术性', '器件', '的', '安装', '工作']
# 对'女干事','交换机'等较长词汇都进行了再次分词。

中文繁体分词

针对中国香港、台湾地区的繁体文本进行分词。
import jieba
content = "烦恼即是菩提,我暂且不提"
jieba.lcut(content)
['烦惱', '即', '是', '菩提', ',', '我', '暂且', '不', '提']

使用用户自定义词典

  • 添加自定义词典后,jieba 能够准确识别词典中出现的词汇,提升整体的识别准确率。
  • 词典格式:每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
  • 词典样式如下,具体词性含义请参照附录:jieba 词性对照表,将该词典存为 userdict.txt,方便之后加载使用。
 
云计算 5 n
李小福 2 nr
easy_install 3 eng
好用 300
韩玉赏鉴 3 nz
八一双鹿 3 nz
 
import jieba
res1=jieba.lcut("八一双鹿更名为八一南昌篮球队!")
# 没有使用用户自定义词典前的结果:
print(res1)
# ['八', '一双', '鹿', '更名', '为', '八一', '南昌', '篮球队', '!']
jieba.load_userdict("./userdict.txt")
res2=jieba.lcut("八一双鹿更名为八一南昌篮球队!")
# 使用了用户自定义词典后的结果:
print(res2)
# ['八一双鹿', '更名', '为', '八一', '南昌', '篮球队', '!']

流行中英文分词工具 hanlp

官方文档:https://hanlp.hankcs.com/install.html

中英文 NLP 处理工具包,基于 tensorflow2.0,使用在学术界和行业中推广最先进的深度学习技术。

hanlp 的安装

# 使用pip进行安装
pip install hanlp
#由于版本问题,可能很多模型只在hanlp[full]里存在,所以建议直接安装hanlp[full]
pip install "hanlp[full]" -U

安装过程极其容易由于版本依赖问题各种报错,建议单独创建一个全新环境进行安装。(本人是在Pycharm的命令行进行安装的,安装完整版需要很长时间,过程如下)

点击查看
(base) (.venv) PS D:\learn\learncode\nlp> pip install hanlp[full] -U
 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/7f/7e/1b1cc4e0e7cc2666cceb3d250eef47a205f0821c330392cf45eb08156ce5/torch-2.7.0-cp310-cp310-win_amd64.whl (212.5 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 212.5/212.5 MB 7.4 MB/s eta 0:00:00
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/20/e0/5cb2f8493571f0a5a7273cd7078f191ac252a402b5fb9cb6091f14879109/torch-2.6.0-cp310-cp310-win_amd64.whl (204.2 MB)
...
Successfully installed absl-py-2.3.1 astunparse-1.6.3 cachetools-5.5.2 fasttext-wheel-0.9.2 flatbuffers-25.2.10 gast-0.4.0 google-auth-2.40.3 google-auth-oauthlib-1.0.0 google-pasta-0.2.0 grpcio-1.73.1
 h5py-3.14.0 keras-2.13.1 libclang-18.1.1 markdown-3.8.2 numpy-1.24.3 oauthlib-3.3.1 opt-einsum-3.4.0 penman-1.2.1 perin-parser-0.0.19 protobuf-4.25.8 pyasn1-0.6.1 pyasn1-modules-0.4.2 pybind11-3.0.0 r
equests-oauthlib-2.0.0 rsa-4.9.1 scipy-1.15.3 six-1.17.0 tensorboard-2.13.0 tensorboard-data-server-0.7.2 tensorflow-2.13.1 tensorflow-estimator-2.13.0 tensorflow-intel-2.13.1 tensorflow-io-gcs-filesystem-0.31.0 torch-2.1.2 typing-extensions-4.5.0 werkzeug-3.1.3 wrapt-1.17.2

注意!!!第一次执行下面的hanlp.load()代码,一定要梯子,连接国际互联网,因为中国防火墙屏蔽了全球最大的人工智能AI开源托管平台 Hugging Face🤗。

详情解释参照官网:https://hanlp.hankcs.com/install.html#%E5%AE%8C%E6%95%B4%E7%89%88

如果还是安装不了,请您参考这份资料 ☺️

hanlp.load()代码下载模型很慢,请耐心等待:

Downloading https://file.hankcs.com/hanlp/ner/ner_conll03_bert_base_cased_en_20211227_121443.zip to C:\Users\luzhanshi\AppData\Roaming\hanlp\ner/ner_conll03_bert_base_cased_en_20211227_121443.zip
10%   311.4 MiB  31.7 KiB/s ETA:  1 h [=======                                 ]

 

hanlp 中文分词

import hanlp
# 加载CTB_CONVSEG预训练模型进行分词任务
tokenizer = hanlp.load('CTB6_CONVSEG')
print(tokenizer("工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"))

['工信处', '女', '干事', '每', '月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换机', '等', '技术性', '器件', '的', '安装', '工作']

基于规则的分词器精度通常低于基于深度学习的模型(如 PKU_NAME_MERGED_SIX_MONTHS_CONVSEG

由于 CTB6_CONVSEG 模型相对较旧,建议你使用更新的预训练模型,例如 PKU_NAME_MERGED_SIX_MONTHS_CONVSEG,它在分词效果上可能会更好,同时兼容性也更高。

import hanlp
# 加载PKU_NAME_MERGED_SIX_MONTHS_CONVSEG预训练模型进行分词任务
tokenizer = hanlp.load('PKU_NAME_MERGED_SIX_MONTHS_CONVSEG')
print(tokenizer("工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"))
['工信处', '女', '干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换机', '等', '技术性', '器件', '的', '安装', '工作']

若你主要处理中文分词,推荐使用 PKU_BERT_BASE_ZH 等基于 BERT 的模型,精度高于传统的 CONVSEG 模型。【低版本2.1.1及以下勿用】

import hanlp

# 加载 PyTorch 版本的分词模型(无 Keras 依赖)
tokenizer = hanlp.load(hanlp.pretrained.tok.PKU_BERT_BASE_ZH)
#PKU_BERT_BASE_ZH 是 HanLP 较新版本(如 2.3.0+)中新增的模型名称,而你当前环境中的 HanLP 版本可能较低(如 2.1.1 及以下)。旧版本的 hanlp.pretrained.tok 模块中并未定义该模。

# 测试分词
result = tokenizer("工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作")
print(result)

hanlp 英文分词

# 进行英文分词,英文分词只需要使用规则即可
tokenizer = hanlp.utils.rules.tokenize_english
tokenizer('Mr. Hankcs bought hankcs.com for 1.5 thousand dollars.')
['Mr.', 'Hankcs', 'bought', 'hankes.com', 'for', '1.5', 'thousand', 'ollars', '.']

hanlp.utils.rules.tokenize_english 是旧版本中的函数,新版本已移除。

建议使用 hanlp.load() 加载多语种模型:

import hanlp
# 加载多语种分词模型(支持英文)
tokenizer = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH)
# 分词(指定语言为英文)
tokens = tokenizer('Mr. Hankcs bought hankcs.com for 1.5 thousand dollars.', lang='en')
print(tokens)

hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH模型返回内容非常多,详参文末多语言分词模型

如果需要更精确的英文分词,建议使用专门的英文 NLP 工具(如 SpaCy、NLTK),它们针对英文有更完善的规则和模型支持。

pip install nltk
import nltk
nltk.download('punkt')  # 首次运行需要下载分词器数据

from nltk.tokenize import word_tokenize

text = 'Mr. Hankcs bought hankcs.com for 1.5 thousand dollars.'
tokens = word_tokenize(text)
print(tokens)
['Mr.', 'Hankcs', 'bought', 'hankcs.com', 'for', '1.5', 'thousand', 'dollars', '.']

命名实体

  • 命名实体:通常我们将人名、地名、机构名等专有名词统称命名实体。如:周杰伦、黑山县、孔子学院、24 辊方钢矫直机。
  • 顾名思义,命名实体识别(Named Entity Recognition,简称 NER)就是识别出一段文本中可能存在的命名实体。
举个栗子:
鲁迅,浙江绍兴人,五四新文化运动的重要参与者,代表作朝花夕拾。
→
鲁迅(人名)/ 浙江绍兴(地名)人 / 五四新文化运动(专有名词)/ 重要参与者 / 代表作 / 朝花夕拾(专有名词)

命名实体识别的作用

同词汇一样,命名实体也是人类理解文本的基础单元,因此也是 AI 解决 NLP 领域高阶任务的重要基础环节。

hanlp 中文命名实体识别

import hanlp
# 加载中文命名实体识别的预训练模型MSRA_NER_BERT_BASE_ZH
recognizer = hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)
# 这里注意它的输入是对句子进行字符分割的列表,因此在句子前加入了list()
# list('上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观。')
# ['上','海','华','安','工','业','(','集','团',')','公','司','董','事'
print(recognizer(list('上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆')))
# 返回结果是一个装有n个元组的列表,每个元组代表一个命名实体,元组中的每一项分别代表具体的命名实体
#[('上海华安工业(集团)公司', 'NT', 0, 12), ('谭旭光', 'NR', 15, 18), ('张晚霞', 'NR', 21, 24), ('美国', 'NS', 26, 28), ('纽约现代艺术博物馆', 'NS', 28, 37)]

hanlp 英文命名实体识别

import hanlp
# 加载英文命名实体识别的预训练模型CONLL03_NER_BERT_BASE_UNCASED_EN
recognizer = hanlp.load(hanlp.pretrained.ner.CONLL03_NER_BERT_BASE_CASED_EN)
# 这里注意它的输入是对句子进行分词后的结果,是列表形式。
print(recognizer(["President", "Obama", "is", "speaking", "at", "the", "White", "Hous"]))
# 返回结果是一个装有n个元组的列表,每个元组代表一个命名实体,元组中的每一项分别代表具体的命名实体
#[('Obama', 'PER', 1, 2), ('White Hous', 'LOC', 6, 8)]

词性标注

  • 词性:语言中对词的一种分类方法,以语法特征为主要依据、兼顾词汇意义对词进行划分的结果,常见的词性有 14 种,如:名词、动词、形容词等。
  • 顾名思义,词性标注(Part-Of-Speech tagging,简称 POS)就是标注出一段文本中每个词汇的词性。
  • 举个栗子:
    我爱自然语言处理
    →
    我 /rr,爱 /v,自然语言 /n,处理 /vn
    rr:人称代词
    v:动词
    n:名词
    vn:动名词

词性标注的作用

词性标注以分词为基础,是对文本语言的另一个角度的理解,因此也常常成为 AI 解决 NLP 领域高阶任务的重要基础环节。

jieba 中文词性标注

import jieba.posseg as pseg
print(pseg.lcut("我爱北京天安门"))
# 结果返回一个装有pair元组的列表,每个pair元组中分别是词汇及其对应的词性,具体词性含义请参照[附录]
#[pair('我', 'r'), pair('爱', 'v'), pair('北京', 'ns'), pair('天安门', 'ns')]

hanlp 中文词性标注

import hanlp
# 加载中文词性标注的预训练模型CTB5_POS_RNN_FASTTEXT_ZH
tagger = hanlp.load(hanlp.pretrained.pos.CTB5_POS_RNN_FASTTEXT_ZH)
# 输入是分词结果列表
print(tagger(['我', '的', '希望', '是', '希望', '和平']))
# 结果返回对应的词性
# ['PN', 'DEG', 'NN', 'VC', 'VV', 'NN']

hanlp 英文词性标注

import hanlp
# 加载英文词性标注的预训练模型PTB_POS_RNN_FASTTEXT_EN
tagger = hanlp.load(hanlp.pretrained.pos.PTB_POS_RNN_FASTTEXT_EN)
# 输入是分词结果列表
tagger(['I', 'banked', '2', 'dollars', 'in', 'a', 'bank', '.'])
['PRP', 'VBD', 'CD', 'NNS', 'IN', 'DT', 'NN', '.']

PTB_POS_RNN_FASTTEXT_EN模型很大:7.5G,并且各种报错,不建议使用了。。。

替代方案:


# 先安装spaCy和模型(工业级,高性能)
# pip install spacy
# python -m spacy download en_core_web_sm# # 下载英文小模型

import spacy

# 加载spaCy英文模型
nlp = spacy.load("en_core_web_sm")
text = "I banked 2 dollars in a bank ."
doc = nlp(text)
# 输出词性标注结果
print([(token.text, token.pos_) for token in doc])
#[('I', 'PRON'), ('banked', 'VERB'), ('2', 'NUM'), ('dollars', 'NOUN'), ('in', 'ADP'), ('a', 'DET'), ('bank', 'NOUN'), ('.', 'PUNCT')]

 

小节总结

  • 学习了什么是分词:
    分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,分词过程就是找到这样分界符的过程。
  • 学习了分词的作用:
    词作为语言语义理解的最小单元,是人类理解文本语言的基础。因此也是 AI 解决 NLP 领域高阶任务,如自动问答、机器翻译、文本生成的重要基础环节。
  • 学习了流行中文分词工具 jieba:
    支持多种分词模式:精确模式、全模式、搜索引擎模式
    支持中文繁体分词
    支持用户自定义词典
  • 学习了 jieba 工具的安装和分词使用。
  • 学习了流行中英文分词工具 hanlp 及其安装和分词使用。
  • 学习了什么是命名实体识别:
    命名实体:通常我们将人名、地名、机构名等专有名词统称命名实体。如:周杰伦、黑山县、孔子学院、24 辊方钢矫直机。
    顾名思义,命名实体识别(Named Entity Recognition,简称 NER)就是识别出一段文本中可能存在的命名实体。
  • 命名实体识别的作用:
    同词汇一样,命名实体也是人类理解文本的基础单元,因此也是 AI 解决 NLP 领域高阶任务的重要基础环节。
  • 学习了使用 hanlp 进行命名实体识别。
  • 学习了什么是词性标注:
    词性:语言中对词的一种分类方法,以语法特征为主要依据、兼顾词汇意义对词进行划分的结果,常见的词性有 14 种,如:名词、动词、形容词等。
    顾名思义,词性标注(Part-Of-Speech tagging,简称 POS)就是标注出一段文本中每个词汇的词性。
  • 学习了词性标注的作用:
    词性标注以分词为基础,是对文本语言的另一个角度的理解,因此也常常成为 AI 解决 NLP 领域高阶任务的重要基础环节。
  • 学习了使用 jieba 和 hanlp 进行词性标注。

 

 

附录

jieba 词性对照表

  • a:形容词
    • ad:副形词
    • ag:形容词性语素
    • an:名形词
  • b:区别词
  • c:连词
  • d:副词
    • df
    • dg:副语素
  • e:叹词
  • f:方位词
  • g:语素
  • h:前接成分
  • i:成语
  • j:简称略称
  • k:后接成分
  • l:习用语
  • m:数词
    • mg
    • mq:数量词
  • n:名词
    • ng:名词性语素
    • nr:人名
    • nrfg
    • nrt
    • ns:地名
    • nt:机构团体名
    • nz:其他专名
  • o:拟声词
  • p:介词
  • q:量词
  • r:代词
    • rg:代词性语素
    • rr:人称代词
    • rz:指示代词
  • s:处所词
  • t:时间词
    • tg:时语素
  • u:助词
    • ud:结构助词得
    • ug:时态助词
    • uj:结构助词的
    • ul:时态助词了
    • uv:结构助词地
    • uz:时态助词着
  • v:动词
    • vd:副动词
    • vg:动词性语素
    • vi:不及物动词
    • vn:名动词
    • vq
  • x:非语素词
  • y:语气词
  • z:状态词
    • zg

hanlp 词性对照表

  • 【Proper Noun--NR, 专有名词】
  • 【Temporal Noun--NT, 时间名词】
  • 【Localizer--LC, 定位词】如 "内","左右"
  • 【Pronoun--PN, 代词】
  • 【Determiner--DT, 限定词】如 "这","全体"
  • 【Cardinal Number--CD, 量词】
  • 【Ordinal Number--OD, 次序词】如 "第三十一"
  • 【Measure word--M, 单位词】如 "杯"
  • 【Verb: VA, VC, VE, VV, 动词】
  • 【Adverb: AD, 副词】如 "近","极大"
  • 【Preposition: P, 介词】如 "随着"
  • 【Subordinating conjunctions: CS, 从属连词】
  • 【Conjuctions: CC, 连词】如 "和"
  • 【Particle: DEC, DEG, DEV, DER, AS, SP, ETC, MSP, 小品词】如 "的话"
  • 【Interjections: IJ, 感叹词】如 "哈"
  • 【Onomatopoeia: ON, 拟声词】如 "哗啦啦"
  • 【Other Noun-modifier: JJ】如 "发稿 / JJ 时间 / NN"
  • 【Punctuation: PU, 标点符号】
  • 【Foreign word: FW, 外国词语】如 "OK"

 

其他流行分词工具对比

(1) LTP (语言技术平台) - 哈工大版​

  • ​优势​​:
    • 工业级中文NLP工具包,支持分词、词性标注、NER、依存句法分析。
    • 基于 ​​CPM-Large​​ 等大模型,精度高于 HanLP。
    • 提供轻量级模型(仅40MB),适合生产环境。
  • ​示例​​:
     
    from ltp import LTP
    ltp = LTP()
    print(ltp.pipeline(["工信处女干事每月经过下属科室"], tasks=["cws", "pos"]))

​(2) THULAC (清华版)​

  • ​优势​​:
    • 清华大学开源的高效中文词法分析工具。
    • 速度和精度平衡,支持多线程。
  • ​示例​​:
    import thulac
    thu = thulac.thulac()
    print(thu.cut("工信处女干事每月经过下属科室"))

​(3) PaddleNLP (百度飞桨)​

  • ​优势​​:
    • 基于 ​​ERNIE 3.0​​ 等大模型,支持全流程NLP任务。
    • 预训练模型丰富(如UIE、文心大模型),适合企业级应用。
  • ​示例​​:
    from paddlenlp import Taskflow
    seg = Taskflow("word_segmentation")
    print(seg("工信处女干事每月经过下属科室"))

​(4) SparkNLP (工业级分布式工具)​

  • ​优势​​:
    • 基于Apache Spark,支持分布式处理海量文本。
    • 提供预训练模型(如BERT、RoBERTa)的分布式推理。
  • ​适用场景​​:大数据环境下的实时NLP处理。

​3. 选择建议​

需求场景 推荐工具
​高精度学术研究​ HanLP、LTP、PaddleNLP
​工业级生产环境​ LTP、PaddleNLP、SparkNLP
​简单分词/快速处理​ jieba、THULAC
​多语言支持​ HanLP、SparkNLP

​4. 最新趋势(2025年)​

  • ​大模型生态​​:如 ​​ChatGLM4​​、​​通义千问​​ 的API可直接用于分词和NLP任务,无需本地部署。
  • ​轻量化工具​​:如 ​​LTP-Lite​​、​​FastHan​​ 在保持精度的同时大幅提升速度。
  • ​领域定制化​​:医疗、法律等垂直领域的分词工具(如 ​​BioNLP​​)逐渐成熟。

​5. 总结​

  • ​继续用 jieba​​:适合简单需求,无需复杂依赖。
  • ​升级到 HanLP/LTP​​:需要更高精度和功能扩展。
  • ​尝试 PaddleNLP/SparkNLP​​:企业级大规模应用。
  • ​关注大模型API​​:如百度ERNIE、阿里通义千问的云端NLP服务。

 

多语言分词模型

返回内容:

点击查看
{
  "tok/fine": [
    "Mr",
    ".",
    "Hankcs",
    "bought",
    "hankcs",
    ".com",
    "for",
    "1.5",
    "thousand",
    "dollars",
    "."
  ],
  "tok/coarse": [
    "Mr",
    ".",
    "Hankcs",
    "bought",
    "hankcs.com",
    "for",
    "1.5",
    "thousand",
    "dollars",
    "."
  ],
  "pos/ctb": [
    "NN",
    "PU",
    "NR",
    "NN",
    "NR",
    "URL",
    "P",
    "CD",
    "CD",
    "NN",
    "PU"
  ],
  "pos/pku": [
    "nx",
    "w",
    "nr",
    "nx",
    "nr",
    "nx",
    "p",
    "m",
    "nx",
    "nx",
    "w"
  ],
  "pos/863": [
    "ws",
    "w",
    "w",
    "w",
    "w",
    "w",
    "p",
    "m",
    "w",
    "w",
    "w"
  ],
  "ner/msra": [
    ["Hankcs", "PERSON", 2, 3],
    ["hankcs", "PERSON", 4, 5],
    ["1.5", "DECIMAL", 7, 8]
  ],
  "ner/pku": [
    ["Hankcs", "nr", 2, 3],
    ["hankcs", "nr", 4, 5]
  ],
  "ner/ontonotes": [
    ["Hankcs", "PERSON", 2, 3],
    ["hankcs", "PERSON", 4, 5]
  ],
  "srl": [],
  "dep": [
    [0, "root"],
    [1, "punct"],
    [4, "dep"],
    [1, "dep"],
    [6, "dep"],
    [1, "dep"],
    [1, "prep"],
    [10, "nummod"],
    [10, "nn"],
    [1, "dep"],
    [1, "punct"]
  ],
  "sdp": [
    [[8, "eCoo"]],
    [[1, "mPunc"]],
    [[0, "Root"], [1, "eCoo"]],
    [[1, "eCoo"]],
    [[1, "eCoo"]],
    [[5, "eCoo"]],
    [[5, "mPrep"]],
    [[5, "Time"]],
    [[10, "Nmod"]],
    [[3, "eEqu"]],
    [[10, "mPunc"]]
  ],
  "con": [
    "TOP",
    [["FRAG", [["NP", [["NN", ["Mr"]]]], ["PU", ["."]], ["NR", ["Hankcs"]], ["NN", ["bought"]], ["NP", [["NR", ["hankcs"]]]], ["URL", [".com"]], ["P", ["for"]], ["QP", [["CD", ["1.5"]]]], ["CD", ["thousand"]], ["NN", ["dollars"]], ["PU", ["."]]]]]
  ]
}

这段代码使用了 HanLP 的多任务学习(MTL)模型 CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH 对英文句子进行分词和多种 NLP 任务分析。返回结果是一个包含多个 NLP 任务输出的字典,下面详细解析每个字段的含义:

1. 分词(Tokenization)​

  • tok/fine​: 细粒度分词结果(按最小单位切分)

    ["Mr", ".", "Hankcs", "bought", "hankcs", ".com", "for", "1.5", "thousand", "dollars", "."]
    • 将 "hankcs.com" 拆分为 ["hankcs", ".com"]
  • tok/coarse​: 粗粒度分词结果(合并部分语义单元)

["Mr", ".", "Hankcs", "bought", "hankcs.com", "for", "1.5", "thousand", "dollars", "."]
    • 将 "hankcs.com" 视为一个整体(URL)。

2. 词性标注(Part-of-Speech Tagging)​

模型使用了三种不同的词性标注标准:

  • pos/ctb​: 中文树库(Chinese Treebank)标准
    • NN(普通名词)、PU(标点)、NR(专有名词)、URL(网址)、P(介词)、CD(基数词)。
  • pos/pku​: 北京大学标准
    • nx(未知名词)、w(标点)、nr(人名)、p(介词)、m(数词)。
  • pos/863​: 国家 863 标准
    • ws(未知词)、w(标点)、p(介词)、m(数词)。

​3. 命名实体识别(Named Entity Recognition, NER)​

模型使用了三种 NER 标注标准:

  • ner/msra​: MSRA 标准
    • 识别出 "Hankcs" 和 "hankcs" 为人名(PERSON),"1.5" 为小数(DECIMAL)。
  • ner/pku​: 北京大学标准
    • 仅标注人名(nr)。
  • ner/ontonotes​: OntoNotes 标准
    • 与人名标注与 MSRA 相同。

​4. 依存句法分析(Dependency Parsing, dep)​

输出每个词的依存关系(head index, relation type):

[
  [0, "root"],    # "Mr" 是根节点
  [1, "punct"],   # "." 依附于 "Mr"(标点)
  [4, "dep"],     # "Hankcs" 依附于 "bought"
  [1, "dep"],     # "bought" 依附于 "Mr"
  [6, "dep"],     # "hankcs" 依附于 ".com"
  [1, "dep"],     # ".com" 依附于 "Mr"
  [1, "prep"],    # "for" 依附于 "Mr"(介词修饰)
  [10, "nummod"], # "1.5" 修饰 "dollars"(数字修饰)
  [10, "nn"],     # "thousand" 修饰 "dollars"(名词修饰)
  [1, "dep"],     # "dollars" 依附于 "Mr"
  [1, "punct"]    # "." 依附于 "Mr"(标点)
]

5. 语义依存分析(Semantic Dependency Parsing, sdp)​

描述词语间的语义关系(比依存分析更细粒度):

[
  [[8, "eCoo"]],              # "Mr" 与 "thousand" 是并列关系(eCoo)
  [[1, "mPunc"]],             # "." 是 "Mr" 的标点(mPunc)
  [[0, "Root"], [1, "eCoo"]], # "Hankcs" 是根节点,并与 "Mr" 并列
  [[1, "eCoo"]],              # "bought" 与 "Mr" 并列
  [[1, "eCoo"]],              # "hankcs" 与 "Mr" 并列
  [[5, "eCoo"]],              # ".com" 与 "hankcs" 并列
  [[5, "mPrep"]],             # "for" 是 ".com" 的介词修饰(mPrep)
  [[5, "Time"]],              # "1.5" 是 ".com" 的时间修饰(Time)
  [[10, "Nmod"]],             # "thousand" 修饰 "dollars"(Nmod)
  [[3, "eEqu"]],              # "dollars" 与 "Hankcs" 是等价关系(eEqu)
  [[10, "mPunc"]]             # "." 是 "dollars" 的标点(mPunc)
]

6. 成分句法分析(Constituency Parsing, con)​

输出句子的短语结构树(括号表示法):

[
  "TOP",
  [["FRAG", [
    ["NP", [["NN", ["Mr"]]]], 
    ["PU", ["."]], 
    ["NR", ["Hankcs"]], 
    ["NN", ["bought"]], 
    ["NP", [["NR", ["hankcs"]]]], 
    ["URL", [".com"]], 
    ["P", ["for"]], 
    ["QP", [["CD", ["1.5"]]]], 
    ["CD", ["thousand"]], 
    ["NN", ["dollars"]], 
    ["PU", ["."]]
  ]]]
]
  • TOP 是根节点,FRAG 表示片段(非完整句子)。
  • 包含 NP(名词短语)、PU(标点)、QP(量词短语)等成分。

​7. 语义角色标注(Semantic Role Labeling, srl)​

  • 输出为空([]),说明模型未识别出明显的谓词-论元结构(可能是英文支持有限或句子简单)。

​总结​

  1. ​分词​​:支持细粒度和粗粒度分词(如 URL 合并)。
  2. ​多标准词性标注​​:适应不同应用场景(如 CTB、PKU)。
  3. ​命名实体识别​​:支持人名、数字等(不同标准结果略有差异)。
  4. ​句法分析​​:提供依存关系和短语结构树。
  5. ​语义分析​​:包括依存语义(SDP)和成分句法(CON)。

​问题​​:模型对英文的处理可能不如中文精确(如 "bought" 被标注为名词 NN,实际应为动词 VBD)。如需更准确的英文分析,建议使用专用英文 NLP 工具(如 spaCy、NLTK)。

posted @ 2025-07-10 14:36  指尖下的世界  阅读(23)  评论(0)    收藏  举报