在自然语言处理过程中,进行词性标注是很有必要的一个步骤,词性揭示了一个词的类别,识别每个词的词性可以分析句子的语法和结构,从而为后续的命名实体识别、句法分析、情感分析、信息抽取以及机器翻译等文本分析任务提供必要且有用的信息。相比较英文词性标注,中文词性标注的难度要更大,很多中文词汇有多个词性,并且中文在做词性标注之前必须要对句子进行分词,这大大增加了词性标注的复杂度与难度。
本篇博客主要介绍了词性标注的基本原理与发展过程,然后提供了一些常用的统计机器学习方法或基于规则的方法进行词性标注,希望对读者产生一些启发。
词性标注的基本概念
词性是词的基本语法属性,根据词在句子中的角色与功能,词性可以分为主语、谓语、定语、状语、补语等。不同语言有不同的词性划分体系,汉语中,经常将词分为两大类:实词和虚词,其中虚词包括连词、介词、助词、叹词等,而实词主要包括名词、动词、形容词等。在英语中,词性被划分为10类,包括名词、动词、形容词、副词、连词、介词、叹词、代词和冠词。
词性标注指对句子中的每个词的词性进行标注的过程。通过词性标注可以分析句子的语法规则,短语结构和句子成分之间的关系。
词性标注集由标签与词构成,包含了一些前人标注完成的词集合。常见的词性标注集有PKU(北京大学)词性标注集、863词性标注集、CTB(Chinese Treebank,中文树库)词性标注集等,常见的英语词性标注集有布朗语料库(Brown corpus)的词性标注集、宾州树库(Penn Treebank)的词性标注集等。一个常见词性标注集如下表。
序号 | 符号 | 词性名称 | 示例 | 序号 | 符号 | 词性名称 | 示例 |
---|---|---|---|---|---|---|---|
1 | Ag | 形语素 | 前程似锦 | 23 | nt | 机构团体 | 国防科大 |
2 | a | 形容词 | 美丽 | 24 | nx | 外文字符 | Win11 |
3 | ad | 副形词 | 韶华易逝 | 25 | nz | 其他专名 | 京港澳高速公路 |
4 | an | 名形词 | 外交 | 26 | o | 拟声词 | 哈哈 |
5 | Bg | 区别语素 | 赤橙黄 | 27 | p | 介词 | 为人民服务 |
6 | b | 区别词 | 慢性咽炎 | 28 | q | 量词 | 首次 |
7 | c | 连词 | 支持与帮助 | 29 | Rg | 代语素 | 于斯为盛 |
8 | Dg | 副语素 | 交谈甚欢 | 30 | r | 代词 | 本书 |
9 | d | 副词 | 进一步交流 | 31 | s | 处所词 | 家里的空调 |
10 | e | 叹词 | 啊 | 32 | Tg | 时语素 | 现阶段 |
11 | f | 方位词 | 眼睛里 | 33 | t | 时间词 | 2025年 |
12 | h | 前接成分 | 准新郎 | 34 | u | 助词 | 技术的特点 |
13 | i | 成语 | 义无反顾 | 35 | Vg | 动语素 | 洗了个舒服的澡 |
14 | j | 简称略词 | 科教兴国 | 36 | v | 动词 | 扩大 |
15 | k | 后接成分 | 朋友们 | 37 | vd | 副动词 | 持续升温 |
我们可以使用Python中的NLTK库查看语料库中词性标注结果,代码如下:
import nltk
# nltk.download('brown') # 如果没有下载过布朗语料库需要先进行下载,下载以后即可注释掉
# nltk.download('treebank')
print(nltk.corpus.brown.tagged_words()) # 输出结果:[('The', 'AT'), ('Fulton', 'NP-TL'), ...]
print(nltk.corpus.treebank.tagged_words()) # 输出结果:[('Pierre', 'NNP'), ('Vinken', 'NNP'), (',', ','), ...]
brown_tagged = nltk.corpus.brown.tagged_words() # 获取布朗语料库中的标记
tag_fd = nltk.FreqDist(tag for (word, tag) in brown_tagged) # 统计词性使用频率
print(tag_fd.most_common(10)) # 输出结果:[('NN', 152470), ('IN', 120557), ('AT', 97959), ('JJ', 64028), ...]
基于规则的词性标注方法
词典
在了解到词性的基本概念与常见的词性标注集后,我们现在已经对词性标注的结果有了一个比较清晰的认知,所谓词性标注就是给不同的词打上对应的标签。
基于规则的词性标注方法是最早提出的词性标注方法,其主要根据语言学规则、专业知识和经验手动设计,也可以通过机器学习方法学习到。其基本思想是按兼类词搭配关系和上下文语境来建造词性消歧规则,主要包括词汇信息规则和上下文信息规则两类。
中文基于规则的词性标注方法步骤主要为:
- 构建词典和规则库。利用专家经验构建尽可能完善的词典和规则库,这种方法虽然易于实现,但仍有穷尽,无法覆盖到所有的规则。
- 分词。基于已构建的词典对待标注文本进行分词处理。
- 词典匹配。查词典,匹配待标注文本中各词所有可能的词性标记。
- 规则匹配。应用规则库中的规则进行词性消歧,,逐步删除初始标注结果中的错误标记。
基于上述步骤,我们来使用Python代码认识一下词典。
from nltk.corpus import wordnet as wn # 导入WordNet词典
synsets = wn.synsets('help') # 在词典中查询"love"的所有同义项
posList = [] # 保存词性信息
for synset in synsets: # 获取词
words = synset.lemma_names() # 获取词
for word in words: # 遍历该义项中的所有词
if word == 'help': # 获取并保存"love"的词性
posList.append(synset.pos())
from collections import Counter
print(Counter(posList)) # Counter({'n': 6, 'v': 4})
正则表达式
下面展示一下使用正则表达式进行基于规则的匹配,输出匹配精确度
from nltk.tag.sequential import RegexpTagger
reggexp_tagger = RegexpTagger([
(r'^-?\d+(.\d+)?$', 'CD'), # cardinal numbers(数字)
(r'(The|the|A|a|An|an)$', 'AT'), # articles(冠词)
(r'.*able$', 'JJ'), # adjectives (形容词)
(r'.*(ness)$', 'NN'), # nouns (名词单数形式)
(r'.*ly', 'RB'), # adverbs (副词)
(r'.*(s)$', 'NNS'), # plural nouns (名词复数形式)
(r'.*ing$', 'VBG'), # gerunds (动词的现在分词)
(r'.*ed$', 'VBD'), # past tense verbs (动词的过去式)
(r'.*', 'NN') # nouns (默认为名词)
])
from nltk.corpus import brown
tagged_sents = brown.tagged_sents()
test_data = tagged_sents[0:int(len(tagged_sents) * 0.1)]
print(reggexp_tagger.evaluate(test_data)) # 输出结果,准确率为:0.29721798738603233
基于统计机器学习的词性标注方法
常用的统计机器学习模型包括隐马尔可夫模型、最大熵模型、条件随机场等,基于统计机器学习的词性标注方法利用大规模已标注语料库训练机器学习模型,通过词的统计规律来预测词标签。其基本思想是将词性标注看作一个序列标注问题,即给定一段词预测下一个词的概率。