词图生成的两种算法

词图的生成

需要稀疏2维矩阵模型,以一个词的起始位置作为行,终止位置作为列,可以得到一个二维矩阵。例如:“他说的确实在理”这句话

那么如何建立节点之间的联系呢?也就是如何找到一个词A的后续B、C、D……呢?有两种已实现的方法,一种是所谓的DynamicArray法,一种是快速offset法。

DynamicArray法

最直截了当的想法当然是用二维数组模拟这个模型了,很明显,其中有不少空洞,所以在ICT系列的分词器中定义了一个蹩脚的DynamicArray结构用来储存模型,DynamicArray结构的每个节点包含一个个词的row和col,待会儿看完offset法你就会明白我什么么说DynamicArray蹩脚。

在这张图中,行和列有一个非常有意思的关系:col为 n 的列中所有词可以与row为 n 的所有行中的词进行组合。例如“的确”这个词,它的col = 5,需要和它计算平滑值的有两个,分别是row = 5的两个词:“实”和“实在”。

连接词形成边的时候,利用上面提到的关系即可。

但是在遍历和插入的时候,需要一个个比较col和row的关系,复杂度是O(N)。

快速offset

虽然模型的表示用DynamicArray没有信息的损失,但问题是,真的需要表示模型吗?

当然不,我可以将起始offset相同的词写到一行:

始##始


的/的确
确/确实
实/实在
在/在理

末##末


这个储存起来很简单,一个一维数组,每个元素是一个单链表。

怎么知道“的确”的下一个词是什么呢?“的确”的行号是4,长度是2,4+2=6,于是第六行的两个词“实/实在”就是“的确”的后续。就这么简单。

同时这种方法速度非常快,插入和查询的时间都是O(1)

hanlp使用后者实现

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/80817859