我可以使用什么指标来计算标签之间的距离?

机器算法验证 公制
2022-04-06 22:20:40

假设我们有一组相同长度的标签,我们需要找到它们之间的距离。

在二进制标签的情况下,可以使用汉明距离。例如,如果,则l1=01101l2=00111d(l1,l2)=2

在我的例子中,标签是由字母形成的,所以字母的长度是,每个标签的长度是A={a,b,c,d,e}|A|=5n=4

就我而言,序数比例适用于字母中的字母:A

a<b<c<d<e.

标签示例:deed, aaaa, aaad, aaae, dada, cccd.

编辑。三个标签的卷边距离aaaa,给出但我正在寻找一个可以区分并返回的度量因为aaadaaae

d(aaaa,aaad)=d(aaaa,aaae)
de
d(aaaa,aaad)<d(aaaa,aaae)
d<e

编辑 2。

为了创建标签,我们使用阈值个元素应用下一个函数 最后,我们使用连接运算符,例如TRiX=(x1,x2,,xn)

f(xi)={a,xiT,b,T<xi0,c,xi=0,d,0<xiT,e,xi>T. 
&a&a&a&a=aaaa

问题。我可以使用什么指标来计算标签之间的距离?

4个回答

这真的取决于你指的是什么样的词。我想谈两个距离:

  1. 编辑距离

    如果您希望根据两个序列的不同程度来捕捉差异,您可以使用levenshtein distanceDamerau-Levenshtein distance在数学上,对于单词转换为单词的最少移动/操作数当您将单词定义为字母序列时,这就是您可能正在寻找的内容。ABAB

  2. 上下文相似度

    对于单词,我们还可以讨论每个单词的上下文含义。如果这两个词是相关的或具有相似的含义,那么我们期望这个度量很小。这可以用 word2vec 来实现。基本上我们以无监督的方式训练我们的模型,并将它的向量化表示,我们通过比较两个向量来测量距离。测量距离最流行的方法是使用余弦相似度。

这两个距离彼此不相关。比如deed和deer,编辑距离很小(实际上等于1),但是相似度距离会很大,因为这两个词不相关。

编辑:由于提问者解释了他的具体情况。

您可以考虑使用Earth Mover's/Wasserstein distance

这是我的想法,你可以如何处理这个问题。假设您希望对每个字母进行排序,使得并且您的字母上有 3 个单词。假设您有一个单词,对于 3 个字母,让还让成为字母和任意值之间的键值映射,并且应该反映您的排序。a<b<c<d<eabct1=0,t2=1,t3=2w1=a,w2=b,w3=cT

f(x)={T(wi),tix<ti+1,0,otherwise
请原谅我对符号的不良使用,但想法是(如果我们让)例如,您有一个函数,其值为 for然后的值现在您可以将其视为非标准化分布,您可以计算推土机/wasserstein 距离。这只是一些随机的想法,但可能不一定有意义。T(a)=0.8T(b)=1.5f(x)=0.8x[0,1]f(x)=1.5x[1,2]

这是一个有用的链接

您仍然可以使用5 个字母的汉明距离您可以使用的另一个指标是Levenshtein 距离- 将一个单词更改为另一个单词所需的最小单字符编辑次数。

如果您的字母顺序有一些含义,例如 a 和 c 之间的距离大于 a 和 b 之间的距离,那么您可以使用诸如欧几里得距离之类的度量。

在我看来,您可能正在寻找绝对差异的简单总和(也称为L1 距离)。

假设我们可以将您的序数关系扩展为度量(例如等),那么您可以让两者之间的差异相同长度的单词是相同位置符号的绝对差之和。a<b<c<d<eba=cb=1ea=4

例如,abcdedcb=|ae|+|bd|+|cc|+|db|=4+2+0+2=8

在两个符号的字母表中,这与汉明距离相同,并且与汉明距离一样,它没有任何上下文或换位的概念之间的距离为 8,就像aaeaaeaaaaaacccc

通常,当人们谈论单词相似度时,他们指的是 Yohanes Alfredo 的回答。

在您的情况下,您需要考虑字符的排序顺序。在这种情况下,霍布斯可能有您需要的答案。

你想根据单词的整体排序顺序找到距离吗?换句话说,您是否想要 因为在字典中以相同字母开头的单词比其他字母不同的单词更接近?

d(aaaa,aaad)<d(aaaa,daaa)

如果是这样,那么您最好使用以下算法计算每个单词的值,该算法考虑到单词中字母的位置。

initially set value1 = 0
for i in 1 to length:
    value1 = value1 + (alphabetSize ^ i) * letters1[length - i]
initially set value2 = 0
for i in 1 to length:
    value2 = value2 + (alphabetSize ^ i) * letters2[length - i]
distance = abs(value1 - value2)

这样做的目的是将每个单词视为以基本字母大小写的数字。

我很抱歉用伪代码写了这个。使用带有大写 Sigma 的数学符号会更清楚,但我不知道我的排版方式。