jieba 本身是一个专注于中文分词的库,但它集成了另一个强大的工具——ICTCLAS 的词性标注功能,使得在分词的同时进行词性标注变得非常简单。

准备工作:安装 jieba
如果你的环境中还没有安装 jieba,请先通过 pip 安装:
pip install jieba
核心函数:jieba.posseg.cut()
词性标注的关键是使用 jieba.posseg 模块中的 cut() 函数,它的用法和 jieba.cut() 非常相似,但返回的结果不同。
jieba.cut()返回的是一个生成器,包含的是分好的词(字符串)。jieba.posseg.cut()返回的是一个生成器,包含的是word对象,每个word对象都有两个重要属性:word: 词本身(字符串)flag: 词的词性(字符串)
基本用法示例
下面是一个最简单的例子,展示如何使用 jieba.posseg.cut()。
import jieba.posseg as pseg
# 待分析的文本
sentence = "我爱北京天安门,天安门上太阳升。"
# 使用 pseg.cut() 进行分词和词性标注
words = pseg.cut(sentence)
# 遍历结果并打印
for word, flag in words:
print(f"词语: {word:<5} 词性: {flag}")
输出结果:

词语: 我 词性: r
词语: 爱 词性: v
词语: 北京 词性: ns
词语: 天安门 词性: ns
词语: , 词性: w
词语: 天安门 词性: ns
词语: 上 词性: f
词语: 太阳 词性: n
词语: 升 词性: v
词语: 。 词性: w
从输出中可以看到,每个词语都被正确地切分,并且旁边标注了对应的词性代码。
词性代码对照表
jieba 使用的词性标记集基于 ICTCLAS,它是一个比较通用的标准,为了更好地理解输出结果,你需要一个词性代码对照表。
| 词性代码 | 词性名称 | 示例词 |
|---|---|---|
| n | 名词 | 学生, 北京, 天气 |
| nr | 人名 | 鲁迅, 毛泽东 |
| ns | 地名 | 北京, 上海, 长江 |
| nt | 机构团体名 | 证监会, 国务院 |
| nz | 其他专名 | 诺贝尔奖, 黄金周 |
| v | 动词 | 跑, 学习, 是 |
| vd | 副动词 | 很快地跑 |
| vn | 名物化动词 | 建议, 管理 |
| a | 形容词 | 好, 漂亮, 干净 |
| ad | 副形词 | 非常好 |
| an | 名形词 | 公正的 |
| d | 副词 | 很, 都, 已经 |
| m | 数词 | 一, 第一, 3.14 |
| q | 量词 | 个, 次, 下 |
| r | 代词 | 我, 他, 这, 什么 |
| p | 介词 | 在, 把, 对于 |
| c | 连词 | 和, 如果 |
| u | 助词 | 的, 了, 吗, 着 |
| xc | 其他虚词 | 所, 似的 |
| w | 标点符号 | ,。!?、:“” |
| PER | 人名 | (与nr类似,有时会分开) |
| LOC | 地名 | (与ns类似) |
| ORG | 机构名 | (与nt类似) |
| TIME | 时间 | 明天, 2025年 |
提示:这个表是最常见的部分,jieba 支持的词性标记比这更多,如果你需要完整的列表,可以查阅 jieba 的官方文档或 ICTCLAS 的相关资料。
高级用法
1 返回列表而非生成器
如果你想一次性获取所有结果,可以使用 list() 函数。
import jieba.posseg as pseg sentence = "自然语言处理是人工智能的重要领域。" words = pseg.cut(sentence) # 将生成器转换为列表 word_list = list(words) # 打印列表内容 print(word_list)
输出结果:
[Pair('自然', 'b'), Pair('语言', 'n'), Pair('处理', 'v'), Pair('是', 'v'), Pair('人工智能', 'n'), Pair('的', 'u'), Pair('重要', 'a'), Pair('领域', 'n'), Pair('。', 'w')]
这里的 Pair 是 jieba 内部的一个命名元组(collections.namedtuple),本质上是 (word, flag) 的组合。
2 自定义词典与词性标注
jieba 允许你通过自定义词典来修正分词结果,并且可以同时为自定义的词语指定词性。
自定义词典的格式为:词语 词性 词频(词频可以省略,jieba 会自动调整)。
我们想将 “自然语言处理” 作为一个整体,并指定其词性为名词(n)。
-
创建一个
user_dict.txt文件,内容如下:自然语言处理 n 1000 -
在代码中加载自定义词典,并进行词性标注。
import jieba.posseg as pseg
# 加载自定义词典
jieba.load_userdict("user_dict.txt")
sentence = "自然语言处理是人工智能的重要领域。"
words = pseg.cut(sentence)
for word, flag in words:
print(f"词语: {word:<10} 词性: {flag}")
输出结果:
词语: 自然语言处理 词性: n
词语: 是 词性: v
词语: 人工智能 词性: n
词语: 的 词性: u
词语: 重要 词性: a
词语: 领域 词性: n
词语: 。 词性: w
可以看到,“自然语言处理” 被成功识别为一个独立的名词,而不是被切分成 “自然/b 语言/n 处理/v”。
3 查看词语的词性
如果你想单独查询某个词的词性,可以使用 jieba.posseg.POSTokenizer。
import jieba.posseg as pseg
# 创建一个分词器实例
tokenizer = pseg.POSTokenizer(tokenizer=jieba.dt) # 使用默认分词器
# 查询单个词
words = tokenizer.cut("苹果")
for word, flag in words:
print(f"'{word}' 的词性是: {flag}")
print("-" * 20)
# 查询另一个词
words = tokenizer.cut("苹果")
for word, flag in words:
print(f"'{word}' 的词性是: {flag}")
输出结果:
'苹果' 的词性是: n
--------------------
'苹果' 的词性是: n
(注意:jieba 默认无法区分 “苹果” 作为水果和作为公司名的情况,这需要更复杂的模型或上下文信息。)
- 核心方法:使用
jieba.posseg.cut()。 - 返回值:一个生成器,每次产生一个包含
word和flag的对象。 - 词性代码:需要参考 ICTCLAS 词性标记集。
- 自定义:通过
jieba.load_userdict()可以添加新词并指定其词性,这对于处理专业术语或新词非常重要。 - 应用场景:词性标注是许多高级 NLP 任务的基础,如 命名实体识别、句法分析、情感分析、信息抽取 等,通过识别
ns(地名)和nr(人名),可以轻松地从文本中提取出关键实体。
