将任意字符串映射到RGB值

时间:2009-01-30 14:27:37

标签: algorithm colors string-metric

我有一大堆任意自然语言字符串。对于我分析它们的工具,我需要将每个字符串转换为唯一的颜色值(RGB或其他)。我需要颜色对比度来依赖于字符串相似性(字符串与其他字符串不同,它们各自的颜色应该不同)。如果我总是为同一个字符串获得相同的颜色值,那将是完美的。

有关如何解决此问题的任何建议吗?

更新字符串之间的距离

我可能需要将“相似性”定义为类似Levenstein的距离。不需要自然语言解析。

那是:

"I am going to the store" and 
"We are going to the store"

类似。

"I am going to the store" and 
"I am going to the store today"

类似(但略少)。

"I am going to the store" and 
"J bn hpjoh up uif tupsf"

完全不相似。

(谢谢,Welbog!)

我可能会知道完全只有当我看到程序输出时才需要什么距离函数。所以让我们从简单的事情开始吧。

任务简化更新

我删除了自己的建议,将任务分成两部分 - 绝对距离计算和颜色分布。这不会很好,因为我们首先将尺寸信息减少到一个维度,然后尝试将其合成到三维。

8 个答案:

答案 0 :(得分:3)

您需要详细说明“类似字符串”的含义,以便提出适当的转换功能。是字符串

 "I am going to the store" and 
"We are going to the store" 

认为类似?怎么样的字符串

 "I am going to the store" and 
"J bn hpjoh up uif tupsf" 

(原始+1中的所有字母)或

 "I am going to the store" and 
"I am going to the store today"

?根据“类似”的含义,您可能会考虑不同的功能。

如果差异可以仅基于字符的值(在Unicode或它们来自的任何空间中),那么您可以尝试将值相加并将结果用作HSV空间的色调。如果使用较长的字符串会导致颜色更加不同,您可以考虑按字符串中的位置对字符进行称重。

如果差异更复杂,例如某些字母或单词的出现,则需要识别这一点。如果您的域名中包含很多这些值,也许您可​​以根据字符串中的Es,Ss和Rs数来决定红色,绿色和蓝色值。或者根据元音与韵母的比例或音节的单词选择一种色调。

有许多不同的方法可以解决这个问题,但最好的方法实际上取决于“类似”字符串的含义。

答案 1 :(得分:2)

听起来你想要某种哈希。它不需要是安全的(因此不像MD5或SHA那么复杂),但需要遵循:

char1 + char2 + char3 + ... + charN % MAX_COLOUR_VALUE

只是简单的第一步。你也可以做更好的事情,让每个角色充当R,G和B的'振幅'(e可以是+ 1R,+ 2G和-4B等),然后简单地将所有值加起来一个字符串...将它们夹在最后,你有一种方法可以将任意长度的字符串转换成颜色作为“颜色散列”的过程。

答案 2 :(得分:1)

首先,您需要选择一种测量字符串相似性的方法。 Minimal edit distance是传统的,但不足以对字符串进行良好排序,如果您希望每次都为相同的字符串分配相同的颜色,那么这就是您所需要的 - 也许您可以按字母距离对编辑成本进行加权。如果您所追求的是语言中的相似性而不是书面形式(如果是这样,首先考虑词干/ soundex传递),或者其他一些“相似性”的感觉,那么最小编辑距离本身可能不是非常有用。

然后,您需要选择一种基于该指标遍历可见颜色空间的方法。考虑使用HSL or HSV colour representation可能会有所帮助 - 然后算法可以变得简单到选择一个起始色调并遍历排序的语料库,将当前色调分配给每个字符串,然后将字符串与前一个字符串的差异抵消。

答案 3 :(得分:1)

你永远不会得到两个颜色相同的不同字符串有多重要?

如果它不重要那么也许这可行吗?

您可以选择与圆圈“同伦”的1维颜色空间:假设在c(x)x之间为0定义了颜色函数1。然后你想要c(0) == c(1)

现在,您将所有字符值的总和取为一些缩放因子的模数并将其包装回颜色空间:

c( (SumOfCharValues(word) modulo ScalingFactor) / ScalingFactor )

如果您定义了更高维度的“包装”颜色空间并且每个维度选择不同的SumOfCharValues函数,这可能会更好;有人建议交替总和和长度。

只是一个想法...... HTH

答案 4 :(得分:1)

这是我的建议(我认为这个算法有一个通用名称,但我太累了,不记得了):

您希望将每个字符串转换为3D点节点(r,g,b)(您可以缩放值以使它们适合您的范围),以便最大限度地减少以下错误:

Error = \sum_i{\sum_j{(dist(node_i, node_j) - dist(str_i, str_j))^2}}

你可以这样做:

  1. 首先为每个字符串分配一个随机颜色(r,g,b)
  2. 重复直到您认为合适(例如,错误调整小于\ epsilon = 0.0001):
    1. 选择一个随机节点
    2. 调整它的位置(r,g,b),使误差最小化
  3. 缩放坐标系,使每个节点坐标的范围为[0.,1。]或[0,256]

答案 5 :(得分:1)

您可以使用MinHash或其他LSH method之类的内容,并将相似性定义为shingles测量的Jaccard coefficient集合之间的交集。 Rajaraman和Ullman在Mining of Massive data sets, Ch.3中有一个很好的描述。

答案 6 :(得分:0)

我可能会在两个字符串之间定义一些delta。我不知道你定义的是两个字符串的区别(或“不等式”),但我能想到的最明显的事情是字符串长度和特定字母的出现次数(及其在字符串中的索引) 。实现它不应该是棘手的,它会在相同的字符串中返回相同的颜色代码(如果你先做相同的颜色代码,并在进一步比较之前返回)。

当谈到实际的RGB值时,我会尝试将字符串数据转换为4字节(RGBA),如果只使用RGB,则会转换为3字节。我不知道每个字符串是否适合它们(因为这可能是语言特定的?)。

答案 7 :(得分:0)

很抱歉,但是你不能用levenshtein距离或类似的东西来做你正在寻找的东西。 RGB和HSV是三维几何空间,但是levenshtein距离描述了一个度量空间 - 一组松散的约束,没有固定数量的维度。没有办法将度量空间映射到固定数量的维度,同时始终保留局部性。

就近似值而言,对于单个术语,您可以使用soundex或metaphone等算法的修改来选择颜色;例如,对于多个术语,您可以单独对每个单词应用soundex或metaphone,然后将它们相加(溢出)。