杰瑞科技汇

Python jieba如何进行词性标注?

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

Python jieba如何进行词性标注?-图1
(图片来源网络,侵删)

准备工作:安装 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}")

输出结果:

Python jieba如何进行词性标注?-图2
(图片来源网络,侵删)
词语: 我     词性: 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')]

这里的 Pairjieba 内部的一个命名元组(collections.namedtuple),本质上是 (word, flag) 的组合。

2 自定义词典与词性标注

jieba 允许你通过自定义词典来修正分词结果,并且可以同时为自定义的词语指定词性。

自定义词典的格式为:词语 词性 词频(词频可以省略,jieba 会自动调整)。

我们想将 “自然语言处理” 作为一个整体,并指定其词性为名词(n)。

  1. 创建一个 user_dict.txt 文件,内容如下:

    自然语言处理 n 1000
  2. 在代码中加载自定义词典,并进行词性标注。

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()
  • 返回值:一个生成器,每次产生一个包含 wordflag 的对象。
  • 词性代码:需要参考 ICTCLAS 词性标记集。
  • 自定义:通过 jieba.load_userdict() 可以添加新词并指定其词性,这对于处理专业术语或新词非常重要。
  • 应用场景:词性标注是许多高级 NLP 任务的基础,如 命名实体识别句法分析情感分析信息抽取 等,通过识别 ns(地名)和 nr(人名),可以轻松地从文本中提取出关键实体。
分享:
扫描分享到社交APP
上一篇
下一篇