资讯详情

Lucene FST算法

FST(Finite State Transducer)本博客不涉及算法概念,网上信息太多,写得很好。这里推荐这位网友的介绍:https://www.shenyanchao.cn/blog/2018/12/04/lucene-fst/。如果链接失效,请查看附件中的副本。本文以一个例子为基础Lucene中如何构建FST。感谢网友基于他的分享,我在看源代码时事半功倍。在此基础上,我添加了一些更接近源代码的内容。同样,关新分享的文章也在附件中。

准备工作

??先介绍几个概念,便于理解。

current[]数组

??构建FST最后生成的信息最终保存到字节数组current[]在数组中,即生成FST最终的结果是数组。

Node(节点)、Arc(弧、边)

??在下面的介绍中在下面的介绍中使用,即对无环图概念进行描述,Node之间使用Arc连接,一个Node跟Node连接。

??Node还具有两种:UnCompiledNode和CompiledNode。使用两个对象来描述这两种状态,如下所示:

图0:

??当一个输入值开始处理时,它的信息就会生成Node跟Arc,此时Node的状态为UnCompiledNode,当Node它的出度对应Arc(出边)的信息写入到current[]之后,Node状态转化为CompiledNode。 例如,图1中开始处理的输入值是mop当时,会产生4个状态UnCompiledNode的Node以及3个Arc,其中Node1的出边为arc1,以此类推。我们给出源码UnCompiledNode类的定义来理解Node跟Arc的关系:

图0-1:

图0-2:

??图0-2描述的是Arc从图0-1可以看出源代码的定义,一个状态是UnCompiledNode的Node使用Arc<T>数组描述其出度值,可见该值大于等于0,即一个状态为UnCompiledNode的Node它可以包含多个Arc。

??我们将根据需要逐一介绍图0-1和图0-2中其他变量的概念。

图1:

label、target

??基于图1,我们先介绍下图0-2Arc两个成员域:label和target,假设有输入值 “mop会用三个Arc<T>对象分别描述m”,“o”,“p三个字符的信息,三个对象是三个状态UnCompiledNode的Node的出边。描述“m”的Arc<T>对象arc1,它是Node出边,对象arc1中的label的值是 109,即“m”的ASCII值;对象arc1的target的值即Node这里暂时不讨论isFinal、nextFinalOutput后面会涉及的意思。

output

??output值是输入的附加值(payload),比如有输入值mop其附加值为100,但分别包装"m",“o”,“p”的三个arc,附加值100应该存放哪个arc的output字段呢?以下是一个例子:

 

1

例子:输入为 “mop”、“mt附加值分别为100和91。

处理“mop”, 100

图2:

??只处理输入"mop"当时,附加值放在m”的arc中。

看这里:https://www.amazingkoala.com.cn/Lucene/yasuocunchu/2019/0220/35.html

标签: 荔波智能电容器fst

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台