文档章节

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

潘少online
 潘少online
发布于 2015/08/23 19:28
字数 1687
阅读 108
收藏 2
点赞 1
评论 0

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

你怎么知道的?

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


未登录词识别问题也叫做:命名实体识别(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
粉丝 9
博文 54
码字总数 94074
作品 0
深圳
程序员
jieba中文分词源码分析(一)

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

gfsfg8545 ⋅ 2015/09/03 ⋅ 0

jieba 源码解析

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

正_午 ⋅ 2016/09/27 ⋅ 0

jieba中文分词源码分析(四)

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

gfsfg8545 ⋅ 2015/09/06 ⋅ 0

搜索引擎关键技术:中文分词技术介绍

信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google、百度等大型搜索引擎一直是人们讨论的话题。随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴巴的商...

脚本编程网站 ⋅ 2013/06/12 ⋅ 0

.NET Core中文分词组件jieba.NET Core

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

jjjyyy66 ⋅ 2017/05/15 ⋅ 0

盘古分词

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

匿名 ⋅ 2010/12/29 ⋅ 0

jieba中文分词源码分析(二)

一、jieba的使用举例 jieba的简单使用 我们根据作者的 github的例子来编写一个自己的例子,代码如下: 运行前需要安装jieba,输出结果为: 通过上面的例子可以看出,jieba分词具有三种模式: ...

gfsfg8545 ⋅ 2015/09/05 ⋅ 0

中文分词常用方法简述

中文分词 就是将一句话分解成一个词一个词,英文中可以用空格来做,而中文需要用一些技术来处理。 三类分词算法: 1. 基于字符串匹配: 将汉字串与词典中的词进行匹配,如果在词典中找到某个...

不会停的蜗牛 ⋅ 2017/10/11 ⋅ 0

ANSJ 分词 用户自定义分词加载顺序

ToAnalysis 精准分词 精准分词是Ansj分词的店长推荐款 它在易用性,稳定性.准确性.以及分词效率上.都取得了一个不错的平衡.如果你初次尝试Ansj如果你想开箱即用.那么就用这个分词方式是不会错...

学海无涯_ ⋅ 06/07 ⋅ 0

python结巴中文分词

全栈工程师开发手册 (作者:栾鹏) python教程全解 结巴中文分词 安装: 特点: 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析; 全模式,把句子中所有的可以成词的词...

luanpeng825485697 ⋅ 2017/12/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jsonrpc-4j代码解析

解析文件 AutoJsonRpcServiceImplExporter JsonServiceExporter AutoJsonRpcServiceImplExporter 路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter AutoJsonRpcServi......

郭恩洲_OSC博客 ⋅ 36分钟前 ⋅ 0

百度搜索

from selenium import webdriver import time brower=webdriver.Firefox() brower.get('http://www.baidu.com') input=brower.find_element_by_id('kw') input.send_keys('中南大学') time.s......

南桥北木 ⋅ 42分钟前 ⋅ 0

tomcat 日志记录器

1、日志记录器是记录消息的组件 日志记录器需要与某个servlet 容器相关联 2、Logger 接口 共定义了5种日志级别:FATAL、ERROR、WARNING、INFORMATION、DEBUGGER setVerbosity 设置级别 setC...

职业搬砖20年 ⋅ 44分钟前 ⋅ 0

Thrift RPC实战(三) Thrift序列化机制

1.Thrift基础架构 Thrift是一个客户端和服务端的架构体系,数据通过socket传输; 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports); 通过IDL脚本对传输数据的数据结构...

lemonLove ⋅ 44分钟前 ⋅ 0

网站建设就要像2018世界杯的俄罗斯队大杀四方[图]

今天心情不错,因为昨天晚上观看了世界杯比赛,尤其是对俄罗斯队的大杀四方感到十分霸气侧漏啊,因此我联想到了自己的博客网站,我的博客是去年年底上线的,一直想建设一个关于读书和读后感作...

原创小博客 ⋅ 53分钟前 ⋅ 0

Greenplum 三节点安装教程(非root用户)

Greenplum 三节点安装教程(非root用户) 环境准备 安装vmware,装三台centos 虚拟机设置: 主机名 IP 内存 硬盘 node1 Xxx1 2G 80G node2 Xxx2 2G 80G node3 Xxx3 2G 80G CSDN下载greenplum...

仔仔1993 ⋅ 53分钟前 ⋅ 0

linux 信号机制

signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协...

xxdd ⋅ 54分钟前 ⋅ 0

SpringWind

环境搭建和系统部署

颖伙虫 ⋅ 今天 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部