中文分词、词性标注与词表示
本文介绍了中文NLP中的三大基础任务:分词、词性标注和词表示。在分词方面,详细讲解了精确模式、全模式和搜索引擎模式三种方法及其适用场景;在词性标注方面,强调了其在信息抽取和特征工程中的重要性;在词表示方面,对比了One-Hot向量和分布式/上下文向量的优缺点。文中提供了可运行的代码示例,并给出了工程实践建议:维护领域词典、繁简转换预处理、词性特征工程等。最后指出,扎实的基础处理是构建高质量NLP系
NLP 入门:中文分词、词性标注与词表示
在中文自然语言处理中,分词、词性标注和词表示是构建任何上层任务(分类、检索、生成)的地基。地基打得稳,后续系统才会稳、准、快。本文从工程视角总结最常用、最有效的做法,并给出可运行的示例代码片段,帮助你快速建立可复用的实践套路。
一、中文分词的三把刀:精确、全切、搜索
- 精确模式:追求语义边界,适合分析与建模
- 全模式:高召回、低精度,适合词典扩充、正则匹配前置
- 搜索引擎模式:在精确基础上二次切分长词,适合倒排索引和检索匹配
import jieba
# 精确模式: 将文本尽可能按照语义切分,默认的模式
def dm01_jieba():
content = '传智教育是一家上市公司,旗下有黑马程序员品牌,我是在黑马这里学习人工智能'
result = jieba.cut(content,cut_all=False)
result = list(result)
print("result-->",result)
result1 = jieba.lcut(content,cut_all = False)
print("result1-->",result1)
# 搜索引擎模式:在精确模式的基础上,对长单词进行再次切割
def dm03_jieba():
content = '传智教育是一家上市公司,旗下有黑马程序员品牌,我是在黑马这里学习人工智能'
result = jieba.cut_for_search(content)
print("result-->",list(result))
result1 = jieba.lcut_for_search(content)
print("result1-->",result1)
实践建议:
- 文本分析/建模:优先精确模式
- 规则预处理、词典扩充:全模式
- 检索匹配/召回:搜索引擎模式
二、处理“域”与“字”:繁体支持与用户词典
中文任务最容易被“领域词”和“书写变体”绊倒。稳定性的关键是两件事:繁体处理与用户词典。
# todo 2.支持中文繁体分词
def dm04_complex_chinese():
content = '煩惱即菩提,我暫且不提'
result = jieba.lcut(content)
print("result-->",result)
# todo 3.支持用户自定义词典
def dm05_user_dict():
content = "传智教育是一家上市公司,旗下有黑马程序员品牌.我是在黑马这里学习人工智能"
result = jieba.lcut(content)
print("result-->",result)
# 使用用户自定义词典
jieba.load_userdict('./data/user_dict.txt')
result1 = jieba.lcut(content,cut_all=False)
print("result1-->",result1)
值得坚持的工程纪律:
- 为领域项目维护独立的
user_dict.txt,把机构名/产品名/缩写统一沉淀 - 预处理链路中尽早做繁简转换(如“煩惱/烦恼”),减少下游分歧
- 回流线上未识别的新词至词典,形成数据闭环
三、词性标注:从“词”到“角色”
分词告诉你“切成了什么”,词性告诉你“它扮演什么”。当你做信息抽取、规则过滤或高精特征工程时,词性常常是决定性信号。
import jieba.posseg as pseg
word=("我爱北京天安门,关公面前耍大刀,蠢")
def dm01_pseg():
content = word
result = pseg.lcut(content)
print("result-->",result)
# pseg分词后的结果是一个pair对,由(单词,词性)组成,比如('我','r')
实战用法:
- 仅保留名词/动词构建关键词图
- 过滤语气词/叹词/语气助词,提升主题纯度
- 结合规则抽取实体三元组(主语-谓语-宾语)
四、One-Hot 词向量:最朴素的确定性表征
One-Hot 向量是最“可控”的词表示:可解释、确定性强、实现简单。它在工程上依然有价值,尤其适合:
- 简单规则/打分器的离散特征
- 小规模、多分类且对可解释性敏感的场景
- 早期管道验证与对齐(Debug 维度错乱等问题)
# one-hot词向量表示
def dm01_one_hot():
vocabs = {"周杰伦", "陈奕迅", "王力宏", "李宗盛", "吴亦凡", "鹿晗"}
my_tokenizer = Tokenizer()
my_tokenizer.fit_on_texts(vocabs)
# print('index_word-->', my_tokenizer.index_word)
print("word_index-->", my_tokenizer.word_index)
# 对vocab进行one-hot表示
for vocab in vocabs:
zero_list = [0] * len(vocabs)
idx = my_tokenizer.word_index[vocab]
zero_list[idx - 1] = 1
print("vocab-->", vocab, "zero_list-->", zero_list)
# 保存tokenizer
joblib.dump(my_tokenizer, './data/my_tokenizer')
# 加载保存好的tokenizer
def dm02_one_hot():
vocabs = {"周杰伦", "陈奕迅", "王力宏", "李宗盛", "吴亦凡", "鹿晗"}
my_tokenizer = joblib.load('./data/my_tokenizer')
print("word_index-->", my_tokenizer.word_index)
print("index_word-->", my_tokenizer.index_word)
zero_list = [0] * len(vocabs)
idx = my_tokenizer.word_index['周杰伦'] - 1
zero_list[idx] = 1
print("zero_list-->", zero_list)
理性认识:
- 优点:明确、可视、稳定;非常适合单元测试和端到端调试
- 缺点:高维稀疏、无语义相似度,难以泛化
五、何时升级到分布式/上下文词向量
当你的系统遇到以下瓶颈时,考虑升级词表示:
- 需要语义相似召回(“程序员”≈“开发者”)
- 需要跨表述泛化(同义替换、词序变化)
- 同形异义和上下文化显著(如“苹果”是水果还是公司)
演进路径:
- 静态向量:Word2Vec/GloVe,成本低、效果稳
- 上下文向量:BERT/ERNIE 等 Transformer,迁移性更强,覆盖复杂语境
六、可落地的实践清单(Checklist)
- 分词策略与场景对齐:精确/全切/搜索各就其位
- 领域词典常备常新:规范书写、双向回流
- 预处理优先做繁简统一与去噪
- 词性标注参与特征工程与规则抽取
- One-Hot 保持在工具箱:做 Debug、做对齐、做可解释基线
- 在“相似性与泛化”出现瓶颈时,果断升级到分布式/上下文向量
结语
优秀的中文 NLP 系统不是从“大模型”开始,而是从“坚实的地基”开始。把分词、词性与词表示这些基础打扎实,你会发现上层的分类、检索、生成任务都变得干净、清晰、可控。工程的秘诀在于:用最合适的刀,切最关键的问题。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)