文档章节

搜索引擎之未登录词(Out Of Vocabulary)识别问题

潘少online
 潘少online
发布于 2015/08/23 19:28
字数 1687
阅读 165
收藏 2

有人问道:南京市长叫江大桥?

你怎么知道的?

因为看到一个标语——南京市长江大桥欢迎您。


未登录词识别问题也叫做:命名实体识别(Named Entity Recognition)

    常见的未登录词包括:

  • 人名:张三、陈方安生

  • 地名:安湖路、龙腾苑四区

  • 机构名:泰康人寿、欧姆龙公司

  • 译名:安德森

组块识别(Chunking)

切分和标注多个词的单元

每个大的单元叫做组块(chunk)


用模式识别未登录词

例如“高东镇高东二路”,需要把“高东二路”这样不在词典中的路名识别出来。可以先把输入串抽象成待识别的标注序列,然后根据词类识别。例如:


利用模式来识别未登录街道名,识别规则可以表示成如下的形式:

镇后缀 未登录街道  =>镇后缀  UNKNOW  号码  街后缀


识别规则(Product)

lhs = new ArrayList<AddressSpan>(); //左边的模式
rhs = new ArrayList<AddressType>(); //右边的模式
//镇后缀  UNKNOW  号码  街后缀
rhs.add(AddressType.SuffixTown);
rhs.add(AddressType.Unknow);
rhs.add(AddressType.No);
rhs.add(AddressType.SuffixStreet);
//镇后缀 未登录街道
lhs.add(new AddressSpan(1,AddressType.SuffixTown));//归约长度是1
//把“UNKNOW  号码  街后缀”3个符号替换成“未登录街道”,因此归约长度是3
lhs.add(new AddressSpan(3,AddressType.Street));
//把规则加到文法库
addProduct(rhs, lhs);


模式文法(Pattern Grammar)

  • 文法(Grammar)是规则的集合,规则的形式:

    • leftPattern => rightPattern

  • 模式(Pattern)

    • 描述单词的行为

    • 用类型序列来描述模式:SuffixTown Street

    • 词汇化(lexical)的模式:V for n: 动词后接‘for’然后接一个名词



模式文法识别未登录词

  1. 定义特征的类别:例如未登录词的上文,下文等。

  2. 根据特征词库对输入串做全切分:可以采用AdjList存储切分结果。

  3. 匹配规则来识别未登录词:可以把右边的模式组织成Trie树,左边的模式作为节点属性。全切分词图匹配上右边的模式后用左边的模式替换。


循环替换导致死锁

  • 规则替换可能会进入死循环,因为可能出现重复应用规则的情况

      • A ->B ->A

  • 通过检查每条规则来解决死锁问题

      • 每个模式赋一个权重 ,用模式中的类型序列的权重和来衡量模式权重例如:

        • SuffixTown + Unknow + No +SuffixStreet =   6 + 8+ 5 + 7 = 26

        • SuffixTown + Street = 6 + 4 = 10

      • 规则的左边的模式权重必须小于右边模式权重

      • 应用这样的规则后整个文本的模式权重越来越小



从词图中匹配识别规则

根据基本词典生成的全切分词图

根据人名特征词图生成的人名全切分词图

根据译名特征词图生成的译名全切分词图

根据地名特征词图生成的地名全切分词图

根据机构名特征词图生成的机构名全切分词图



识别人名

  • 人名特征:

      • 单姓:赵 钱 孙 李

      • 复姓:诸葛 欧阳

      • 单名:刚 强 进 选 达

      • 双名首字:建 建 治

      • 双名尾字:军 红 国

      • 日本姓:小泽 松下

      • 日本名:田一郎 森三郎

      • 译名用字:汤 姆 森 杰 克 妮

      • 上文:邀请 约

      • 下文:同学 老师

      • 连接:和


根据音调判断是否人名

中文起名会考虑到语音的因素。例如:

Yang2 yang2

杨        阳

都是第二声。简称:22

可以统计中文人名的声调组合:

11=394

111=252

112=393

113=101

114=178

12=396

121=344

122=344

123=82


识别地名

地名相关的特征类型:

public enum AddressType {
Country //国家
,Municipality //直辖市
,SuffixMunicipality //特别行政区后缀
,Province //省
,City //市
,County //区
,Town //镇
,Street //街
,StreetNo //街门牌号
,No //编号
,Symbol //字母符号
,LandMark //地标建筑 例如 ** 大厦  门牌设施
,RelatedPos //相对位置
,Crossing //交叉路
,Village //村
,BuildingNo //楼号
,BuildingUnit //楼单元
,SuffixBuildingUnit //楼单元后缀
,SuffixBuildingNo //楼号后缀
,StartSuffix//(
,EndSuffix//)
,Unknow
…
}

识别译名

  • 译名举例

        费德勒 辛德勒 柴可夫斯基 卡钦斯基

  • 统计译名用字,然后根据65万译名统计字之间的转移概率,例如”汤姆”、“珍妮”

                P(C1C2…Cn)=P(C1) P(C2|C1)…P(Cn|C1C2…Cn-1)

                                  ≈P(C1) P(C2|C1)…P(Cn|Cn-1)



识别机构名


未登录词概率估计


P(某个未登录词的概率)=

P(这类未登录词的概率)*P(这类未登录词中某个词的概率)


在人名代词附近有更高的人名概率


    杨士春表示,考虑到两人的特殊身份,谭维维和王铮亮并不担任日常的教学工作,他们的工作主要包括:...。



新词发现

有研究显示,60%的分词错误是由新词导致的。

  • 旧词新意:通过各种途径产生的、具有基本词汇所没有的新形式、新意义或新用法的词语。

  • 全新词语:自某一时间点以来所首次出现的具有新词形的词汇。如果在一篇文档中“水”和“立方”结合紧密,则有“水立方”可能是一个新词。


因此对分词后的词序列建立二元统计模型。结合紧密的二元连接可能是新词。


基于统计的新词发现

判断二元连接词结合紧密程度的公式:

如果词x和y的出现相互独立,则P(x,y)的值和p(x)p(y)的值相等,I(x,y)为0。如果x和y密切相关,P (x,y)将比P (x) P (y)大很多,I(x,y)值也就远大于0。如果x和y的几乎不会相邻出现,而它们各自出现的概率又比较大,那么I(x,y)将取负值,这时候x和y负相关。设f(C)是词C出现的次数,N是一个文档的总词数,则:

因此,两个词的信息熵:


新词发现实现

定义二元连接串:

public class Bigram {
  String one;//上一个词
  String two;//下一个词
  private int hashvalue = 0;
  
   Bigram(String first, String second) {
   this.one = first;
   this.two = second;
   this.hashvalue = (one.hashCode() ^ two.hashCode());
   }
}

int index = 0;
fullResults = new BigramsCounts[table.size()];
Bigrams key;
int freq;//频率
double logn = Math.log((double)n)/Math.log(2.0); //文档的总词数取对数
double temp;
double entropy;//信息熵
int bigramCount; //f(c1,c2)
for( Entry<Bigrams,int[]> e : table.entrySet()){//计算每个二元连接串的信息熵
  key = e.getKey();
  freq1 = oneFreq.get(key.one).freq;
  freq2 = oneFreq.get(key.two).freq;
  temp = Math.log((double)freq1)/Math.log(2.0) + Math.log((double)freq2)/Math.log(2.0);
  bigramCount = (e.getValue())[0];
  entropy = logn+Math.log((double)bigramCount)/Math.log(2.0) - temp;//信息熵
  fullResults[index++] = 
  new BigramsCounts(
  bigramCount,
  entropy,
  key.one,
  key.two);
}


  • 基于规则的方法:

      • 具有普遍意义的构词规则,例如“模仿秀”由“动词+名词”组成。

  • 去除规则,符合去除规则的二元连接不算作新词:

      • 例如“数词+量词”的组合。


© 著作权归作者所有

共有 人打赏支持
潘少online
粉丝 11
博文 58
码字总数 107019
作品 2
深圳
程序员
jieba中文分词源码分析(一)

一、缘由 接触自然语言处理(NLP)有段时间,理论知识有些了解,挺想动手写些东西,想想开源界关于NLP的东西肯定不少,其中分词是NLP的基础,遂在网上找了些资源,其中结巴分词是国内程序员用p...

gfsfg8545
2015/09/03
0
0
jieba 源码解析

阅读动机 jieba分词是Python 里面几个比较流行的中文分词工具之一。为了理解分词工具的工作原理,以及实现细节对jieba进行了详细的阅读。 读代码之前,我有几个问题是这样的: 分词工具的实现...

正_午
2016/09/27
106
0
jieba中文分词源码分析(四)

一、未登录词问题 在jieba中文分词的第一节曾提到未登录词问题 中文分词的难点 因此可以看到,未登录词是分词中的一个重要问题,jieba分词中对于OOV的解决方法是:采用了基于汉字成词能力的 ...

gfsfg8545
2015/09/06
0
0
盘古分词

盘古分词是一个基于 .net framework 的中英文分词组件。主要功能 中文未登录词识别 盘古分词可以对一些不在字典中的未登录词自动识别 词频优先 盘古分词可以根据词频来解决分词的歧义问题 多...

匿名
2010/12/29
35.9K
0
NLPIR语义分词技术给自然语言处理带来新驱动

  随着信息的快速速增长,让搜索引擎成了人们查找信息的首要工具。如今在中文搜索引擎领域,国内搜索引擎已经同国外搜索引擎效果上相差不大了。能形成现在这样的局面,是有一个重要的原因:...

ljrj123
06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Apache 流框架 Flink,Spark Streaming,Storm对比分析

1.Flink架构及特性分析 Flink是个相当早的项目,开始于2008年,但只在最近才得到注意。Flink是原生的流处理系统,提供high level的API。Flink也提供 API来像Spark一样进行批处理,但两者处理...

hblt-j
4分钟前
0
0
Dubbo/HSF在Service Mesh下的思考和方案

开头 Service Mesh这个“热”词是2016年9月被“造”出来,而今年2018年更是被称为service Mesh的关键之年,各家大公司都希望能在这个思潮下领先一步。今天我也分享阿里中间件在这方面的观点,...

Mr_zebra
5分钟前
0
0
用命令卸载Win8 IE9/IE10/IE11浏览器

首先打开,开始---运行-----框里输入cmd,进入命令提示框,将下面的命令复制粘贴到命令框里,然后按下Enter键执行。 执行完命令,必须重启电脑。 卸载IE9的命令: FORFILES /P %WINDIR%\ser...

JackFace
6分钟前
0
0
2018年产品设计协作领域最强黑马居然是它?

我发了一条朋友圈“感谢池子的秘密法宝,我今天终于吃上了女朋友做的晚饭了”并配上香香的绿豆汤,瞬间获得好几十条评论。 “同为设计师,为啥你会这么早回家?” “快扶我起来,我还能画两个...

mo311
7分钟前
0
0
linux安装jdk1.8(rpm方式)

1:下载JDK的URL地址,例如:http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm。这个地址可以去Orcale的官网找到。通过w......

苏牧影子
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部