跳转至

3.2 基于规则实现NER

基于规则实现NER

学习目标

  • 理解什么是规则派的NER
  • 掌握NER任务常见的规则处理方法.

1 基于规则实现NER的原理

  • 基于规则的方法多采用语言学专家手工构造规则模板, 选用特征包括统计信息, 标点符号, 关键字, 指示词和方向词, 位置词(如尾字), 中心词等方法, 以模式和字符串相匹配为主要手段, 这类系统大多依赖于知识库和词典的建立.
  • 基于规则和词典的方法是命名实体识别中最早使用的方法.
    • 一般而言, 当提取的规则能比较精确地反映语言现象时, 基于规则的方法性能要优于基于统计的方法.
    • 但是这些规则往往依赖于具体语言, 领域和文本风格, 编制过程耗时且难以涵盖所有的语言现象, 特别容易产生错误, 系统可移植性不好, 对于不同的系统需要语言学专家重新书写规则. 基于规则的方法的另外一个缺点是代价太大, 存在系统建设周期长, 移植性差而且需要建立不同领域知识库作为辅助以提高系统识别能力等问题.

2 常见的规则处理方法

  • 工业界常用的规则处理方法:
    • 领域字典匹配
    • 定义正则表达式

3 案例分析

  • 为了更好地理解基于规则的NER方法,我们来看一个具体的例子。假设我们要从一段新闻报道中识别出机构名。首先,我们设计以下规则:
    • 如果一个词语后面紧跟着“公司”、“集团”等词,那么它可能是一个机构名的开始。
    • 如果一个词语后面紧跟着“局”、“部”等词,那么它可能是一个机构名的结束。
  • 然后,我们构建一个包含“公司”、“集团”、“局”、“部”等词的词典。接下来,我们对新闻报道进行序列标注,将词典中的词标记为B或E,其余词语标记为O。最后,我们使用正则表达式“B+OE”从标注序列中抽取出机构名。

  • 代码实现:
import jieba
import jieba.posseg as pseg
import re

org_tag = ['公司', '有限公司', '大学', '政府', '人民政府', '总局']


def extract_org(text):
    # 使用jieba的词性标注进行分词
    words_flags = pseg.lcut(text)
    words, features = [], []
    for word, flag in words_flags:
        words.append(word)
        if word in org_tag:
            features.append('E')
        else:
            if flag in ['ns']:  # 地名关键词,利用jieba的词性标注,'ns'代表地名
                features.append('S')
            else:
                features.append('O')
    labels = ''.join(features)
    pattern = re.compile('S+O*E+')
    match_label = re.finditer(pattern, labels)
    match_list = []
    for ne in match_label:
        match_list.append(''.join(words[int(ne.start()):int(ne.end())]))
    return match_list


text = "可在接到本决定书之日起六十日内向中国国家市场监督管理总局申请行政复议,杭州海康威视数字技术股份有限公司."

print(extract_org(text))
##result: ['中国国家市场监督管理总局', '杭州海康威视数字技术股份有限公司']


小节总结

本小节主要介绍了基于规则实现NER的原理及过程,注意,未来如何将规则的方法与模型的方法相结合,发挥各自的优势,是一个值得探索的方向。