#string #abbreviation #statistics #name #directory

幂次系数

幂次系数是一种统计量,用于判断一个字符串是否是另一个字符串的缩写。

1个稳定版本

1.0.2 2022年12月29日
1.0.1 2022年6月28日
1.0.0 2021年10月14日

#1283 in 算法

Download history 286/week @ 2024-03-13 300/week @ 2024-03-20 338/week @ 2024-03-27 365/week @ 2024-04-03 338/week @ 2024-04-10 426/week @ 2024-04-17 306/week @ 2024-04-24 297/week @ 2024-05-01 183/week @ 2024-05-08 158/week @ 2024-05-15 156/week @ 2024-05-22 204/week @ 2024-05-29 151/week @ 2024-06-05 189/week @ 2024-06-12 169/week @ 2024-06-19 175/week @ 2024-06-26

705 每月下载量
用于 3 个crate(通过 kn

MIT 许可证

36KB
204

幂次系数

幂次系数 是一种字符串上的统计量,用于判断一个字符串是否是另一个字符串的“缩写”。函数不是对称的,因此它不是一个度量。

  • T(文本)为非空字符串。
  • P(模式)为 T 的非空子序列。
  • pP 的一个划分,且 p_i 为其元素,其中
    • 每个 p_i 都等于 T 的某个子字符串 t_i
    • 子字符串 t_i 不重叠。
    • t_i 的顺序与 p_i 相同。

幂次系数是长度最短划分 p 的元素数量减一。或者,它是子字符串 t_i 之间的间隙数量。

使用术语

  • 子字符串是由连续元素组成的子序列。子序列不一定是子字符串。例如,xzxyz 的子序列,但它不是其子字符串。
  • 序列的划分是多个两两不相交的子序列序列,当连接时等于整个原始序列。

直观解释

将模式中的所有字符取出来,同时保持原始顺序,与文本中的相同字符对齐,使字符组尽可能少。系数是这些组之间的间隙数量。

示例

P T p 幂次系数
powcoeff powierża coefficient powcoeff 1
abc a_b_c abc 2
abc abc abc 0
abc xyz 未定义

更多示例请见 测试

用例

权重系数在knnushell中用于确定哪些目录名与缩写的匹配度更高。许多其他字符串系数和指标都被认为不合适,包括莱文斯坦距离(Levenshtein distance)。莱文斯坦距离倾向于短字符串。例如,从graprogramming的莱文斯坦距离大于到gorgia的距离,尽管它并不“相似”于缩写。Powierża coefficient对于这些字符串对是0和2,因此会选择(正确地)programming

Powierża算法

该算法受到了Wagner–Fischer算法的启发。它也与最长公共子序列问题的解决方案非常相似。所有这些算法都是基于矩阵的。在Wagner-Fischer算法(WF)中存在三种类型的移动(水平、对角线和垂直),而我的算法中只有两种——水平和对角线。主要思想是,不管多长,间隙的成本总是1(在WF中,间隙的成本是其长度)。

这意味着算法必须区分由水平移动和由对角线移动填充的单元格。第一种类型的单元格包含Gap(score);第二种类型是Continuation(score)。如果原始单元格包含Gap(score),则水平移动会产生Gap(score);如果原始单元格包含Continuation(score),则会产生Gap(score + 1)。算法倾向于产生较低分数的移动,如果对角线移动和水平移动产生相同的分数,则偏好对角线移动。

  1. 创建一个行数为m、列数为n的矩阵m,其中mS的长度,nP的长度。n必须小于或等于m。每个单元格可以是空的(这是初始状态)或包含Gap(score)Continuation(score)

  2. 从左到右、从上到下填充矩阵。第一行是特殊的——如果S的第xth个元素和P的第yth个元素相等,则第xth和第yth个单元格设置为Continuation(0)。否则,设置为Gap(score + cost),其中score是左侧邻居的分数。如果其左侧邻居是空的,则该单元格也保持为空。

  3. 其他单元格的填充规则如下

    xa的左上邻居,y为其左邻居

    x _
    y a
    

    斜向移动的成本为0,但只有在Sxth元素和Pyth元素相等,并且x不为空时才能进行这种移动。移动后,a被设置为Continuation(score),其中scorex的分数。

    如果y包含Gap,则水平移动的成本为0;如果包含Continuation,则成本为1。这种移动只有在y不为空时才能进行。移动后,a被设置为Gap(score + cost),其中scorey的分数。

    • 如果没有可用移动,则保持a为空。
    • 如果只有一个可用移动,则执行它。
    • 如果有两个可用移动且它们的分数相等,则执行水平移动。
    • 如果有两个可用移动且它们的分数不相等,则执行分数最低的移动。
  4. 幂次系数是最后一行的最小值。在某些情况下,最后一行没有值,因此系数未定义。

示例

带有G的单元格是通过水平移动填充的,而带有C的单元格是通过斜向移动填充的。字母旁边的数字是单元格的分数。红色单元格由于优化而被跳过。黄色单元格被留空。系数是2。

image

基准测试

在作者计算机上运行的基准测试中,该算法与strsimlevenshtein进行了比较

  • Levenshtein距离:[1.2908 µs 1.2946 µs 1.2987 µs]
  • 幂次系数:[1.7718 µs 1.7748 µs 1.7778 µs]

没有运行时依赖