位置: 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)

  • 快速增加新浪微博粉丝的经验(新浪如何加好友)

    快速增加新浪微博粉丝的经验(新浪如何加好友)

  • 强制解除华为账号锁教程(强制解除华为账号教程)

    强制解除华为账号锁教程(强制解除华为账号教程)

  • 荣耀30的ufs是多少(荣耀30s是ufs3.0)

    荣耀30的ufs是多少(荣耀30s是ufs3.0)

  • 苹果手机显示无法下载app怎么办(苹果手机显示无服务是哪里坏了)

    苹果手机显示无法下载app怎么办(苹果手机显示无服务是哪里坏了)

  • 青春有你2会员升级版有什么区别(青春有你2会员升级版百度云)

    青春有你2会员升级版有什么区别(青春有你2会员升级版百度云)

  • 远程守护对方离线什么意思(远程守护对方会知道吗)

    远程守护对方离线什么意思(远程守护对方会知道吗)

  • 戴耳机打电话对方能听到我周围的声音吗(戴耳机打电话对方能听到我周围的杂音吗)

    戴耳机打电话对方能听到我周围的声音吗(戴耳机打电话对方能听到我周围的杂音吗)

  • 拼多多好友申请是自动的吗(拼多多好友申请已失效是什么意思)

    拼多多好友申请是自动的吗(拼多多好友申请已失效是什么意思)

  • 华为荣耀30和30s区别(华为荣耀40plus)

    华为荣耀30和30s区别(华为荣耀40plus)

  • qq删除好友后发消息还能收到吗(qq删除好友后发信息对方显示么)

    qq删除好友后发消息还能收到吗(qq删除好友后发信息对方显示么)

  • m2002j9e是什么手机(m2006j10c是啥手机)

    m2002j9e是什么手机(m2006j10c是啥手机)

  • 查看手机内存占用情况(如何查看手机内存占用量排行)

    查看手机内存占用情况(如何查看手机内存占用量排行)

  • q币充值成功如何退款(q币充值成功可以退回吗)

    q币充值成功如何退款(q币充值成功可以退回吗)

  • 苹果相机一闪一闪的怎么回事(苹果相机一闪一闪的灯)

    苹果相机一闪一闪的怎么回事(苹果相机一闪一闪的灯)

  • 多媒体技术的五大特性(多媒体技术的五种媒体是相互独立存在的对不对)

    多媒体技术的五大特性(多媒体技术的五种媒体是相互独立存在的对不对)

  • 苹果手机有秤的功能吗(苹果手机有称)

    苹果手机有秤的功能吗(苹果手机有称)

  • 爱奇艺没声音什么原因(爱奇艺没声音怎么回事)

    爱奇艺没声音什么原因(爱奇艺没声音怎么回事)

  • doc文档怎么转换word(DOC文档怎么转换成图片)

    doc文档怎么转换word(DOC文档怎么转换成图片)

  • a1474是air1还是2(a1474是ipadair几)

    a1474是air1还是2(a1474是ipadair几)

  • 4g电信卡突然上不了网(电信卡4g突然变2g怎么回事)

    4g电信卡突然上不了网(电信卡4g突然变2g怎么回事)

  • 手机上的大文件能删吗(手机上的大文件视频怎么传到电脑上)

    手机上的大文件能删吗(手机上的大文件视频怎么传到电脑上)

  • 小米cc9pro怎么更换输入法(小米cc9pro怎样)

    小米cc9pro怎么更换输入法(小米cc9pro怎样)

  • word2010怎么设置每页几行(word2010怎么设置自动保存时间间隔)

    word2010怎么设置每页几行(word2010怎么设置自动保存时间间隔)

  • 一个企业最多可申请开通几个速卖通店铺账户(一个企业最多可以申请几个速卖通账号)

    一个企业最多可申请开通几个速卖通店铺账户(一个企业最多可以申请几个速卖通账号)

  • 有线幕帘探测器是什么(有线幕帘探测器接线)

    有线幕帘探测器是什么(有线幕帘探测器接线)

  • 如何下载视频到本地(如何下载视频到电脑上)

    如何下载视频到本地(如何下载视频到电脑上)

  • 快手钱包在哪里找(快手的钱包在哪)

    快手钱包在哪里找(快手的钱包在哪)

  • 主板内部外部接口图解(主板外部接口是用来连接)

    主板内部外部接口图解(主板外部接口是用来连接)

  • win7系统怎么重装,安装操作系统问题盘点(win7系统怎么重装win10系统)

    win7系统怎么重装,安装操作系统问题盘点(win7系统怎么重装win10系统)

  • 高地牛,荷兰德伦特省 (© defotoberg/Shutterstock)(苏格兰高地牛一个萌萌哒的合集)

    高地牛,荷兰德伦特省 (© defotoberg/Shutterstock)(苏格兰高地牛一个萌萌哒的合集)

  • 兴业银行汇款手续费
  • 怎么增加资产减少负债
  • 多计提个税怎么办
  • 游戏公司收入确认方法
  • 交易性资产入账金额和入账金额区别
  • 进项税额转出是在借方还是贷方
  • 企业公益性捐赠支出税前扣除标准
  • 罚款所得税调整
  • 事业单位如何计提工资
  • 委托加工的材料计入什么科目
  • 企业的固定资产因自然灾害产生的净损失应计入哪里
  • 小规模纳税人不允许开具零税率发票
  • 用公户付了一笔款怎么办
  • 车辆保险代交车船使用税会计分录怎么写?
  • 全年一次性奖金税收优惠政策
  • 17点增值税发票能开吗
  • 已申报税额什么时候缴纳
  • 体现公司财务状况的报表
  • 在建工程完工,并当日签订出租协议的会计分录
  • 半年报利润分配是否需要审计?
  • 建筑安装预缴增值税
  • 法院强制拍卖房子流程
  • 本企业领用外购原材料进项税要转出吗
  • 收据可以入账的范围
  • 怎么激活win10密钥
  • kb4586819更新
  • Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
  • 在金税卡里面如何交社保
  • 公司收到社保局的提醒函怎么办
  • 浅谈一下新冠的好处
  • php常见的错误级别
  • 生产成本结转怎么登账
  • vue element ui
  • yolo系列的优缺点
  • 增值税专用发票丢了怎么补救
  • 哈士奇宠物狗
  • vue使用技巧
  • 免费学电脑的网站
  • 待报解预算收入待结算财政款项
  • phpcms插件
  • dedecms怎么改图片
  • mongodb $nin
  • 织梦怎么建站
  • 固定资产报废的请示
  • 工业企业会计核算中常见的会计核算程序有哪些?
  • 经营性应付项目的增加为什么调减
  • 在正确使用和正常维护的条件下
  • mysql导出用户和权限
  • 销售返利的会计分录 东奥
  • 发票超过三个月就不能开了吗
  • 旅行社差额征税全额开票和差额开票
  • 劳务派遣公司账务
  • 哪些凭证是有效凭证
  • 租房公司报销发票怎么开
  • 销项发票能不能退税
  • 金税盘维护费抵减分录
  • 待处理财产损益是备抵类科目吗
  • 银行记账本怎么填写
  • 如何建立明细分类账
  • 建账固定资产的期初科目是什么
  • 新建工业企业要考虑到什么
  • jmeter怎么连接数据库
  • win10能玩dota
  • 微软宣布9月30日停止在俄罗斯服务
  • window10打开rar文件
  • 解决ubuntu和win10关机重启界面不动
  • windows 8 build
  • Linux系统如何创建目录
  • win8一直配置更新
  • js函数命名
  • fedora开机启动版本太多
  • python制作简单图形
  • python中lxml模块
  • 税务局分局副局长什么级别的干部
  • 国家税务总局关于个人所得税有关政策问题的通知
  • 小规模纳税人怎么申报纳税
  • 如何查看自己公司的税种
  • 税务局发票邮寄回来怎么读入?
  • 现行增值税税率表2023
  • 军工企业销售模式
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设