阶段1
|
NLP传统 · 第3课/共30课
📖 第03课:词性标注
🎯 课程目标
词性标注(POS Tagging)为每个词打上语法类别标签,是句法分析、信息抽取等下游任务的基础。
- 理解词性标注的定义与意义
- 掌握jieba词性标注的使用方法
- 了解词性消歧的挑战
- 学会利用词性信息进行文本分析
📐 核心原理
词性标注的数学本质
给定词序列 W = w₁w₂...wₙ,求最优标签序列 T = t₁t₂...tₙ:
T* = argmax P(T|W) = argmax P(W|T)·P(T)
💡 HMM视角:词性标注本质是一个序列标注问题,可用隐马尔可夫模型建模——隐状态是词性,观测是词本身。Viterbi算法寻找最优标签序列。
🔬 词性标注实战
jieba词性标注
import jieba.posseg as pseg
text = "小明在北京大学学习自然语言处理"
words = pseg.cut(text)
print("=== 基本词性标注 ===")
for word, flag in words:
print(f" {word:10s} -> {flag}")
tags = {'n': '名词', 'nr': '人名', 'ns': '地名', 'nt': '机构名', 'nz': '其他专名', 'v': '动词', 'vn': '名动词', 'a': '形容词', 'd': '副词', 'm': '数词', 'q': '量词', 'r': '代词'}
print("\n=== 词性标签速查 ===")
for tag, desc in list(tags.items())[:8]:
print(f" {tag:4s} = {desc}")
article = "腾讯公司在深圳成立了人工智能实验室"
words = list(pseg.cut(article))
nouns = [w.word for w in words if w.flag.startswith('n')]
verbs = [w.word for w in words if w.flag.startswith('v')]
print(f"\n原文: {article}")
print(f"名词: {nouns}")
print(f"动词: {verbs}")
=== 基本词性标注 ===
小明 -> nr
在 -> p
北京大学 -> nt
学习 -> v
自然语言 -> l
处理 -> v
=== 词性标签速查 ===
n = 名词
nr = 人名
ns = 地名
nt = 机构名
nz = 其他专名
v = 动词
vn = 名动词
a = 形容词
原文: 腾讯公司在深圳成立了人工智能实验室
名词: ['腾讯', '公司', '深圳', '人工智能', '实验室']
动词: ['成立']
✅ 验证通过:代码实机运行结果如上
🔧 词性分析与消歧
词性分布统计与消歧
import jieba.posseg as pseg
from collections import Counter
text = "人工智能技术的快速发展推动了自然语言处理领域的进步。深度学习模型在文本分类情感分析机器翻译等任务上取得了显著的成果。"
words = list(pseg.cut(text))
pos_counter = Counter(w.flag for w in words if w.flag != 'w')
tag_map = {'n':'名词','v':'动词','a':'形容词','d':'副词','p':'介词','u':'助词','nr':'人名','ns':'地名','vn':'名动词','eng':'英文'}
print("=== 词性分布 ===")
for pos, count in pos_counter.most_common():
print(f" {pos:4s}({tag_map.get(pos, '其他'):3s}): {count}次")
noun_phrases = []
current_phrase = []
for w in words:
if w.flag.startswith('n') or w.flag == 'eng':
current_phrase.append(w.word)
else:
if len(current_phrase) >= 2:
noun_phrases.append(''.join(current_phrase))
current_phrase = []
if len(current_phrase) >= 2:
noun_phrases.append(''.join(current_phrase))
print(f"\n=== 提取的名词短语 ===")
for np in noun_phrases:
print(f" {np}")
ambiguous = ["我要学习", "学习使人进步", "他在银行工作", "沿着河岸走"]
print("\n=== 词性消歧 ===")
for sent in ambiguous:
words = list(pseg.cut(sent))
pos_seq = [(w.word, w.flag) for w in words]
print(f" {sent} -> {pos_seq}")
=== 词性分布 ===
n (名词 ): 9次
v (动词 ): 4次
uj (其他 ): 3次
d (副词 ): 2次
vn (名动词): 2次
ul (其他 ): 2次
l (其他 ): 2次
x (其他 ): 2次
ns (地名 ): 1次
p (介词 ): 1次
u (助词 ): 1次
f (其他 ): 1次
a (形容词): 1次
=== 提取的名词短语 ===
人工智能技术
文本分类情感
=== 词性消歧 ===
我要学习 -> [('我', 'r'), ('要', 'v'), ('学习', 'v')]
学习使人进步 -> [('学习', 'v'), ('使', 'v'), ('人', 'n'), ('进步', 'd')]
他在银行工作 -> [('他', 'r'), ('在', 'p'), ('银行', 'n'), ('工作', 'vn')]
沿着河岸走 -> [('沿着', 'p'), ('河岸', 's'), ('走', 'v')]
✅ 验证通过:代码实机运行结果如上
📝 练习
动手练习
- 对一段新闻文本进行词性标注,统计名词、动词、形容词的占比
- 实现一个基于规则的简单词性标注器,与jieba结果对比
- 收集10个词性歧义的句子,分析标注器是否正确消歧
🏷️
🏆 成就解锁:词性侦探
掌握了词性标注技术,能够从文本中提取语法结构信息。
🧪 扩展:Penn Treebank与中文词性体系
英文Penn Treebank标签
Penn Treebank定义了36种词性标签,是英文NLP的标准。常见的有:
- NN(名词)、NNS(复数名词)、NNP(专有名词)
- VB(动词原形)、VBD(过去式)、VBG(现在分词)
- JJ(形容词)、RB(副词)、IN(介词)
中文词性标注集
中文常用ICTPOS/Jieba标注集,约40+种标签:
- 名词细分为:n(普通名词)、nr(人名)、ns(地名)、nt(机构名)、nz(其他专名)
- 动词细分为:v(普通动词)、vd(副动词)、vn(名动词)
词性标注的下游应用
- 信息抽取:只提取名词短语作为候选实体
- 句法分析:词性是依存分析的基础特征
- 机器翻译:词性帮助确定翻译的词序
- 搜索引擎:名词更可能是查询意图
📚 扩展阅读:词性标注的深度学习方法
从HMM到BiLSTM
词性标注的方法演进:
- HMM:假设马尔可夫性和观测独立,简单但受限
- CRF:判别模型,可以融入任意特征,效果显著提升
- BiLSTM:自动学习特征,双向捕获上下文,端到端训练
- BiLSTM-CRF:在BiLSTM输出上加CRF层,保证标签序列合法性
- BERT:预训练+微调,当前SOTA
词性标注的歧义类型
- 词汇歧义:同一词不同词性,如"学习"(动词/名词)
- 结构歧义:同一句子不同句法分析,如"进口汽车"
- 语义歧义:同一词性不同语义,如"打"(打球/打电话/打车)
消歧需要上下文信息——这也是为什么BiLSTM比HMM效果好:它能看到整个句子的上下文。
🔬 扩展实践:词性标注的完整Pipeline
工业级词性标注Pipeline
- 预处理:分句、分词、去噪声
- 特征提取:词本身、前缀/后缀、词性n-gram、词形特征
- 模型选择:CRF/BiLSTM-CRF/BERT
- 后处理:规则修正(如"的"后接动词→可能标错)
- 评估与迭代:标注一致性检查 + 错误分析
词性标注的错误模式
常见标注错误类型:
- 动名歧义:"学习"在"我学习NLP"中是动词,在"NLP的学习"中是名词
- 形名歧义:"科学"在"科学方法"中是形容词,在"一门科学"中是名词
- 介动歧义:"在"在"在家里"中介词,在"他在学习"中是动词
消歧需要至少看前后2-3个词的上下文,这超出了HMM的一阶马尔可夫假设能力。
🧪 扩展:词性标注的完整Pipeline
工业级词性标注Pipeline
- 预处理:分句、分词、去噪声
- 特征提取:词本身、前缀/后缀、词性n-gram、词形特征
- 模型选择:CRF/BiLSTM-CRF/BERT
- 后处理:规则修正(如"的"后接动词→可能标错)
- 评估与迭代:标注一致性检查 + 错误分析
词性标注的错误模式
常见标注错误类型:
- 动名歧义:"学习"在"我学习NLP"中是动词,在"NLP的学习"中是名词
- 形名歧义:"科学"在"科学方法"中是形容词,在"一门科学"中是名词
- 介动歧义:"在"在"在家里"中介词,在"他在学习"中是动词
Penn Treebank与中文标注体系对比
| 英文(PTB) | 中文(ICTPOS) | 说明 |
| NN/NNS/NNP | n/nr/ns/nt/nz | 中文名词分类更细 |
| VB/VBD/VBG | v/vd/vn | 中文按功能分副动词/名动词 |
| JJ | a/ad | 中文区分形容词和副形词 |
| - | u | 中文特有的助词类 |
📚 参考文献
推荐阅读
- Jurafsky & Martin. Speech and Language Processing (3rd ed). 第3课相关章节
- Manning, Raghavan & Schutze. Introduction to Information Retrieval
- Goodfellow, Bengio & Courville. Deep Learning. 自然语言处理章节
在线资源
- NLTK文档: https://www.nltk.org/
- spaCy文档: https://spacy.io/
- gensim文档: https://radimrehurek.com/gensim/
- sklearn文本处理: https://scikit-learn.org/stable/modules/feature_extraction.html
词性标注 - 关键概念速查
| 概念 | 定义 | 应用 |
| Pipeline | 处理流水线,各步骤串行执行 | 文本处理系统 |
| Tokenization | 将文本切分为词/子词单元 | 分词、子词分割 |
| Embedding | 将离散符号映射到连续向量空间 | 词向量、句向量 |
| Feature Engineering | 从原始数据提取有效数值特征 | 传统ML模型输入 |
| Fine-tuning | 在预训练模型基础上微调 | BERT等模型适配 |
本课要点回顾
- 词性标注是NLP技术栈的重要组件
- 理解原理比调用API更重要——知道为什么比知道怎么做更有价值
- 代码验证是学习的好方法——动手跑一遍胜过读十遍
- 从简单方法开始,逐步过渡到复杂方法——简单方法的基线作用不可替代
- 实践出真知——用自己的数据跑一遍,发现课本上没写的问题