文档章节

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

潘少online
 潘少online
发布于 2015/08/23 19:28
字数 1687
阅读 219
收藏 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 Core中文分词组件jieba.NET Core

特点 支持三种分词模式: 支持繁体分词 支持添加自定义词典和自定义词 jieba.NET Core 用法 下载代码使用VS 2017 打开,或者使用VS Code 打开项目。 选择jieba.NET 为起始项目,Program.cs ...

jjjyyy66
2017/05/15
0
0
盘古分词

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

匿名
2010/12/29
35.9K
0

没有更多内容

加载失败,请刷新页面

加载更多

基础编程题目集-7-13 日K蜡烛图

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开...

niithub
21分钟前
0
0
Jenkins window 下的安装使用

1.下载:https://jenkins.io/download/ 双击安装完毕,将自动打开浏览器: http://localhost:8080 打开对应位置的文件,将初始密钥粘贴至输入框。 第一个是 安装默认的软件;第二个是 自定义...

狼王黄师傅
23分钟前
1
0
深入解析react关于事件绑定this的四种方式

这篇文章主要介绍了详解react关于事件绑定this的四种方式,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 在react组件中,每个方...

前端攻城小牛
31分钟前
1
0
JS正则表达式

url的正则表达式:包括IP,域名(domain),ftp,二级域名,域名中的文件,域名加上端口!用户名等等信息 `function` `IsURL(str_url) {``var` `strRegex =``"^((https|http|ftp|rtsp|mm...

前端小攻略
35分钟前
1
0
shell习题_2

find /root/ceshi1/ -type f -name "*.txt"|xargs -i mv {} {}.bak find /root/ceshi1/ -type f -name "*.txt" -exec mv {} {}.bak \; 1、批量修改文件名: n1=`echo $f|sed '#.bak##'` [ro......

芬野de博客
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部