基于规则的方法多采用语言学专家手工构造规则模板,选用特征包括统计信息、标点符号、关键字、指示词和方向词、位置词(如尾字)、中心词等方法,以模式和字符串相匹配为主要手段,这类系统大多依赖于知识库和词典的建立。基于规则和词典的方法是命名实体识别中最早使用的方法,一般而言,当提取的规则能比较精确地反映语言现象时,基于规则的方法性能要优于基于统计的方法。但是这些规则往往依赖于具体语言、领域和文本风格,编制过程耗时且难以涵盖所有的语言现象,特别容易产生错误,系统可移植性不好,对于不同的系统需要语言学专家重新书写规则。基于规则的方法的另外一个缺点是代价太大,存在系统建设周期长、移植性差而且需要建立不同领域知识库作为辅助以提高系统识别能力等问题。
也可在接到本决定书之日起六十日内向中国国家市场监督管理总局或者北京市人民政府申请行政复议,杭州海康威视数字技术股份有限公司
比如对以上句子进行机构名的命名实体识别:中国国家市场监督管理总局
、北京市人民政府
、杭州海康威视数字技术股份有限公司
中国国家市场监督管理总局
、北京市人民政府
的字典,此时没有关于杭州海康威视数字技术股份有限公司
的字典sentence = ‘也可在接到本决定书之日起六十日内向中国国家市场监督管理总局或者北京市人民政府申请行政复议,杭州海康威视数字技术股份有限公司’
org_start = [‘中’, ‘北’]
org_end = [‘局’, ‘府’]
返回结果为 ['中国国家市场监督管理总局', '北京市人民政府']
杭州海康威视数字技术股份有限公司
的字典sentence = ‘也可在接到本决定书之日起六十日内向中国国家市场监督管理总局或者北京市人民政府申请行政复议,杭州海康威视数字技术股份有限公司’
org_start = [‘中’, ‘北’, ‘杭’]
org_end = [‘局’, ‘府’, ‘司’]
返回结果为 ['中国国家市场监督管理总局', '北京市人民政府', '杭州海康威视数字技术股份有限公司']
import re
def getLabel(sentence, loc_name, org_name):
label = []
for i in sentence:
if i in loc_name:
label.append('S')
elif i in org_name:
label.append('E')
else:
label.append('O')
return "".join(label)
def re_ner(sentence, loc_name, org_name):
ne_list = []
label = getLabel(sentence, loc_name, org_name)
pattern = re.compile('SO*E')
ne_label = re.finditer(pattern, label)
for ne in ne_label:
ne_list.append(sentence[int(ne.start()):int(ne.end())])
return ne_list
# 例1
sentence = '也可在接到本决定书之日起六十日内向中国国家市场监督管理总局或者北京市人民政府申请行政复议,杭州海康威视数字技术股份有限公司'
org_start = ['中', '北']
org_end = ['局', '府']
result = re_ner(sentence, org_start, org_end)
# 测试用例,返回结果应为['中国国家市场监督管理总局', '北京市人民政府']
# 例2
org_start = ['中', '北', '杭']
org_end = ['局', '府', '司']
# 测试用例,返回结果应为['中国国家市场监督管理总局', '北京市人民政府', '杭州海康威视数字技术股份有限公司']