位置: IT常识 - 正文

Darts, 双数组Trie 文字处理技术 STPDomain Powered by Discuz!(双重数组)

编辑:rootadmin
Darts, 双数组Trie - 文字处理技术 - STPDomain - Powered by Discuz!Darts, 双数组Trie - 文字处理技术 - STPDomain - Powere

推荐整理分享Darts, 双数组Trie 文字处理技术 STPDomain Powered by Discuz!(双重数组),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:双数组trie树,双数组trie算法解析,dart多维数组,双数组排序,双数组排序,dart 二维数组,双数组数据结构,双数组数据结构,内容如对您有帮助,希望把文章链接给更多的朋友!

Darts, 双数组Trie - 文字处理技术 - STPDomain - Powered by Discuz!

2011-05-19|阅:118转:0|分享腾讯空间人人网开心网新浪微博腾讯微博搜狐空间推荐给朋友举报

双数组trie树的基本构造及简单优化

一、 基本构造

Trie树是搜索树的一种,来自英文单词"Retrieval"的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实现。它本 质上是一个确定的有限状态自动机(DFA),每个节点代表自动机的一个状态。在词典中这此状态包括"词前缀","已成词"等。

双 数组Trie(Double-Array Trie)是trie树的一个简单而有效的实现,由两个整数数组构成,一个是base[],另一个是check[]。设数组下标为i ,如果base,check均为0,表示该位置为空。如果base为负值,表示该状态为词语。Check表示该状态的前一状态,t=base+a, check[t]=i 。

复制代码

下 面举例(源自<<双数组Trie(Double-Array Trie)的数据结构与具体实现>>)来说明用双数组Trie(Double-Array Trie)构造分词算法词典的过程。假定词表中只有“啊,阿根廷,阿胶,阿拉伯,阿拉伯人,埃及”这几个词,用Trie树可以表示为:

我 们首先对词表中所有出现的10个汉字进行编码:啊-1,阿-2,唉-3,根-4,胶-5,拉-6,及-7,廷-8,伯-9,人-10。。对于每一个汉字, 需要确定一个base值,使得对于所有以该汉字开头的词,在双数组中都能放下。例如,现在要确定“阿”字的base值,假设以“阿”开头的词的第二个字序 列码依次为a1,a2,a3……an,我们必须找到一个值i,使得 base[i+a1],check[i+a1],base[i+a2],check[i+a2]……base[i+an],check[i+an]均为 0。一旦找到了这个i,“阿”的base值就确定为i。用这种方法构建双数组Trie(Double-Array Trie),经过四次遍历,将所有的词语放入双数组中,然后还要遍历一遍词表,修改base值。因为我们用负的base值表示该位置为词语。如果状态i对 应某一个词,而且Base=0,那么令Base=(-1)*i,如果Base的值不是0,那么令Base=(-1)*Base。得到双数组如下:

复制代码下标 1234567891011121314Base-14400004-94-11-12-4-14Check0000000222381013词缀啊阿埃阿根阿胶阿拉埃及阿根廷阿拉伯阿拉伯人用 上述方法生成的双数组,将“啊”,“阿”,“埃”,“阿根”,“阿拉”,“阿胶”,“埃及”,“阿拉伯”,“阿拉伯人”,“阿根廷”均视为状态。每个状态 均对应于数组的一个下标。例如设“阿根”的下标为i=8,那么check的内容是“阿”的下标,而base是“阿根廷”的下标的基值。“廷”的序列码为 x=8,那么“阿根廷”的下标为base+x=base[8]+8=12。

复制代码

二、 基本操作与存在问题

1, 查询

trie树的查询过程其实就是一个DFA的 状态转移过程,在双数组中实现起来比较简单:只需按照状态标志进行状态转移即可.例如查询“阿根廷”,先根据“阿”的序列码b=2,找到状态“阿”的下标 2,再根据“根”的序列码d=4找到“阿根”的下标base+d=8,同时根据check[base+d]=b,表明“阿根”是某个词的一部分,可以继续 查询。然后再找到状态“阿根廷”。它的下标为y=12,此时base[y]<0,check[y]=base+d=8,表明“阿根廷”在词表中,查 询完毕。Darts, 双数组Trie  文字处理技术  STPDomain  Powered by Discuz!(双重数组)

复制代码

查询过程中我们可以看到,对于一个词语的查询时间是只与它的长度相关的,也就是说它的时间复杂度为O(1).在汉语中,词语以单字词,双字词居多,超过三字的词语少之又少.因此,用双数组构建的trie树词典查询是理论上中文机械分词中的最快实现。

2, 插入与删除 双数组的缺点在于:构造调整过程中,每个状态都依赖于其他状态,所以当在词典中插入或删除词语的时候,往往需要对双数组结构进行全局调整,灵活性能较差。

将一个词语插入原有的双数组trie树中,相当于对DFA增加一个状态。首先我们应根据查询方法找出该状态本应所处的位置,如果该位置为空,那好办,直接 插入即可。如果该位置不为空。那么我们只好按照构造时一样的方法重新扫描得出该状态已存在的最大前缀状态的BASE值,并由此依次得出该状态后继结点的 BASE值。在这其中还要注意CHECK值的相应变化。

例如说,如果"阿拉根"某一天也成为了一个词,我们要在trie树中插入这一状态。按计算它的位置应在8,但8是一个已成状态.所以我们得重新确定"阿 拉"这一最大已成前缀状态的BASE值.重新扫描得出BASE[10]=11。这样状态15为"阿拉根",且BASE[15]为负(成 词),CHECK[15]=10;状态20为"阿拉佰",且BASE[20]=-4,CHECK=10。

这样的处理其实是非常耗时间的,因为得依次对每一个可能BASE值进行扫描来进行确定最大已成前缀状态的BASE值。这个确定过程在构造时还是基本可以忍 受的,毕竟你就算用上一,两天来构造也没有问题(只要你构造完后可以在效运行即可)。但在插入比较频繁时,如果每次都需要那么长的运行时间,那确实是无法 忍受的。

双数组删除实现比较简单,只需要将删除词语的对应状态设为空即可――即BASE值,CHECK均为设0。但它存在存在一个空间效率的问题.例如,当我们在 上面删除"埃及"这一词语时,状态11被设为空。而状态10则成了一个无用结点――它不成词,而且在插入新词时也不可重用。所以,随着删除的进行,空状态 点和无用状态点不断增多,空间的利用率会不断的降低。

三、 简单优化

优化的基本思路是将双数组trie树构建为一种动态检索方法,从而解决插入和删除所存在的问题。

1, 插入优化 在插入需要确定新的BASE值时,我们是只需要遍历空状态的。非空状态的出现意味着某个BASE值尝试的打败,我们可以完全不必理会。所以,我们可以对所有的空状态构建一个序列,在确定BASE值时只需要扫描该序列即可。 对双数组中的空状态的递增结点r1,r2, …, rm,我们可以这样构建这一空序列: CHECK[ri]=?ri+1 (1 i m?1), CHECK[rm]=?(DA_SIZE+1) 其中r1= E_HEAD,为第一个空值状态对应的索引点。这样我们在确定BASE值时只需扫描这一序列即可。这样就省去了对非空状态的访问时间。

这种方法在空状态并不太多的情况下可以很大程度的提高插入速度。

2, 删除优化 1) 无用结点 对于删除叶结点时产生的无用结点,可以通过依次判断将它们置为空,使得可在插入新词时得以重用。例如,如果我们删除了上例中的"阿根廷",可以看到"阿根"这一状态没有子状态,因此也可将它置为空。而"阿"这一状态不能置空,因为它还有两个子状态。

2) 数组长度的压缩 在删除了一个状态后,数组末尾可能出现的连续空状态我们是可以直接删除的。另外我们还可以重新为最大非空索引点的状态重新确定BASE值,因为它有可能已经由于删除的进行而变小。这们我们可能又得以删除一些空值状态。

本文链接地址:https://www.jiuchutong.com/zhishi/310290.html 转载请保留说明!

上一篇:WordPress 去掉留言中的网址字段(wordpress如何删除导入的主题)

下一篇:WordPress配置谷歌分析(Google Analytics)和Search Console(GSC)教程(wordpress部署到github)

  • 钉钉怎么设置不让别人看名片(钉钉怎么设置不自动打卡)

    钉钉怎么设置不让别人看名片(钉钉怎么设置不自动打卡)

  • 苹果11按键音怎么设置(苹果11按键音怎么没有了)

    苹果11按键音怎么设置(苹果11按键音怎么没有了)

  • 怎么对齐word文档中每一行的文字(怎么对齐word文档中的名字)

    怎么对齐word文档中每一行的文字(怎么对齐word文档中的名字)

  • 照片无法分享到微信怎么办(照片无法分享怎么办)

    照片无法分享到微信怎么办(照片无法分享怎么办)

  • 剪映无法识别人声字幕(剪映无法识别人声)

    剪映无法识别人声字幕(剪映无法识别人声)

  • 登录提示用户名不存在(登录时为什么显示用户名失效)

    登录提示用户名不存在(登录时为什么显示用户名失效)

  • 三星有双系统吗(三星有双系统么)

    三星有双系统吗(三星有双系统么)

  • 华为gt2e什么时候开售(华为gt2e发售价)

    华为gt2e什么时候开售(华为gt2e发售价)

  • 节能器真的可以省电吗(节能器是干什么用的)

    节能器真的可以省电吗(节能器是干什么用的)

  • 华为nova6se怎么唤醒小艺(华为nova6se怎么关闭纯净模式)

    华为nova6se怎么唤醒小艺(华为nova6se怎么关闭纯净模式)

  • 苹果手机锁屏后老是自己亮了(苹果手机锁屏后微信来消息没声音怎么办)

    苹果手机锁屏后老是自己亮了(苹果手机锁屏后微信来消息没声音怎么办)

  • kiwtl00华为什么型号(klwtl00华为什么型号)

    kiwtl00华为什么型号(klwtl00华为什么型号)

  • word行间距设置(word行间距设置为25磅)

    word行间距设置(word行间距设置为25磅)

  • 微信充值为什么扣手续(微信充值为什么显示交易异常)

    微信充值为什么扣手续(微信充值为什么显示交易异常)

  • 微信红包右下角显示公司名称(微信红包右下角改名字)

    微信红包右下角显示公司名称(微信红包右下角改名字)

  • 苹果11pro max第一次充电需要注意什么(苹果11pro max第一批和第二批)

    苹果11pro max第一次充电需要注意什么(苹果11pro max第一批和第二批)

  • 手机放在床头的危害(手机放在床头有什么危害)

    手机放在床头的危害(手机放在床头有什么危害)

  • 华为手机变慢如何处理(华为手机变慢如何解决)

    华为手机变慢如何处理(华为手机变慢如何解决)

  • 抖音怎么加购物车橱窗(抖音怎么加购物团灯牌呢)

    抖音怎么加购物车橱窗(抖音怎么加购物团灯牌呢)

  • 无线网需要认证怎么解决(无线网需要认证登录怎么操作)

    无线网需要认证怎么解决(无线网需要认证登录怎么操作)

  • 华为手机显示hd怎么取消(华为手机显示hd2怎么关闭)

    华为手机显示hd怎么取消(华为手机显示hd2怎么关闭)

  • 监控多长时间自动删除(监控多长时间自动消失)

    监控多长时间自动删除(监控多长时间自动消失)

  • 华为nove5耳机孔在哪里(华为nova5ipro耳机孔)

    华为nove5耳机孔在哪里(华为nova5ipro耳机孔)

  • Salzburg with Salzach river, Austria (© MacEaton/Alamy)

    Salzburg with Salzach river, Austria (© MacEaton/Alamy)

  • River Avon in Bath, England (© Robert Harding World Imagery/Offset by Shutterstock)

    River Avon in Bath, England (© Robert Harding World Imagery/Offset by Shutterstock)

  • 基于URLOS快速安装Discuz论坛(urlparse安装)

    基于URLOS快速安装Discuz论坛(urlparse安装)

  • 常用类.String类(类型string)

    常用类.String类(类型string)

  • 增值税电子发票可以作废吗
  • 超过小规模纳税人
  • 增值税发票认证在哪里
  • 代扣代缴个人所得税账务处理
  • 招聘预算费用包括哪些预算清单
  • 小规模纳税人税率有几种
  • 个人如何开现金账户
  • 缴纳社保的基数是什么意思
  • 外商投资企业的组织形式,组织机构
  • 企业自建固定资产
  • 固定报销额度算工资吗
  • 把扣款挂到其它应收款的会计分录怎么做?
  • 特殊销售方式的计税依据
  • 收到保险公司财产理赔款怎么做账
  • 航天发票上传不成功怎么手动上传
  • 营改增后固定资产进项税抵扣规定
  • 公司与银行签订的远期合约汇率是什么
  • 公司还没有成立,前期的费用怎么开发票呢
  • 环保税是甲方交的吗
  • 公积金多交退回怎么申报个税
  • 一般纳税人出售不动产增值税税率是多少
  • 企业空气检测费应该计入什么会计科目核算?
  • 商誉减值测试的方法有哪些
  • 转让二手宾馆需要注意事项
  • 苹果macbookpro分辨率是多少
  • cookie 区别
  • 如何看待税收的本质
  • linux编译驱动文件
  • windows环境下,ping的功能和使用方法
  • 山上覆盖着皑皑白雪
  • 深入理解llvm
  • html的网址
  • 坏账准备税收调整
  • 一觉醒后浑身酸痛
  • 自动驾驶汽车决策与控制pdf
  • ajax提交表单数据
  • python合并多个excel
  • 公司注册资金减资要交税吗
  • 兼职算受雇吗
  • mongodb查看数据库大小
  • 平价转让股权怎么做账
  • 分成收入计入什么科目
  • 公积金怎么推出工资
  • 应收账款余额百分比法怎么算
  • SQL高级应用之同服务器上复制表到另一数据库中并实现去重复
  • 农机合作社项目申报方案
  • 金税四期可以查到闭环开票信息吗
  • 研发支出资本化计入什么科目
  • 小规模纳税人企业所得税2023
  • 工商年报纳税总额包括个人所得税吗
  • 汇算清缴需要传票么
  • 企业广告费以后会涨吗
  • 增值税零税率发票怎么开
  • 出口视同内销账务处理?
  • 农产品免税收入需要缴纳所得税吗
  • 小规模纳税人增值税专用发票税率
  • 利润分配未分配利润账务处理
  • 税前扣除项目主要包括
  • 一般纳税人的进项税率是多少
  • 现金支票取现的法律规定
  • 银行承兑汇票托收凭证
  • 发票专用章刻制
  • sql server2012操作步骤
  • win8.1升级到win10
  • vista sp2 旗舰版 key
  • solaris ssh offline
  • 升级ubuntu
  • info.exe病毒
  • Linux系统中sort排序命令的使用教程
  • linux的run目录放什么文件
  • pptd40nt.exe是什么进程 有什么用 pptd40nt进程查询
  • cocos2dx入门
  • android viewpager
  • js设计原则
  • 深入理解javascript特性
  • 怎么将安卓
  • 江西电子税务局官网
  • 个人外汇收入申报
  • 南京电费余额查询
  • 税务局科员是什么职业
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设