词性标注与命名实体识别:让机器读懂文本的「骨架」与「血肉」

大家好,欢迎来到第四章。今天咱们聊聊词性标注和命名实体识别。这两个东西,说白了就是让机器理解文本的「骨架」和「血肉」。

我刚开始做文本挖掘那会儿,总觉得分词就够用了。后来发现,光分词就像只认识汉字不认识语法——你分出了「苹果」「好吃」,但不知道「苹果」是主语还是宾语,也不知道「好吃」是形容词还是动词。嗯,这时候词性标注就派上用场了。

词性标注的意义:为什么我们需要它?

词性标注,就是给每个词打上标签——名词、动词、形容词、副词等等。你想想看,这有什么用?

  • 消歧义:比如「领导」这个词,可以是名词(我们的领导),也可以是动词(领导团队)。词性标注能帮我们区分。
  • 特征工程:在情感分析中,形容词往往比名词更能体现情感倾向。比如「这个产品真烂」——「烂」是形容词,直接表达了负面情绪。
  • 语法结构分析:做句法分析、信息抽取时,词性是基础。没有词性,你连主谓宾都分不清。

重要提醒:词性标注不是万能的,但它是很多高级任务的「地基」。地基不稳,上层建筑再漂亮也白搭。

我在项目中遇到过一件事:做舆情监控时,我们想提取「某公司收购某公司」这类事件。如果没有词性标注,你可能会把「收购」当成普通动词,而忽略了它作为事件触发词的重要性。后来我们加上了词性特征,准确率直接提升了15%。

jieba词性标注:上手最快的中文工具

说到中文词性标注,jieba 绝对是绕不开的。它内置了北大词性标注集,支持自定义词典,而且速度飞快。

怎么用?看代码:

import jieba
import jieba.posseg as pseg

# 一句话搞定词性标注
words = pseg.cut("我爱北京天安门")
for word, flag in words:
    print(f'{word} {flag}')

# 输出:
# 我 r
# 爱 v
# 北京 ns
# 天安门 ns

看到没?「我」是代词(r),「爱」是动词(v),「北京」和「天安门」都是地名(ns)。

这里有个小技巧:如果你做的是特定领域的文本分析,比如金融、医疗,建议加载自定义词典。我做过一个金融项目,里面全是「量化宽松」「逆回购」这类词。不加词典的话,jieba 会把它们拆得七零八落,词性标注自然也就错了。

个人习惯:我一般会先跑一遍分词,看看效果。如果发现专有名词被切碎了,就赶紧加词典。别等到模型训练完了才发现,那可就晚了。

jieba 的词性标注集挺全的,我列几个常用的:

标签 含义 示例
n 名词 苹果、电脑
v 动词 跑、吃、学习
a 形容词 好、漂亮、快
ns 地名 北京、上海
nr 人名 张三、李四
nt 机构名 清华大学、阿里巴巴

你可能会问:为什么「北京」是 ns 而不是 n?因为 jieba 把地名单独分了一类。这样做的好处是,在做命名实体识别时,可以直接用这些标签来提取实体。

命名实体识别:人名、地名、机构名

命名实体识别(NER),说白了就是从文本中找出「谁」「在哪」「什么组织」。这是信息抽取的核心任务之一。

我举个例子:

text = "马云在杭州的阿里巴巴总部发表了演讲"
# 期望结果:
# 人名:马云
# 地名:杭州
# 机构名:阿里巴巴

为什么要做 NER?因为很多下游任务都依赖它:

  • 知识图谱构建:实体是图谱的节点,关系是边。没有实体,图谱就是空的。
  • 情感分析:分析「华为的手机不错」和「小米的手机不错」,虽然都是正面评价,但评价对象不同。NER 能帮你区分。
  • 事件抽取:比如「苹果发布了新款iPhone」——「苹果」是机构名,「iPhone」是产品名。

避坑指南:我曾经在做一个新闻舆情项目时,发现「小米」被识别成了地名(因为有个地方叫小米)。后来我加了一个规则:如果「小米」后面跟着「公司」「集团」「发布」等词,就优先识别为机构名。嗯,规则虽然笨,但有时候比模型管用。

用 jieba 做 NER 其实很简单,因为它已经内置了人名、地名、机构名的标签:

import jieba.posseg as pseg

text = "李华毕业于北京大学,现在在深圳工作"
words = pseg.cut(text)
for word, flag in words:
    if flag in ['nr', 'ns', 'nt']:
        print(f'{word}: {flag}')

# 输出:
# 李华: nr
# 北京大学: nt
# 深圳: ns

看到没?「李华」是人名(nr),「北京大学」是机构名(nt),「深圳」是地名(ns)。

不过,jieba 的 NER 能力有限。它主要依赖词典和规则,对于「马云」这种常见人名没问题,但遇到「王小明」这种稍微生僻一点的,可能就识别不出来了。这时候怎么办?

我建议:如果项目对 NER 要求高,可以考虑用深度学习模型,比如 BERT + CRF。但如果你只是做快速原型验证,jieba 完全够用。

实战小技巧:如何提升词性标注和 NER 的效果?

嗯,这里分享几个我踩过的坑:

  1. 自定义词典是必须的:尤其是专业领域。我做过一个医疗项目,里面全是「阿莫西林」「布洛芬」这类药名。不加词典的话,jieba 会把它们拆成「阿莫」「西林」——这谁看得懂?
  2. 注意歧义:比如「长春」可以是地名(长春市),也可以是花名(长春花)。这时候需要结合上下文来判断。如果上下文有「市」「省」「区」,大概率是地名。
  3. 后处理很重要:有时候 jieba 会把「北京大学」拆成「北京」和「大学」,分别标注为 ns 和 n。这时候你需要写一个合并规则:如果「北京」后面跟着「大学」,就合并成「北京大学」,标注为 nt。
  4. 不要迷信准确率:词性标注和 NER 的准确率很难达到 100%。我一般会接受 90% 左右的准确率,剩下的 10% 用规则或人工修正。

总结一下:词性标注是文本的「骨架」,命名实体识别是文本的「血肉」。两者结合,才能让机器真正理解文本的结构和内容。别嫌它们基础,基础的东西往往最有用。

好了,这一章就到这里。下一章我们会聊聊情感分析的核心技术——情感词典与机器学习方法。到时候见!