基于HMM和规则相结合的中文地名识别方法

基于机器学习和规则相结合的中文地名识别方法

命名实体识别是自然语言处理中的一个常见任务,方法也越趋于成熟。本人最近正在做事件抽取相关工作,对于事件中地址元素的识别稍有经验,所以写下本文,以对前面工作做一个总结。

1、词库的整理

中国地名毕竟有限,所以我们选择爬取中国统计局2016年统计用区划代码和城乡划分代码中的地名作为基本地名词库,补充到分词器中。分词器选择Hanlp。
基于HMM和规则相结合的中文地名识别方法
基于HMM和规则相结合的中文地名识别方法
对网页进行整理后,共收录词条大约:995933条
基于HMM和规则相结合的中文地名识别方法

2、地名角色标注

地名角色方法参考自博客实战HMM-Viterbi角色标注地名识别,语料选自新华日报1998年1月份数据。
基于HMM和规则相结合的中文地名识别方法
分别统计初始概率和转移概率如下:
基于HMM和规则相结合的中文地名识别方法
基于HMM和规则相结合的中文地名识别方法
统计完成后,输入“在云南省丽江市古城区随意寻找加害目标”,标注结果为:
[ /Z ,在/A ,云南省/S ,丽江市古城区/S ,随意/B ,寻找/Z ,加害/Z ,目标/Z , /Z]

3、地名规则

本文采用的规则依靠人工归纳,分析语料来自于互动百科数据,数据如下:
基于HMM和规则相结合的中文地名识别方法
语料有5000条描述地址的句子。
假设字串sen=wapwb。其中wa为地名的前缀词语,wb为地名的后缀词语,p为识别到的地名。分别对上述三个类别进行统计,人工统计整理了如下几个集合:
BWord:前缀词语,包括[“位于”,”地处”, “坐落”]等等
PWord:前缀介词,包括[“在”,”至”]等等
AWord:后缀词语,包括[“附近”,”周围”,”路口”,”交叉口”,”交口”]等等
FWord:后缀方位词语,包括[“左侧”,”西侧”,”上面”]等等
SpecWord:地名特征词语,包括[“县”,”市”,”省”]等等
有了上述词语后,我们做了两类规则:正向规则,负向规则。
正向规则:用于判断某个字符串可能存在地名
负向规则:用于判断某个字符串不可能是地名

正向规则包括:
规则1:waϵBWord && wbϵ(AWord||FWord||)
规则2:waϵPWord && wbϵ(AWord||FWord)

负向规则:
规则1:len(p)<maxLength
规则2: p 包含 SpecWord 或者p 包含词性为ns的词语
规则3: p 不包含标点符号

4、实验结果

“洽舍乡,位于黄山南麓,徽州区西北部,属山区库区乡,东与富溪乡交界,南与呈坎乡接壤,西与休宁县毗邻,北与杨村乡相连。辖3个行政村,26个村民组,963户,3500人”
分词结果:
“洽舍乡/ns, ,/w, 位于/v, 黄山南麓/ns, ,/w, 徽州区/ns, 西北部/f, ,/w, 属/v, 山区库区乡/ns, ,/w, 东/f, 与/cc, 富溪乡交界/ns, ,/w, 南/b, 与/cc, 呈坎乡接壤/ns, ,/w, 西/f, 与/cc, 休宁县毗邻/ns, ,/w, 北/f, 与/cc, 杨村乡/ns, 相连/vi, 。/w, 辖/v, 3/m, 个/q, 行政村/n, ,/w, 26/m, 个/q, 村民/n, 组/n, ,/w, 963/m, 户/q, ,/w, 3500/m, 人/n”

句子:
“在丽江市古城区寨后下村XXXX酒店附近殴打被害人王某某,将王某某殴打致轻伤,后又在寨后下村牌坊XXXX店门前殴打无辜群众王某,在*路与金甲路交叉口殴打两名男子,并继续寻找加害目标。”
分词结果:
在/p, 丽江市古城区寨后下村XXXX酒店附近/ns, 殴打/v, 被害人/n, 王/n, 某某/r, ,/w, 将/d, 王/n, 某某/r, 殴打/v, 致/v, 轻伤/n, ,/w, 后/f, 又/d, 在/p, 寨后下村牌坊XXXX店门前/ns, 殴打/v, 无辜/n, 群众/n, 王/n, 某/rz, ,/w, 在/p, *路与金甲路交叉口/ns, 殴打/v, 两/m, 名/q, 男子/n, ,/w, 并/cc, 继续/v, 寻找/v, 加害/v, 目标/n, 。/w